test_policy.c 108 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740
  1. /* Copyright (c) 2013-2019, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define CONFIG_PRIVATE
  4. #define POLICIES_PRIVATE
  5. #include "core/or/or.h"
  6. #include "app/config/config.h"
  7. #include "core/or/circuitbuild.h"
  8. #include "core/or/policies.h"
  9. #include "feature/dirparse/policy_parse.h"
  10. #include "feature/hs/hs_common.h"
  11. #include "feature/hs/hs_descriptor.h"
  12. #include "feature/relay/router.h"
  13. #include "lib/encoding/confline.h"
  14. #include "test/test.h"
  15. #include "test/log_test_helpers.h"
  16. #include "core/or/addr_policy_st.h"
  17. #include "core/or/extend_info_st.h"
  18. #include "core/or/port_cfg_st.h"
  19. #include "feature/nodelist/node_st.h"
  20. #include "feature/nodelist/routerinfo_st.h"
  21. #include "feature/nodelist/routerstatus_st.h"
  22. /* Helper: assert that short_policy parses and writes back out as itself,
  23. or as <b>expected</b> if that's provided. */
  24. static void
  25. test_short_policy_parse(const char *input,
  26. const char *expected)
  27. {
  28. short_policy_t *short_policy = NULL;
  29. char *out = NULL;
  30. if (expected == NULL)
  31. expected = input;
  32. short_policy = parse_short_policy(input);
  33. tt_assert(short_policy);
  34. out = write_short_policy(short_policy);
  35. tt_str_op(out, OP_EQ, expected);
  36. done:
  37. tor_free(out);
  38. short_policy_free(short_policy);
  39. }
  40. /** Helper: Parse the exit policy string in <b>policy_str</b> with
  41. * <b>options</b>, and make sure that policies_summarize() produces the string
  42. * <b>expected_summary</b> from it when called with family. */
  43. static void
  44. test_policy_summary_helper_family_flags(const char *policy_str,
  45. const char *expected_summary,
  46. sa_family_t family,
  47. exit_policy_parser_cfg_t options)
  48. {
  49. config_line_t line;
  50. smartlist_t *policy = smartlist_new();
  51. char *summary = NULL;
  52. char *summary_after = NULL;
  53. int r;
  54. short_policy_t *short_policy = NULL;
  55. int success = 0;
  56. line.key = (char*)"foo";
  57. line.value = (char *)policy_str;
  58. line.next = NULL;
  59. r = policies_parse_exit_policy(&line, &policy,
  60. options, NULL);
  61. tt_int_op(r,OP_EQ, 0);
  62. summary = policy_summarize(policy, family);
  63. tt_ptr_op(summary, OP_NE, NULL);
  64. tt_str_op(summary,OP_EQ, expected_summary);
  65. short_policy = parse_short_policy(summary);
  66. tt_assert(short_policy);
  67. summary_after = write_short_policy(short_policy);
  68. tt_str_op(summary,OP_EQ, summary_after);
  69. success = 1;
  70. done:
  71. /* If we don't print the flags on failure, it's very hard to diagnose bugs */
  72. if (!success)
  73. TT_DECLARE("CTXT", ("\n IPv%d\n Options: %x\n Policy: %s",
  74. family == AF_INET ? 4 : 6, options, policy_str));
  75. tor_free(summary_after);
  76. tor_free(summary);
  77. if (policy)
  78. addr_policy_list_free(policy);
  79. short_policy_free(short_policy);
  80. }
  81. /** Like test_policy_summary_helper_family_flags, but tries all the different
  82. * flag combinations */
  83. static void
  84. test_policy_summary_helper_family(const char *policy_str,
  85. const char *expected_summary,
  86. sa_family_t family)
  87. {
  88. for (exit_policy_parser_cfg_t opt = 0;
  89. opt <= EXIT_POLICY_OPTION_ALL;
  90. opt++) {
  91. if (family == AF_INET6 && !(opt & EXIT_POLICY_IPV6_ENABLED))
  92. /* Skip the test: IPv6 addresses need IPv6 enabled */
  93. continue;
  94. if (opt & EXIT_POLICY_REJECT_LOCAL_INTERFACES)
  95. /* Skip the test: local interfaces are machine-specific */
  96. continue;
  97. test_policy_summary_helper_family_flags(policy_str, expected_summary,
  98. family, opt);
  99. }
  100. }
  101. /** Like test_policy_summary_helper_family, but uses expected_summary for
  102. * both IPv4 and IPv6. */
  103. static void
  104. test_policy_summary_helper(const char *policy_str,
  105. const char *expected_summary)
  106. {
  107. test_policy_summary_helper_family(policy_str, expected_summary, AF_INET);
  108. test_policy_summary_helper_family(policy_str, expected_summary, AF_INET6);
  109. }
  110. /** Like test_policy_summary_helper_family, but uses expected_summary4 for
  111. * IPv4 and expected_summary6 for IPv6. */
  112. static void
  113. test_policy_summary_helper6(const char *policy_str,
  114. const char *expected_summary4,
  115. const char *expected_summary6)
  116. {
  117. test_policy_summary_helper_family(policy_str, expected_summary4, AF_INET);
  118. test_policy_summary_helper_family(policy_str, expected_summary6, AF_INET6);
  119. }
  120. /** Run unit tests for generating summary lines of exit policies */
  121. static void
  122. test_policies_general(void *arg)
  123. {
  124. int i;
  125. smartlist_t *policy = NULL, *policy2 = NULL, *policy3 = NULL,
  126. *policy4 = NULL, *policy5 = NULL, *policy6 = NULL,
  127. *policy7 = NULL, *policy8 = NULL, *policy9 = NULL,
  128. *policy10 = NULL, *policy11 = NULL, *policy12 = NULL;
  129. addr_policy_t *p;
  130. tor_addr_t tar, tar2;
  131. smartlist_t *addr_list = NULL;
  132. config_line_t line;
  133. smartlist_t *sm = NULL;
  134. char *policy_str = NULL;
  135. short_policy_t *short_parsed = NULL;
  136. int malformed_list = -1;
  137. (void)arg;
  138. policy = smartlist_new();
  139. p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*", -1,
  140. &malformed_list);
  141. tt_ptr_op(p, OP_NE, NULL);
  142. tt_int_op(ADDR_POLICY_REJECT,OP_EQ, p->policy_type);
  143. tor_addr_from_ipv4h(&tar, 0xc0a80000u);
  144. tt_int_op(0,OP_EQ, tor_addr_compare(&p->addr, &tar, CMP_EXACT));
  145. tt_int_op(16,OP_EQ, p->maskbits);
  146. tt_int_op(1,OP_EQ, p->prt_min);
  147. tt_int_op(65535,OP_EQ, p->prt_max);
  148. smartlist_add(policy, p);
  149. tor_addr_from_ipv4h(&tar, 0x01020304u);
  150. tt_assert(ADDR_POLICY_ACCEPTED ==
  151. compare_tor_addr_to_addr_policy(&tar, 2, policy));
  152. tor_addr_make_unspec(&tar);
  153. tt_assert(ADDR_POLICY_PROBABLY_ACCEPTED ==
  154. compare_tor_addr_to_addr_policy(&tar, 2, policy));
  155. tor_addr_from_ipv4h(&tar, 0xc0a80102);
  156. tt_assert(ADDR_POLICY_REJECTED ==
  157. compare_tor_addr_to_addr_policy(&tar, 2, policy));
  158. tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy2,
  159. EXIT_POLICY_IPV6_ENABLED |
  160. EXIT_POLICY_REJECT_PRIVATE |
  161. EXIT_POLICY_ADD_DEFAULT, NULL));
  162. tt_assert(policy2);
  163. tor_addr_from_ipv4h(&tar, 0x0306090cu);
  164. tor_addr_parse(&tar2, "[2000::1234]");
  165. addr_list = smartlist_new();
  166. smartlist_add(addr_list, &tar);
  167. smartlist_add(addr_list, &tar2);
  168. tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy12,
  169. EXIT_POLICY_IPV6_ENABLED |
  170. EXIT_POLICY_REJECT_PRIVATE |
  171. EXIT_POLICY_ADD_DEFAULT,
  172. addr_list));
  173. smartlist_free(addr_list);
  174. addr_list = NULL;
  175. tt_assert(policy12);
  176. policy3 = smartlist_new();
  177. p = router_parse_addr_policy_item_from_string("reject *:*", -1,
  178. &malformed_list);
  179. tt_ptr_op(p, OP_NE, NULL);
  180. smartlist_add(policy3, p);
  181. p = router_parse_addr_policy_item_from_string("accept *:*", -1,
  182. &malformed_list);
  183. tt_ptr_op(p, OP_NE, NULL);
  184. smartlist_add(policy3, p);
  185. policy4 = smartlist_new();
  186. p = router_parse_addr_policy_item_from_string("accept *:443", -1,
  187. &malformed_list);
  188. tt_ptr_op(p, OP_NE, NULL);
  189. smartlist_add(policy4, p);
  190. p = router_parse_addr_policy_item_from_string("accept *:443", -1,
  191. &malformed_list);
  192. tt_ptr_op(p, OP_NE, NULL);
  193. smartlist_add(policy4, p);
  194. policy5 = smartlist_new();
  195. p = router_parse_addr_policy_item_from_string("reject 0.0.0.0/8:*", -1,
  196. &malformed_list);
  197. tt_ptr_op(p, OP_NE, NULL);
  198. smartlist_add(policy5, p);
  199. p = router_parse_addr_policy_item_from_string("reject 169.254.0.0/16:*", -1,
  200. &malformed_list);
  201. tt_ptr_op(p, OP_NE, NULL);
  202. smartlist_add(policy5, p);
  203. p = router_parse_addr_policy_item_from_string("reject 127.0.0.0/8:*", -1,
  204. &malformed_list);
  205. tt_ptr_op(p, OP_NE, NULL);
  206. smartlist_add(policy5, p);
  207. p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",
  208. -1, &malformed_list);
  209. tt_ptr_op(p, OP_NE, NULL);
  210. smartlist_add(policy5, p);
  211. p = router_parse_addr_policy_item_from_string("reject 10.0.0.0/8:*", -1,
  212. &malformed_list);
  213. tt_ptr_op(p, OP_NE, NULL);
  214. smartlist_add(policy5, p);
  215. p = router_parse_addr_policy_item_from_string("reject 172.16.0.0/12:*", -1,
  216. &malformed_list);
  217. tt_ptr_op(p, OP_NE, NULL);
  218. smartlist_add(policy5, p);
  219. p = router_parse_addr_policy_item_from_string("reject 80.190.250.90:*", -1,
  220. &malformed_list);
  221. tt_ptr_op(p, OP_NE, NULL);
  222. smartlist_add(policy5, p);
  223. p = router_parse_addr_policy_item_from_string("reject *:1-65534", -1,
  224. &malformed_list);
  225. tt_ptr_op(p, OP_NE, NULL);
  226. smartlist_add(policy5, p);
  227. p = router_parse_addr_policy_item_from_string("reject *:65535", -1,
  228. &malformed_list);
  229. tt_ptr_op(p, OP_NE, NULL);
  230. smartlist_add(policy5, p);
  231. p = router_parse_addr_policy_item_from_string("accept *:1-65535", -1,
  232. &malformed_list);
  233. tt_ptr_op(p, OP_NE, NULL);
  234. smartlist_add(policy5, p);
  235. policy6 = smartlist_new();
  236. p = router_parse_addr_policy_item_from_string("accept 43.3.0.0/9:*", -1,
  237. &malformed_list);
  238. tt_ptr_op(p, OP_NE, NULL);
  239. smartlist_add(policy6, p);
  240. policy7 = smartlist_new();
  241. p = router_parse_addr_policy_item_from_string("accept 0.0.0.0/8:*", -1,
  242. &malformed_list);
  243. tt_ptr_op(p, OP_NE, NULL);
  244. smartlist_add(policy7, p);
  245. tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy8,
  246. EXIT_POLICY_IPV6_ENABLED |
  247. EXIT_POLICY_REJECT_PRIVATE |
  248. EXIT_POLICY_ADD_DEFAULT,
  249. NULL));
  250. tt_assert(policy8);
  251. tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy9,
  252. EXIT_POLICY_REJECT_PRIVATE |
  253. EXIT_POLICY_ADD_DEFAULT,
  254. NULL));
  255. tt_assert(policy9);
  256. /* accept6 * and reject6 * produce IPv6 wildcards only */
  257. policy10 = smartlist_new();
  258. p = router_parse_addr_policy_item_from_string("accept6 *:*", -1,
  259. &malformed_list);
  260. tt_ptr_op(p, OP_NE, NULL);
  261. smartlist_add(policy10, p);
  262. policy11 = smartlist_new();
  263. p = router_parse_addr_policy_item_from_string("reject6 *:*", -1,
  264. &malformed_list);
  265. tt_ptr_op(p, OP_NE, NULL);
  266. smartlist_add(policy11, p);
  267. tt_assert(!exit_policy_is_general_exit(policy));
  268. tt_assert(exit_policy_is_general_exit(policy2));
  269. tt_assert(!exit_policy_is_general_exit(NULL));
  270. tt_assert(!exit_policy_is_general_exit(policy3));
  271. tt_assert(!exit_policy_is_general_exit(policy4));
  272. tt_assert(!exit_policy_is_general_exit(policy5));
  273. tt_assert(!exit_policy_is_general_exit(policy6));
  274. tt_assert(!exit_policy_is_general_exit(policy7));
  275. tt_assert(exit_policy_is_general_exit(policy8));
  276. tt_assert(exit_policy_is_general_exit(policy9));
  277. tt_assert(!exit_policy_is_general_exit(policy10));
  278. tt_assert(!exit_policy_is_general_exit(policy11));
  279. tt_assert(!addr_policies_eq(policy, policy2));
  280. tt_assert(!addr_policies_eq(policy, NULL));
  281. tt_assert(addr_policies_eq(policy2, policy2));
  282. tt_assert(addr_policies_eq(NULL, NULL));
  283. tt_assert(!policy_is_reject_star(policy2, AF_INET, 1));
  284. tt_assert(policy_is_reject_star(policy, AF_INET, 1));
  285. tt_assert(policy_is_reject_star(policy10, AF_INET, 1));
  286. tt_assert(!policy_is_reject_star(policy10, AF_INET6, 1));
  287. tt_assert(policy_is_reject_star(policy11, AF_INET, 1));
  288. tt_assert(policy_is_reject_star(policy11, AF_INET6, 1));
  289. tt_assert(policy_is_reject_star(NULL, AF_INET, 1));
  290. tt_assert(policy_is_reject_star(NULL, AF_INET6, 1));
  291. tt_assert(!policy_is_reject_star(NULL, AF_INET, 0));
  292. tt_assert(!policy_is_reject_star(NULL, AF_INET6, 0));
  293. addr_policy_list_free(policy);
  294. policy = NULL;
  295. /* make sure assume_action works */
  296. malformed_list = 0;
  297. p = router_parse_addr_policy_item_from_string("127.0.0.1",
  298. ADDR_POLICY_ACCEPT,
  299. &malformed_list);
  300. tt_assert(p);
  301. addr_policy_free(p);
  302. tt_assert(!malformed_list);
  303. p = router_parse_addr_policy_item_from_string("127.0.0.1:*",
  304. ADDR_POLICY_ACCEPT,
  305. &malformed_list);
  306. tt_assert(p);
  307. addr_policy_free(p);
  308. tt_assert(!malformed_list);
  309. p = router_parse_addr_policy_item_from_string("[::]",
  310. ADDR_POLICY_ACCEPT,
  311. &malformed_list);
  312. tt_assert(p);
  313. addr_policy_free(p);
  314. tt_assert(!malformed_list);
  315. p = router_parse_addr_policy_item_from_string("[::]:*",
  316. ADDR_POLICY_ACCEPT,
  317. &malformed_list);
  318. tt_assert(p);
  319. addr_policy_free(p);
  320. tt_assert(!malformed_list);
  321. p = router_parse_addr_policy_item_from_string("[face::b]",
  322. ADDR_POLICY_ACCEPT,
  323. &malformed_list);
  324. tt_assert(p);
  325. addr_policy_free(p);
  326. tt_assert(!malformed_list);
  327. p = router_parse_addr_policy_item_from_string("[b::aaaa]",
  328. ADDR_POLICY_ACCEPT,
  329. &malformed_list);
  330. tt_assert(p);
  331. addr_policy_free(p);
  332. tt_assert(!malformed_list);
  333. p = router_parse_addr_policy_item_from_string("*",
  334. ADDR_POLICY_ACCEPT,
  335. &malformed_list);
  336. tt_assert(p);
  337. addr_policy_free(p);
  338. tt_assert(!malformed_list);
  339. p = router_parse_addr_policy_item_from_string("*4",
  340. ADDR_POLICY_ACCEPT,
  341. &malformed_list);
  342. tt_assert(p);
  343. addr_policy_free(p);
  344. tt_assert(!malformed_list);
  345. p = router_parse_addr_policy_item_from_string("*6",
  346. ADDR_POLICY_ACCEPT,
  347. &malformed_list);
  348. tt_assert(p);
  349. addr_policy_free(p);
  350. tt_assert(!malformed_list);
  351. /* These are all ambiguous IPv6 addresses, it's good that we reject them */
  352. p = router_parse_addr_policy_item_from_string("acce::abcd",
  353. ADDR_POLICY_ACCEPT,
  354. &malformed_list);
  355. tt_ptr_op(p, OP_EQ, NULL);
  356. tt_assert(malformed_list);
  357. malformed_list = 0;
  358. p = router_parse_addr_policy_item_from_string("7:1234",
  359. ADDR_POLICY_ACCEPT,
  360. &malformed_list);
  361. tt_ptr_op(p, OP_EQ, NULL);
  362. tt_assert(malformed_list);
  363. malformed_list = 0;
  364. p = router_parse_addr_policy_item_from_string("::",
  365. ADDR_POLICY_ACCEPT,
  366. &malformed_list);
  367. tt_ptr_op(p, OP_EQ, NULL);
  368. tt_assert(malformed_list);
  369. malformed_list = 0;
  370. /* make sure compacting logic works. */
  371. policy = NULL;
  372. line.key = (char*)"foo";
  373. line.value = (char*)"accept *:80,reject private:*,reject *:*";
  374. line.next = NULL;
  375. tt_int_op(0, OP_EQ, policies_parse_exit_policy(&line,&policy,
  376. EXIT_POLICY_IPV6_ENABLED |
  377. EXIT_POLICY_ADD_DEFAULT, NULL));
  378. tt_assert(policy);
  379. //test_streq(policy->string, "accept *:80");
  380. //test_streq(policy->next->string, "reject *:*");
  381. tt_int_op(smartlist_len(policy),OP_EQ, 4);
  382. /* test policy summaries */
  383. /* check if we properly ignore private IP addresses */
  384. test_policy_summary_helper("reject 192.168.0.0/16:*,"
  385. "reject 0.0.0.0/8:*,"
  386. "reject 10.0.0.0/8:*,"
  387. "accept *:10-30,"
  388. "accept *:90,"
  389. "reject *:*",
  390. "accept 10-30,90");
  391. /* check all accept policies, and proper counting of rejects */
  392. test_policy_summary_helper("reject 11.0.0.0/9:80,"
  393. "reject 12.0.0.0/9:80,"
  394. "reject 13.0.0.0/9:80,"
  395. "reject 14.0.0.0/9:80,"
  396. "accept *:*", "accept 1-65535");
  397. test_policy_summary_helper("reject 11.0.0.0/9:80,"
  398. "reject 12.0.0.0/9:80,"
  399. "reject 13.0.0.0/9:80,"
  400. "reject 14.0.0.0/9:80,"
  401. "reject 15.0.0.0:81,"
  402. "accept *:*", "accept 1-65535");
  403. test_policy_summary_helper6("reject 11.0.0.0/9:80,"
  404. "reject 12.0.0.0/9:80,"
  405. "reject 13.0.0.0/9:80,"
  406. "reject 14.0.0.0/9:80,"
  407. "reject 15.0.0.0:80,"
  408. "accept *:*",
  409. "reject 80",
  410. "accept 1-65535");
  411. /* no exits */
  412. test_policy_summary_helper("accept 11.0.0.0/9:80,"
  413. "reject *:*",
  414. "reject 1-65535");
  415. /* port merging */
  416. test_policy_summary_helper("accept *:80,"
  417. "accept *:81,"
  418. "accept *:100-110,"
  419. "accept *:111,"
  420. "reject *:*",
  421. "accept 80-81,100-111");
  422. /* border ports */
  423. test_policy_summary_helper("accept *:1,"
  424. "accept *:3,"
  425. "accept *:65535,"
  426. "reject *:*",
  427. "accept 1,3,65535");
  428. /* holes */
  429. test_policy_summary_helper("accept *:1,"
  430. "accept *:3,"
  431. "accept *:5,"
  432. "accept *:7,"
  433. "reject *:*",
  434. "accept 1,3,5,7");
  435. test_policy_summary_helper("reject *:1,"
  436. "reject *:3,"
  437. "reject *:5,"
  438. "reject *:7,"
  439. "accept *:*",
  440. "reject 1,3,5,7");
  441. /* long policies */
  442. /* standard long policy on many exits */
  443. test_policy_summary_helper("accept *:20-23,"
  444. "accept *:43,"
  445. "accept *:53,"
  446. "accept *:79-81,"
  447. "accept *:88,"
  448. "accept *:110,"
  449. "accept *:143,"
  450. "accept *:194,"
  451. "accept *:220,"
  452. "accept *:389,"
  453. "accept *:443,"
  454. "accept *:464,"
  455. "accept *:531,"
  456. "accept *:543-544,"
  457. "accept *:554,"
  458. "accept *:563,"
  459. "accept *:636,"
  460. "accept *:706,"
  461. "accept *:749,"
  462. "accept *:873,"
  463. "accept *:902-904,"
  464. "accept *:981,"
  465. "accept *:989-995,"
  466. "accept *:1194,"
  467. "accept *:1220,"
  468. "accept *:1293,"
  469. "accept *:1500,"
  470. "accept *:1533,"
  471. "accept *:1677,"
  472. "accept *:1723,"
  473. "accept *:1755,"
  474. "accept *:1863,"
  475. "accept *:2082,"
  476. "accept *:2083,"
  477. "accept *:2086-2087,"
  478. "accept *:2095-2096,"
  479. "accept *:2102-2104,"
  480. "accept *:3128,"
  481. "accept *:3389,"
  482. "accept *:3690,"
  483. "accept *:4321,"
  484. "accept *:4643,"
  485. "accept *:5050,"
  486. "accept *:5190,"
  487. "accept *:5222-5223,"
  488. "accept *:5228,"
  489. "accept *:5900,"
  490. "accept *:6660-6669,"
  491. "accept *:6679,"
  492. "accept *:6697,"
  493. "accept *:8000,"
  494. "accept *:8008,"
  495. "accept *:8074,"
  496. "accept *:8080,"
  497. "accept *:8087-8088,"
  498. "accept *:8332-8333,"
  499. "accept *:8443,"
  500. "accept *:8888,"
  501. "accept *:9418,"
  502. "accept *:9999,"
  503. "accept *:10000,"
  504. "accept *:11371,"
  505. "accept *:12350,"
  506. "accept *:19294,"
  507. "accept *:19638,"
  508. "accept *:23456,"
  509. "accept *:33033,"
  510. "accept *:64738,"
  511. "reject *:*",
  512. "accept 20-23,43,53,79-81,88,110,143,194,220,389,"
  513. "443,464,531,543-544,554,563,636,706,749,873,"
  514. "902-904,981,989-995,1194,1220,1293,1500,1533,"
  515. "1677,1723,1755,1863,2082-2083,2086-2087,"
  516. "2095-2096,2102-2104,3128,3389,3690,4321,4643,"
  517. "5050,5190,5222-5223,5228,5900,6660-6669,6679,"
  518. "6697,8000,8008,8074,8080,8087-8088,8332-8333,"
  519. "8443,8888,9418,9999-10000,11371,12350,19294,"
  520. "19638,23456,33033,64738");
  521. /* short policy with configured addresses */
  522. test_policy_summary_helper("reject 149.56.1.1:*,"
  523. "reject [2607:5300:1:1::1:0]:*,"
  524. "accept *:80,"
  525. "accept *:443,"
  526. "reject *:*",
  527. "accept 80,443");
  528. /* short policy with configured and local interface addresses */
  529. test_policy_summary_helper("reject 149.56.1.0:*,"
  530. "reject 149.56.1.1:*,"
  531. "reject 149.56.1.2:*,"
  532. "reject 149.56.1.3:*,"
  533. "reject 149.56.1.4:*,"
  534. "reject 149.56.1.5:*,"
  535. "reject 149.56.1.6:*,"
  536. "reject 149.56.1.7:*,"
  537. "reject [2607:5300:1:1::1:0]:*,"
  538. "reject [2607:5300:1:1::1:1]:*,"
  539. "reject [2607:5300:1:1::1:2]:*,"
  540. "reject [2607:5300:1:1::1:3]:*,"
  541. "reject [2607:5300:1:1::2:0]:*,"
  542. "reject [2607:5300:1:1::2:1]:*,"
  543. "reject [2607:5300:1:1::2:2]:*,"
  544. "reject [2607:5300:1:1::2:3]:*,"
  545. "accept *:80,"
  546. "accept *:443,"
  547. "reject *:*",
  548. "accept 80,443");
  549. /* short policy with configured netblocks */
  550. test_policy_summary_helper("reject 149.56.0.0/16,"
  551. "reject6 2607:5300::/32,"
  552. "reject6 2608:5300::/64,"
  553. "reject6 2609:5300::/96,"
  554. "accept *:80,"
  555. "accept *:443,"
  556. "reject *:*",
  557. "accept 80,443");
  558. /* short policy with large netblocks that do not count as a rejection */
  559. test_policy_summary_helper("reject 148.0.0.0/7,"
  560. "reject6 2600::/16,"
  561. "accept *:80,"
  562. "accept *:443,"
  563. "reject *:*",
  564. "accept 80,443");
  565. /* short policy with large netblocks that count as a rejection */
  566. test_policy_summary_helper("reject 148.0.0.0/6,"
  567. "reject6 2600::/15,"
  568. "accept *:80,"
  569. "accept *:443,"
  570. "reject *:*",
  571. "reject 1-65535");
  572. /* short policy with huge netblocks that count as a rejection */
  573. test_policy_summary_helper("reject 128.0.0.0/1,"
  574. "reject6 8000::/1,"
  575. "accept *:80,"
  576. "accept *:443,"
  577. "reject *:*",
  578. "reject 1-65535");
  579. /* short policy which blocks everything using netblocks */
  580. test_policy_summary_helper("reject 0.0.0.0/0,"
  581. "reject6 ::/0,"
  582. "accept *:80,"
  583. "accept *:443,"
  584. "reject *:*",
  585. "reject 1-65535");
  586. /* short policy which has repeated redundant netblocks */
  587. test_policy_summary_helper("reject 0.0.0.0/0,"
  588. "reject 0.0.0.0/0,"
  589. "reject 0.0.0.0/0,"
  590. "reject 0.0.0.0/0,"
  591. "reject 0.0.0.0/0,"
  592. "reject6 ::/0,"
  593. "reject6 ::/0,"
  594. "reject6 ::/0,"
  595. "reject6 ::/0,"
  596. "reject6 ::/0,"
  597. "accept *:80,"
  598. "accept *:443,"
  599. "reject *:*",
  600. "reject 1-65535");
  601. /* longest possible policy
  602. * (1-2,4-5,... is longer, but gets reduced to 3,6,... )
  603. * Going all the way to 65535 is incredibly slow, so we just go slightly
  604. * more than the expected length */
  605. test_policy_summary_helper("accept *:1,"
  606. "accept *:3,"
  607. "accept *:5,"
  608. "accept *:7,"
  609. "accept *:9,"
  610. "accept *:11,"
  611. "accept *:13,"
  612. "accept *:15,"
  613. "accept *:17,"
  614. "accept *:19,"
  615. "accept *:21,"
  616. "accept *:23,"
  617. "accept *:25,"
  618. "accept *:27,"
  619. "accept *:29,"
  620. "accept *:31,"
  621. "accept *:33,"
  622. "accept *:35,"
  623. "accept *:37,"
  624. "accept *:39,"
  625. "accept *:41,"
  626. "accept *:43,"
  627. "accept *:45,"
  628. "accept *:47,"
  629. "accept *:49,"
  630. "accept *:51,"
  631. "accept *:53,"
  632. "accept *:55,"
  633. "accept *:57,"
  634. "accept *:59,"
  635. "accept *:61,"
  636. "accept *:63,"
  637. "accept *:65,"
  638. "accept *:67,"
  639. "accept *:69,"
  640. "accept *:71,"
  641. "accept *:73,"
  642. "accept *:75,"
  643. "accept *:77,"
  644. "accept *:79,"
  645. "accept *:81,"
  646. "accept *:83,"
  647. "accept *:85,"
  648. "accept *:87,"
  649. "accept *:89,"
  650. "accept *:91,"
  651. "accept *:93,"
  652. "accept *:95,"
  653. "accept *:97,"
  654. "accept *:99,"
  655. "accept *:101,"
  656. "accept *:103,"
  657. "accept *:105,"
  658. "accept *:107,"
  659. "accept *:109,"
  660. "accept *:111,"
  661. "accept *:113,"
  662. "accept *:115,"
  663. "accept *:117,"
  664. "accept *:119,"
  665. "accept *:121,"
  666. "accept *:123,"
  667. "accept *:125,"
  668. "accept *:127,"
  669. "accept *:129,"
  670. "accept *:131,"
  671. "accept *:133,"
  672. "accept *:135,"
  673. "accept *:137,"
  674. "accept *:139,"
  675. "accept *:141,"
  676. "accept *:143,"
  677. "accept *:145,"
  678. "accept *:147,"
  679. "accept *:149,"
  680. "accept *:151,"
  681. "accept *:153,"
  682. "accept *:155,"
  683. "accept *:157,"
  684. "accept *:159,"
  685. "accept *:161,"
  686. "accept *:163,"
  687. "accept *:165,"
  688. "accept *:167,"
  689. "accept *:169,"
  690. "accept *:171,"
  691. "accept *:173,"
  692. "accept *:175,"
  693. "accept *:177,"
  694. "accept *:179,"
  695. "accept *:181,"
  696. "accept *:183,"
  697. "accept *:185,"
  698. "accept *:187,"
  699. "accept *:189,"
  700. "accept *:191,"
  701. "accept *:193,"
  702. "accept *:195,"
  703. "accept *:197,"
  704. "accept *:199,"
  705. "accept *:201,"
  706. "accept *:203,"
  707. "accept *:205,"
  708. "accept *:207,"
  709. "accept *:209,"
  710. "accept *:211,"
  711. "accept *:213,"
  712. "accept *:215,"
  713. "accept *:217,"
  714. "accept *:219,"
  715. "accept *:221,"
  716. "accept *:223,"
  717. "accept *:225,"
  718. "accept *:227,"
  719. "accept *:229,"
  720. "accept *:231,"
  721. "accept *:233,"
  722. "accept *:235,"
  723. "accept *:237,"
  724. "accept *:239,"
  725. "accept *:241,"
  726. "accept *:243,"
  727. "accept *:245,"
  728. "accept *:247,"
  729. "accept *:249,"
  730. "accept *:251,"
  731. "accept *:253,"
  732. "accept *:255,"
  733. "accept *:257,"
  734. "accept *:259,"
  735. "accept *:261,"
  736. "accept *:263,"
  737. "accept *:265,"
  738. "accept *:267,"
  739. "accept *:269,"
  740. "accept *:271,"
  741. "accept *:273,"
  742. "accept *:275,"
  743. "accept *:277,"
  744. "accept *:279,"
  745. "accept *:281,"
  746. "accept *:283,"
  747. "accept *:285,"
  748. "accept *:287,"
  749. "accept *:289,"
  750. "accept *:291,"
  751. "accept *:293,"
  752. "accept *:295,"
  753. "accept *:297,"
  754. "accept *:299,"
  755. "accept *:301,"
  756. "accept *:303,"
  757. "accept *:305,"
  758. "accept *:307,"
  759. "accept *:309,"
  760. "accept *:311,"
  761. "accept *:313,"
  762. "accept *:315,"
  763. "accept *:317,"
  764. "accept *:319,"
  765. "accept *:321,"
  766. "accept *:323,"
  767. "accept *:325,"
  768. "accept *:327,"
  769. "accept *:329,"
  770. "accept *:331,"
  771. "accept *:333,"
  772. "accept *:335,"
  773. "accept *:337,"
  774. "accept *:339,"
  775. "accept *:341,"
  776. "accept *:343,"
  777. "accept *:345,"
  778. "accept *:347,"
  779. "accept *:349,"
  780. "accept *:351,"
  781. "accept *:353,"
  782. "accept *:355,"
  783. "accept *:357,"
  784. "accept *:359,"
  785. "accept *:361,"
  786. "accept *:363,"
  787. "accept *:365,"
  788. "accept *:367,"
  789. "accept *:369,"
  790. "accept *:371,"
  791. "accept *:373,"
  792. "accept *:375,"
  793. "accept *:377,"
  794. "accept *:379,"
  795. "accept *:381,"
  796. "accept *:383,"
  797. "accept *:385,"
  798. "accept *:387,"
  799. "accept *:389,"
  800. "accept *:391,"
  801. "accept *:393,"
  802. "accept *:395,"
  803. "accept *:397,"
  804. "accept *:399,"
  805. "accept *:401,"
  806. "accept *:403,"
  807. "accept *:405,"
  808. "accept *:407,"
  809. "accept *:409,"
  810. "accept *:411,"
  811. "accept *:413,"
  812. "accept *:415,"
  813. "accept *:417,"
  814. "accept *:419,"
  815. "accept *:421,"
  816. "accept *:423,"
  817. "accept *:425,"
  818. "accept *:427,"
  819. "accept *:429,"
  820. "accept *:431,"
  821. "accept *:433,"
  822. "accept *:435,"
  823. "accept *:437,"
  824. "accept *:439,"
  825. "accept *:441,"
  826. "accept *:443,"
  827. "accept *:445,"
  828. "accept *:447,"
  829. "accept *:449,"
  830. "accept *:451,"
  831. "accept *:453,"
  832. "accept *:455,"
  833. "accept *:457,"
  834. "accept *:459,"
  835. "accept *:461,"
  836. "accept *:463,"
  837. "accept *:465,"
  838. "accept *:467,"
  839. "accept *:469,"
  840. "accept *:471,"
  841. "accept *:473,"
  842. "accept *:475,"
  843. "accept *:477,"
  844. "accept *:479,"
  845. "accept *:481,"
  846. "accept *:483,"
  847. "accept *:485,"
  848. "accept *:487,"
  849. "accept *:489,"
  850. "accept *:491,"
  851. "accept *:493,"
  852. "accept *:495,"
  853. "accept *:497,"
  854. "accept *:499,"
  855. "accept *:501,"
  856. "accept *:503,"
  857. "accept *:505,"
  858. "accept *:507,"
  859. "accept *:509,"
  860. "accept *:511,"
  861. "accept *:513,"
  862. "accept *:515,"
  863. "accept *:517,"
  864. "accept *:519,"
  865. "accept *:521,"
  866. "accept *:523,"
  867. "accept *:525,"
  868. "accept *:527,"
  869. "accept *:529,"
  870. "reject *:*",
  871. "accept 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,"
  872. "31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,"
  873. "63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,"
  874. "95,97,99,101,103,105,107,109,111,113,115,117,"
  875. "119,121,123,125,127,129,131,133,135,137,139,141,"
  876. "143,145,147,149,151,153,155,157,159,161,163,165,"
  877. "167,169,171,173,175,177,179,181,183,185,187,189,"
  878. "191,193,195,197,199,201,203,205,207,209,211,213,"
  879. "215,217,219,221,223,225,227,229,231,233,235,237,"
  880. "239,241,243,245,247,249,251,253,255,257,259,261,"
  881. "263,265,267,269,271,273,275,277,279,281,283,285,"
  882. "287,289,291,293,295,297,299,301,303,305,307,309,"
  883. "311,313,315,317,319,321,323,325,327,329,331,333,"
  884. "335,337,339,341,343,345,347,349,351,353,355,357,"
  885. "359,361,363,365,367,369,371,373,375,377,379,381,"
  886. "383,385,387,389,391,393,395,397,399,401,403,405,"
  887. "407,409,411,413,415,417,419,421,423,425,427,429,"
  888. "431,433,435,437,439,441,443,445,447,449,451,453,"
  889. "455,457,459,461,463,465,467,469,471,473,475,477,"
  890. "479,481,483,485,487,489,491,493,495,497,499,501,"
  891. "503,505,507,509,511,513,515,517,519,521,523");
  892. /* Short policies with unrecognized formats should get accepted. */
  893. test_short_policy_parse("accept fred,2,3-5", "accept 2,3-5");
  894. test_short_policy_parse("accept 2,fred,3", "accept 2,3");
  895. test_short_policy_parse("accept 2,fred,3,bob", "accept 2,3");
  896. test_short_policy_parse("accept 2,-3,500-600", "accept 2,500-600");
  897. /* Short policies with nil entries are accepted too. */
  898. test_short_policy_parse("accept 1,,3", "accept 1,3");
  899. test_short_policy_parse("accept 100-200,,", "accept 100-200");
  900. test_short_policy_parse("reject ,1-10,,,,30-40", "reject 1-10,30-40");
  901. /* Try parsing various broken short policies */
  902. #define TT_BAD_SHORT_POLICY(s) \
  903. do { \
  904. tt_ptr_op(NULL, OP_EQ, (short_parsed = parse_short_policy((s)))); \
  905. } while (0)
  906. TT_BAD_SHORT_POLICY("accept 200-199");
  907. TT_BAD_SHORT_POLICY("");
  908. TT_BAD_SHORT_POLICY("rejekt 1,2,3");
  909. TT_BAD_SHORT_POLICY("reject ");
  910. TT_BAD_SHORT_POLICY("reject");
  911. TT_BAD_SHORT_POLICY("rej");
  912. TT_BAD_SHORT_POLICY("accept 2,3,100000");
  913. TT_BAD_SHORT_POLICY("accept 2,3x,4");
  914. TT_BAD_SHORT_POLICY("accept 2,3x,4");
  915. TT_BAD_SHORT_POLICY("accept 2-");
  916. TT_BAD_SHORT_POLICY("accept 2-x");
  917. TT_BAD_SHORT_POLICY("accept 1-,3");
  918. TT_BAD_SHORT_POLICY("accept 1-,3");
  919. /* Make sure that IPv4 addresses are ignored in accept6/reject6 lines. */
  920. p = router_parse_addr_policy_item_from_string("accept6 1.2.3.4:*", -1,
  921. &malformed_list);
  922. tt_ptr_op(p, OP_EQ, NULL);
  923. tt_assert(!malformed_list);
  924. p = router_parse_addr_policy_item_from_string("reject6 2.4.6.0/24:*", -1,
  925. &malformed_list);
  926. tt_ptr_op(p, OP_EQ, NULL);
  927. tt_assert(!malformed_list);
  928. p = router_parse_addr_policy_item_from_string("accept6 *4:*", -1,
  929. &malformed_list);
  930. tt_ptr_op(p, OP_EQ, NULL);
  931. tt_assert(!malformed_list);
  932. /* Make sure malformed policies are detected as such. */
  933. p = router_parse_addr_policy_item_from_string("bad_token *4:*", -1,
  934. &malformed_list);
  935. tt_ptr_op(p, OP_EQ, NULL);
  936. tt_assert(malformed_list);
  937. p = router_parse_addr_policy_item_from_string("accept6 **:*", -1,
  938. &malformed_list);
  939. tt_ptr_op(p, OP_EQ, NULL);
  940. tt_assert(malformed_list);
  941. p = router_parse_addr_policy_item_from_string("accept */15:*", -1,
  942. &malformed_list);
  943. tt_ptr_op(p, OP_EQ, NULL);
  944. tt_assert(malformed_list);
  945. p = router_parse_addr_policy_item_from_string("reject6 */:*", -1,
  946. &malformed_list);
  947. tt_ptr_op(p, OP_EQ, NULL);
  948. tt_assert(malformed_list);
  949. p = router_parse_addr_policy_item_from_string("accept 127.0.0.1/33:*", -1,
  950. &malformed_list);
  951. tt_ptr_op(p, OP_EQ, NULL);
  952. tt_assert(malformed_list);
  953. p = router_parse_addr_policy_item_from_string("accept6 [::1]/129:*", -1,
  954. &malformed_list);
  955. tt_ptr_op(p, OP_EQ, NULL);
  956. tt_assert(malformed_list);
  957. p = router_parse_addr_policy_item_from_string("reject 8.8.8.8/-1:*", -1,
  958. &malformed_list);
  959. tt_ptr_op(p, OP_EQ, NULL);
  960. tt_assert(malformed_list);
  961. p = router_parse_addr_policy_item_from_string("reject 8.8.4.4:10-5", -1,
  962. &malformed_list);
  963. tt_ptr_op(p, OP_EQ, NULL);
  964. tt_assert(malformed_list);
  965. p = router_parse_addr_policy_item_from_string("reject 1.2.3.4:-1", -1,
  966. &malformed_list);
  967. tt_ptr_op(p, OP_EQ, NULL);
  968. tt_assert(malformed_list);
  969. /* Test a too-long policy. */
  970. {
  971. char *policy_strng = NULL;
  972. smartlist_t *chunks = smartlist_new();
  973. smartlist_add_strdup(chunks, "accept ");
  974. for (i=1; i<10000; ++i)
  975. smartlist_add_asprintf(chunks, "%d,", i);
  976. smartlist_add_strdup(chunks, "20000");
  977. policy_strng = smartlist_join_strings(chunks, "", 0, NULL);
  978. SMARTLIST_FOREACH(chunks, char *, ch, tor_free(ch));
  979. smartlist_free(chunks);
  980. short_parsed = parse_short_policy(policy_strng);/* shouldn't be accepted */
  981. tor_free(policy_strng);
  982. tt_ptr_op(NULL, OP_EQ, short_parsed);
  983. }
  984. /* truncation ports */
  985. sm = smartlist_new();
  986. for (i=1; i<2000; i+=2) {
  987. char buf[POLICY_BUF_LEN];
  988. tor_snprintf(buf, sizeof(buf), "reject *:%d", i);
  989. smartlist_add_strdup(sm, buf);
  990. }
  991. smartlist_add_strdup(sm, "accept *:*");
  992. policy_str = smartlist_join_strings(sm, ",", 0, NULL);
  993. test_policy_summary_helper( policy_str,
  994. "accept 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,"
  995. "46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,"
  996. "92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,"
  997. "130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,"
  998. "166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,"
  999. "202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,"
  1000. "238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,"
  1001. "274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,"
  1002. "310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,"
  1003. "346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,"
  1004. "382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,"
  1005. "418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,"
  1006. "454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,"
  1007. "490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522");
  1008. done:
  1009. addr_policy_list_free(policy);
  1010. addr_policy_list_free(policy2);
  1011. addr_policy_list_free(policy3);
  1012. addr_policy_list_free(policy4);
  1013. addr_policy_list_free(policy5);
  1014. addr_policy_list_free(policy6);
  1015. addr_policy_list_free(policy7);
  1016. addr_policy_list_free(policy8);
  1017. addr_policy_list_free(policy9);
  1018. addr_policy_list_free(policy10);
  1019. addr_policy_list_free(policy11);
  1020. addr_policy_list_free(policy12);
  1021. tor_free(policy_str);
  1022. if (sm) {
  1023. SMARTLIST_FOREACH(sm, char *, s, tor_free(s));
  1024. smartlist_free(sm);
  1025. }
  1026. short_policy_free(short_parsed);
  1027. }
  1028. /** Helper: Check that policy_list contains address */
  1029. static int
  1030. test_policy_has_address_helper(const smartlist_t *policy_list,
  1031. const tor_addr_t *addr)
  1032. {
  1033. int found = 0;
  1034. tt_assert(policy_list);
  1035. tt_assert(addr);
  1036. SMARTLIST_FOREACH_BEGIN(policy_list, addr_policy_t*, p) {
  1037. if (tor_addr_eq(&p->addr, addr)) {
  1038. found = 1;
  1039. }
  1040. } SMARTLIST_FOREACH_END(p);
  1041. return found;
  1042. done:
  1043. return 0;
  1044. }
  1045. #define TEST_IPV4_ADDR (0x01020304)
  1046. #define TEST_IPV6_ADDR ("2002::abcd")
  1047. /** Run unit tests for rejecting the configured addresses on this exit relay
  1048. * using policies_parse_exit_policy_reject_private */
  1049. static void
  1050. test_policies_reject_exit_address(void *arg)
  1051. {
  1052. smartlist_t *policy = NULL;
  1053. tor_addr_t ipv4_addr, ipv6_addr;
  1054. smartlist_t *ipv4_list, *ipv6_list, *both_list, *dupl_list;
  1055. (void)arg;
  1056. tor_addr_from_ipv4h(&ipv4_addr, TEST_IPV4_ADDR);
  1057. tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR);
  1058. ipv4_list = smartlist_new();
  1059. ipv6_list = smartlist_new();
  1060. both_list = smartlist_new();
  1061. dupl_list = smartlist_new();
  1062. smartlist_add(ipv4_list, &ipv4_addr);
  1063. smartlist_add(both_list, &ipv4_addr);
  1064. smartlist_add(dupl_list, &ipv4_addr);
  1065. smartlist_add(dupl_list, &ipv4_addr);
  1066. smartlist_add(dupl_list, &ipv4_addr);
  1067. smartlist_add(ipv6_list, &ipv6_addr);
  1068. smartlist_add(both_list, &ipv6_addr);
  1069. smartlist_add(dupl_list, &ipv6_addr);
  1070. smartlist_add(dupl_list, &ipv6_addr);
  1071. /* IPv4-Only Exits */
  1072. /* test that IPv4 addresses are rejected on an IPv4-only exit */
  1073. policies_parse_exit_policy_reject_private(&policy, 0, ipv4_list, 0, 0);
  1074. tt_assert(policy);
  1075. tt_int_op(smartlist_len(policy), OP_EQ, 1);
  1076. tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
  1077. addr_policy_list_free(policy);
  1078. policy = NULL;
  1079. /* test that IPv6 addresses are NOT rejected on an IPv4-only exit
  1080. * (all IPv6 addresses are rejected by policies_parse_exit_policy_internal
  1081. * on IPv4-only exits, so policies_parse_exit_policy_reject_private doesn't
  1082. * need to do anything) */
  1083. policies_parse_exit_policy_reject_private(&policy, 0, ipv6_list, 0, 0);
  1084. tt_ptr_op(policy, OP_EQ, NULL);
  1085. /* test that only IPv4 addresses are rejected on an IPv4-only exit */
  1086. policies_parse_exit_policy_reject_private(&policy, 0, both_list, 0, 0);
  1087. tt_assert(policy);
  1088. tt_int_op(smartlist_len(policy), OP_EQ, 1);
  1089. tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
  1090. addr_policy_list_free(policy);
  1091. policy = NULL;
  1092. /* Test that lists with duplicate entries produce the same results */
  1093. policies_parse_exit_policy_reject_private(&policy, 0, dupl_list, 0, 0);
  1094. tt_assert(policy);
  1095. tt_int_op(smartlist_len(policy), OP_EQ, 1);
  1096. tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
  1097. addr_policy_list_free(policy);
  1098. policy = NULL;
  1099. /* IPv4/IPv6 Exits */
  1100. /* test that IPv4 addresses are rejected on an IPv4/IPv6 exit */
  1101. policies_parse_exit_policy_reject_private(&policy, 1, ipv4_list, 0, 0);
  1102. tt_assert(policy);
  1103. tt_int_op(smartlist_len(policy), OP_EQ, 1);
  1104. tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
  1105. addr_policy_list_free(policy);
  1106. policy = NULL;
  1107. /* test that IPv6 addresses are rejected on an IPv4/IPv6 exit */
  1108. policies_parse_exit_policy_reject_private(&policy, 1, ipv6_list, 0, 0);
  1109. tt_assert(policy);
  1110. tt_int_op(smartlist_len(policy), OP_EQ, 1);
  1111. tt_assert(test_policy_has_address_helper(policy, &ipv6_addr));
  1112. addr_policy_list_free(policy);
  1113. policy = NULL;
  1114. /* test that IPv4 and IPv6 addresses are rejected on an IPv4/IPv6 exit */
  1115. policies_parse_exit_policy_reject_private(&policy, 1, both_list, 0, 0);
  1116. tt_assert(policy);
  1117. tt_int_op(smartlist_len(policy), OP_EQ, 2);
  1118. tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
  1119. tt_assert(test_policy_has_address_helper(policy, &ipv6_addr));
  1120. addr_policy_list_free(policy);
  1121. policy = NULL;
  1122. /* Test that lists with duplicate entries produce the same results */
  1123. policies_parse_exit_policy_reject_private(&policy, 1, dupl_list, 0, 0);
  1124. tt_assert(policy);
  1125. tt_int_op(smartlist_len(policy), OP_EQ, 2);
  1126. tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
  1127. tt_assert(test_policy_has_address_helper(policy, &ipv6_addr));
  1128. addr_policy_list_free(policy);
  1129. policy = NULL;
  1130. done:
  1131. addr_policy_list_free(policy);
  1132. smartlist_free(ipv4_list);
  1133. smartlist_free(ipv6_list);
  1134. smartlist_free(both_list);
  1135. smartlist_free(dupl_list);
  1136. }
  1137. static smartlist_t *test_configured_ports = NULL;
  1138. /** Returns test_configured_ports */
  1139. static const smartlist_t *
  1140. mock_get_configured_ports(void)
  1141. {
  1142. return test_configured_ports;
  1143. }
  1144. /** Run unit tests for rejecting publicly routable configured port addresses
  1145. * on this exit relay using policies_parse_exit_policy_reject_private */
  1146. static void
  1147. test_policies_reject_port_address(void *arg)
  1148. {
  1149. smartlist_t *policy = NULL;
  1150. port_cfg_t *ipv4_port = NULL;
  1151. port_cfg_t *ipv6_port = NULL;
  1152. (void)arg;
  1153. test_configured_ports = smartlist_new();
  1154. ipv4_port = port_cfg_new(0);
  1155. tor_addr_from_ipv4h(&ipv4_port->addr, TEST_IPV4_ADDR);
  1156. smartlist_add(test_configured_ports, ipv4_port);
  1157. ipv6_port = port_cfg_new(0);
  1158. tor_addr_parse(&ipv6_port->addr, TEST_IPV6_ADDR);
  1159. smartlist_add(test_configured_ports, ipv6_port);
  1160. MOCK(get_configured_ports, mock_get_configured_ports);
  1161. /* test that an IPv4 port is rejected on an IPv4-only exit, but an IPv6 port
  1162. * is NOT rejected (all IPv6 addresses are rejected by
  1163. * policies_parse_exit_policy_internal on IPv4-only exits, so
  1164. * policies_parse_exit_policy_reject_private doesn't need to do anything
  1165. * with IPv6 addresses on IPv4-only exits) */
  1166. policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 1);
  1167. tt_assert(policy);
  1168. tt_int_op(smartlist_len(policy), OP_EQ, 1);
  1169. tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr));
  1170. addr_policy_list_free(policy);
  1171. policy = NULL;
  1172. /* test that IPv4 and IPv6 ports are rejected on an IPv4/IPv6 exit */
  1173. policies_parse_exit_policy_reject_private(&policy, 1, NULL, 0, 1);
  1174. tt_assert(policy);
  1175. tt_int_op(smartlist_len(policy), OP_EQ, 2);
  1176. tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr));
  1177. tt_assert(test_policy_has_address_helper(policy, &ipv6_port->addr));
  1178. addr_policy_list_free(policy);
  1179. policy = NULL;
  1180. done:
  1181. addr_policy_list_free(policy);
  1182. if (test_configured_ports) {
  1183. SMARTLIST_FOREACH(test_configured_ports,
  1184. port_cfg_t *, p, port_cfg_free(p));
  1185. smartlist_free(test_configured_ports);
  1186. test_configured_ports = NULL;
  1187. }
  1188. UNMOCK(get_configured_ports);
  1189. }
  1190. static smartlist_t *mock_ipv4_addrs = NULL;
  1191. static smartlist_t *mock_ipv6_addrs = NULL;
  1192. /* mock get_interface_address6_list, returning a deep copy of the template
  1193. * address list ipv4_interface_address_list or ipv6_interface_address_list */
  1194. static smartlist_t *
  1195. mock_get_interface_address6_list(int severity,
  1196. sa_family_t family,
  1197. int include_internal)
  1198. {
  1199. (void)severity;
  1200. (void)include_internal;
  1201. smartlist_t *clone_list = smartlist_new();
  1202. smartlist_t *template_list = NULL;
  1203. if (family == AF_INET) {
  1204. template_list = mock_ipv4_addrs;
  1205. } else if (family == AF_INET6) {
  1206. template_list = mock_ipv6_addrs;
  1207. } else {
  1208. return NULL;
  1209. }
  1210. tt_assert(template_list);
  1211. SMARTLIST_FOREACH_BEGIN(template_list, tor_addr_t *, src_addr) {
  1212. tor_addr_t *dest_addr = tor_malloc(sizeof(tor_addr_t));
  1213. memset(dest_addr, 0, sizeof(*dest_addr));
  1214. tor_addr_copy_tight(dest_addr, src_addr);
  1215. smartlist_add(clone_list, dest_addr);
  1216. } SMARTLIST_FOREACH_END(src_addr);
  1217. return clone_list;
  1218. done:
  1219. interface_address6_list_free(clone_list);
  1220. return NULL;
  1221. }
  1222. /** Run unit tests for rejecting publicly routable interface addresses on this
  1223. * exit relay using policies_parse_exit_policy_reject_private */
  1224. static void
  1225. test_policies_reject_interface_address(void *arg)
  1226. {
  1227. smartlist_t *policy = NULL;
  1228. smartlist_t *public_ipv4_addrs =
  1229. get_interface_address6_list(LOG_INFO, AF_INET, 0);
  1230. smartlist_t *public_ipv6_addrs =
  1231. get_interface_address6_list(LOG_INFO, AF_INET6, 0);
  1232. tor_addr_t ipv4_addr, ipv6_addr;
  1233. (void)arg;
  1234. /* test that no addresses are rejected when none are supplied/requested */
  1235. policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0);
  1236. tt_ptr_op(policy, OP_EQ, NULL);
  1237. /* test that only IPv4 interface addresses are rejected on an IPv4-only exit
  1238. * (and allow for duplicates)
  1239. */
  1240. policies_parse_exit_policy_reject_private(&policy, 0, NULL, 1, 0);
  1241. if (policy) {
  1242. tt_assert(smartlist_len(policy) <= smartlist_len(public_ipv4_addrs));
  1243. addr_policy_list_free(policy);
  1244. policy = NULL;
  1245. }
  1246. /* test that IPv4 and IPv6 interface addresses are rejected on an IPv4/IPv6
  1247. * exit (and allow for duplicates) */
  1248. policies_parse_exit_policy_reject_private(&policy, 1, NULL, 1, 0);
  1249. if (policy) {
  1250. tt_assert(smartlist_len(policy) <= (smartlist_len(public_ipv4_addrs)
  1251. + smartlist_len(public_ipv6_addrs)));
  1252. addr_policy_list_free(policy);
  1253. policy = NULL;
  1254. }
  1255. /* Now do it all again, but mocked */
  1256. tor_addr_from_ipv4h(&ipv4_addr, TEST_IPV4_ADDR);
  1257. mock_ipv4_addrs = smartlist_new();
  1258. smartlist_add(mock_ipv4_addrs, (void *)&ipv4_addr);
  1259. tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR);
  1260. mock_ipv6_addrs = smartlist_new();
  1261. smartlist_add(mock_ipv6_addrs, (void *)&ipv6_addr);
  1262. MOCK(get_interface_address6_list, mock_get_interface_address6_list);
  1263. /* test that no addresses are rejected when none are supplied/requested */
  1264. policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0);
  1265. tt_ptr_op(policy, OP_EQ, NULL);
  1266. /* test that only IPv4 interface addresses are rejected on an IPv4-only exit
  1267. */
  1268. policies_parse_exit_policy_reject_private(&policy, 0, NULL, 1, 0);
  1269. tt_assert(policy);
  1270. tt_assert(smartlist_len(policy) == smartlist_len(mock_ipv4_addrs));
  1271. addr_policy_list_free(policy);
  1272. policy = NULL;
  1273. /* test that IPv4 and IPv6 interface addresses are rejected on an IPv4/IPv6
  1274. * exit */
  1275. policies_parse_exit_policy_reject_private(&policy, 1, NULL, 1, 0);
  1276. tt_assert(policy);
  1277. tt_assert(smartlist_len(policy) == (smartlist_len(mock_ipv4_addrs)
  1278. + smartlist_len(mock_ipv6_addrs)));
  1279. addr_policy_list_free(policy);
  1280. policy = NULL;
  1281. done:
  1282. addr_policy_list_free(policy);
  1283. interface_address6_list_free(public_ipv4_addrs);
  1284. interface_address6_list_free(public_ipv6_addrs);
  1285. UNMOCK(get_interface_address6_list);
  1286. /* we don't use interface_address6_list_free on these lists because their
  1287. * address pointers are stack-based */
  1288. smartlist_free(mock_ipv4_addrs);
  1289. smartlist_free(mock_ipv6_addrs);
  1290. }
  1291. #undef TEST_IPV4_ADDR
  1292. #undef TEST_IPV6_ADDR
  1293. static void
  1294. test_dump_exit_policy_to_string(void *arg)
  1295. {
  1296. char *ep;
  1297. addr_policy_t *policy_entry;
  1298. int malformed_list = -1;
  1299. routerinfo_t *ri = tor_malloc_zero(sizeof(routerinfo_t));
  1300. (void)arg;
  1301. ri->policy_is_reject_star = 1;
  1302. ri->exit_policy = NULL; // expecting "reject *:*"
  1303. ep = router_dump_exit_policy_to_string(ri,1,1);
  1304. tt_str_op("reject *:*",OP_EQ, ep);
  1305. tor_free(ep);
  1306. ri->exit_policy = smartlist_new();
  1307. ri->policy_is_reject_star = 0;
  1308. policy_entry = router_parse_addr_policy_item_from_string("accept *:*", -1,
  1309. &malformed_list);
  1310. smartlist_add(ri->exit_policy,policy_entry);
  1311. ep = router_dump_exit_policy_to_string(ri,1,1);
  1312. tt_str_op("accept *:*",OP_EQ, ep);
  1313. tor_free(ep);
  1314. policy_entry = router_parse_addr_policy_item_from_string("reject *:25", -1,
  1315. &malformed_list);
  1316. smartlist_add(ri->exit_policy,policy_entry);
  1317. ep = router_dump_exit_policy_to_string(ri,1,1);
  1318. tt_str_op("accept *:*\nreject *:25",OP_EQ, ep);
  1319. tor_free(ep);
  1320. policy_entry =
  1321. router_parse_addr_policy_item_from_string("reject 8.8.8.8:*", -1,
  1322. &malformed_list);
  1323. smartlist_add(ri->exit_policy,policy_entry);
  1324. ep = router_dump_exit_policy_to_string(ri,1,1);
  1325. tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*",OP_EQ, ep);
  1326. tor_free(ep);
  1327. policy_entry =
  1328. router_parse_addr_policy_item_from_string("reject6 [FC00::]/7:*", -1,
  1329. &malformed_list);
  1330. smartlist_add(ri->exit_policy,policy_entry);
  1331. ep = router_dump_exit_policy_to_string(ri,1,1);
  1332. tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n"
  1333. "reject6 [fc00::]/7:*",OP_EQ, ep);
  1334. tor_free(ep);
  1335. policy_entry =
  1336. router_parse_addr_policy_item_from_string("accept6 [c000::]/3:*", -1,
  1337. &malformed_list);
  1338. smartlist_add(ri->exit_policy,policy_entry);
  1339. ep = router_dump_exit_policy_to_string(ri,1,1);
  1340. tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n"
  1341. "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",OP_EQ, ep);
  1342. done:
  1343. if (ri->exit_policy) {
  1344. SMARTLIST_FOREACH(ri->exit_policy, addr_policy_t *,
  1345. entry, addr_policy_free(entry));
  1346. smartlist_free(ri->exit_policy);
  1347. }
  1348. tor_free(ri);
  1349. tor_free(ep);
  1350. }
  1351. static routerinfo_t *mock_desc_routerinfo = NULL;
  1352. static int routerinfo_err;
  1353. static const routerinfo_t *
  1354. mock_router_get_my_routerinfo_with_err(int *err)
  1355. {
  1356. if (routerinfo_err) {
  1357. if (err)
  1358. *err = routerinfo_err;
  1359. return NULL;
  1360. }
  1361. if (err)
  1362. *err = 0;
  1363. return mock_desc_routerinfo;
  1364. }
  1365. #define DEFAULT_POLICY_STRING "reject *:*"
  1366. #define TEST_IPV4_ADDR (0x02040608)
  1367. #define TEST_IPV6_ADDR ("2003::ef01")
  1368. static or_options_t mock_options;
  1369. static const or_options_t *
  1370. mock_get_options(void)
  1371. {
  1372. return &mock_options;
  1373. }
  1374. /** Run unit tests for generating summary lines of exit policies */
  1375. static void
  1376. test_policies_getinfo_helper_policies(void *arg)
  1377. {
  1378. (void)arg;
  1379. int rv = 0;
  1380. size_t ipv4_len = 0, ipv6_len = 0;
  1381. char *answer = NULL;
  1382. const char *errmsg = NULL;
  1383. routerinfo_t mock_my_routerinfo;
  1384. memset(&mock_my_routerinfo, 0, sizeof(mock_my_routerinfo));
  1385. rv = getinfo_helper_policies(NULL, "exit-policy/default", &answer, &errmsg);
  1386. tt_int_op(rv, OP_EQ, 0);
  1387. tt_ptr_op(answer, OP_NE, NULL);
  1388. tt_assert(strlen(answer) > 0);
  1389. tor_free(answer);
  1390. rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/default",
  1391. &answer, &errmsg);
  1392. tt_int_op(rv, OP_EQ, 0);
  1393. tt_ptr_op(answer, OP_NE, NULL);
  1394. tt_assert(strlen(answer) > 0);
  1395. tor_free(answer);
  1396. memset(&mock_my_routerinfo, 0, sizeof(routerinfo_t));
  1397. MOCK(router_get_my_routerinfo_with_err,
  1398. mock_router_get_my_routerinfo_with_err);
  1399. mock_my_routerinfo.exit_policy = smartlist_new();
  1400. mock_desc_routerinfo = &mock_my_routerinfo;
  1401. memset(&mock_options, 0, sizeof(or_options_t));
  1402. MOCK(get_options, mock_get_options);
  1403. rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
  1404. &answer, &errmsg);
  1405. tt_int_op(rv, OP_EQ, 0);
  1406. tt_ptr_op(answer, OP_NE, NULL);
  1407. tt_assert(strlen(answer) == 0);
  1408. tor_free(answer);
  1409. rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer,
  1410. &errmsg);
  1411. tt_int_op(rv, OP_EQ, 0);
  1412. tt_ptr_op(answer, OP_NE, NULL);
  1413. ipv4_len = strlen(answer);
  1414. tt_assert(ipv4_len == 0 || ipv4_len == strlen(DEFAULT_POLICY_STRING));
  1415. tt_assert(ipv4_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING));
  1416. tor_free(answer);
  1417. rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer,
  1418. &errmsg);
  1419. tt_int_op(rv, OP_EQ, 0);
  1420. tt_ptr_op(answer, OP_NE, NULL);
  1421. ipv6_len = strlen(answer);
  1422. tt_assert(ipv6_len == 0 || ipv6_len == strlen(DEFAULT_POLICY_STRING));
  1423. tt_assert(ipv6_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING));
  1424. tor_free(answer);
  1425. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1426. &errmsg);
  1427. tt_int_op(rv, OP_EQ, 0);
  1428. tt_ptr_op(answer, OP_NE, NULL);
  1429. /* It's either empty or it's the default */
  1430. tt_assert(strlen(answer) == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING));
  1431. tor_free(answer);
  1432. mock_my_routerinfo.addr = TEST_IPV4_ADDR;
  1433. tor_addr_parse(&mock_my_routerinfo.ipv6_addr, TEST_IPV6_ADDR);
  1434. append_exit_policy_string(&mock_my_routerinfo.exit_policy, "accept *4:*");
  1435. append_exit_policy_string(&mock_my_routerinfo.exit_policy, "reject *6:*");
  1436. mock_options.IPv6Exit = 1;
  1437. tor_addr_from_ipv4h(
  1438. &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][0],
  1439. TEST_IPV4_ADDR);
  1440. tor_addr_parse(
  1441. &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][1],
  1442. TEST_IPV6_ADDR);
  1443. mock_options.ExitPolicyRejectPrivate = 1;
  1444. mock_options.ExitPolicyRejectLocalInterfaces = 1;
  1445. rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
  1446. &answer, &errmsg);
  1447. tt_int_op(rv, OP_EQ, 0);
  1448. tt_ptr_op(answer, OP_NE, NULL);
  1449. tt_assert(strlen(answer) > 0);
  1450. tor_free(answer);
  1451. mock_options.ExitPolicyRejectPrivate = 1;
  1452. mock_options.ExitPolicyRejectLocalInterfaces = 0;
  1453. rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
  1454. &answer, &errmsg);
  1455. tt_int_op(rv, OP_EQ, 0);
  1456. tt_ptr_op(answer, OP_NE, NULL);
  1457. tt_assert(strlen(answer) > 0);
  1458. tor_free(answer);
  1459. mock_options.ExitPolicyRejectPrivate = 0;
  1460. mock_options.ExitPolicyRejectLocalInterfaces = 1;
  1461. rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
  1462. &answer, &errmsg);
  1463. tt_int_op(rv, OP_EQ, 0);
  1464. tt_ptr_op(answer, OP_NE, NULL);
  1465. tt_assert(strlen(answer) > 0);
  1466. tor_free(answer);
  1467. mock_options.ExitPolicyRejectPrivate = 0;
  1468. mock_options.ExitPolicyRejectLocalInterfaces = 0;
  1469. rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
  1470. &answer, &errmsg);
  1471. tt_int_op(rv, OP_EQ, 0);
  1472. tt_ptr_op(answer, OP_NE, NULL);
  1473. tt_assert(strlen(answer) == 0);
  1474. tor_free(answer);
  1475. rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer,
  1476. &errmsg);
  1477. tt_int_op(rv, OP_EQ, 0);
  1478. tt_ptr_op(answer, OP_NE, NULL);
  1479. ipv4_len = strlen(answer);
  1480. tt_assert(ipv4_len > 0);
  1481. tor_free(answer);
  1482. rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer,
  1483. &errmsg);
  1484. tt_int_op(rv, OP_EQ, 0);
  1485. tt_ptr_op(answer, OP_NE, NULL);
  1486. ipv6_len = strlen(answer);
  1487. tt_assert(ipv6_len > 0);
  1488. tor_free(answer);
  1489. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1490. &errmsg);
  1491. tt_int_op(rv, OP_EQ, 0);
  1492. tt_ptr_op(answer, OP_NE, NULL);
  1493. tt_assert(strlen(answer) > 0);
  1494. tt_assert(strlen(answer) == ipv4_len + ipv6_len + 1);
  1495. tor_free(answer);
  1496. routerinfo_err = TOR_ROUTERINFO_ERROR_NO_EXT_ADDR;
  1497. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1498. &errmsg);
  1499. tt_int_op(rv, OP_EQ, -1);
  1500. tt_ptr_op(answer, OP_EQ, NULL);
  1501. tt_ptr_op(errmsg, OP_NE, NULL);
  1502. tt_str_op(errmsg, OP_EQ, "No known exit address yet");
  1503. routerinfo_err = TOR_ROUTERINFO_ERROR_CANNOT_PARSE;
  1504. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1505. &errmsg);
  1506. tt_int_op(rv, OP_EQ, -1);
  1507. tt_ptr_op(answer, OP_EQ, NULL);
  1508. tt_ptr_op(errmsg, OP_NE, NULL);
  1509. tt_str_op(errmsg, OP_EQ, "Cannot parse descriptor");
  1510. routerinfo_err = TOR_ROUTERINFO_ERROR_NOT_A_SERVER;
  1511. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1512. &errmsg);
  1513. tt_int_op(rv, OP_EQ, 0);
  1514. tt_ptr_op(answer, OP_EQ, NULL);
  1515. tt_ptr_op(errmsg, OP_NE, NULL);
  1516. tt_str_op(errmsg, OP_EQ, "Not running in server mode");
  1517. routerinfo_err = TOR_ROUTERINFO_ERROR_DIGEST_FAILED;
  1518. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1519. &errmsg);
  1520. tt_int_op(rv, OP_EQ, -1);
  1521. tt_ptr_op(answer, OP_EQ, NULL);
  1522. tt_ptr_op(errmsg, OP_NE, NULL);
  1523. tt_str_op(errmsg, OP_EQ, "Key digest failed");
  1524. routerinfo_err = TOR_ROUTERINFO_ERROR_CANNOT_GENERATE;
  1525. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1526. &errmsg);
  1527. tt_int_op(rv, OP_EQ, -1);
  1528. tt_ptr_op(answer, OP_EQ, NULL);
  1529. tt_ptr_op(errmsg, OP_NE, NULL);
  1530. tt_str_op(errmsg, OP_EQ, "Cannot generate descriptor");
  1531. routerinfo_err = TOR_ROUTERINFO_ERROR_DESC_REBUILDING;
  1532. rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
  1533. &errmsg);
  1534. tt_int_op(rv, OP_EQ, -1);
  1535. tt_ptr_op(answer, OP_EQ, NULL);
  1536. tt_ptr_op(errmsg, OP_NE, NULL);
  1537. tt_str_op(errmsg, OP_EQ, "Descriptor still rebuilding - not ready yet");
  1538. done:
  1539. tor_free(answer);
  1540. UNMOCK(get_options);
  1541. UNMOCK(router_get_my_routerinfo);
  1542. addr_policy_list_free(mock_my_routerinfo.exit_policy);
  1543. }
  1544. #undef DEFAULT_POLICY_STRING
  1545. #undef TEST_IPV4_ADDR
  1546. #undef TEST_IPV6_ADDR
  1547. #define TEST_IPV4_ADDR_STR "1.2.3.4"
  1548. #define TEST_IPV6_ADDR_STR "[1002::4567]"
  1549. #define REJECT_IPv4_FINAL_STR "reject 0.0.0.0/0:*"
  1550. #define REJECT_IPv6_FINAL_STR "reject [::]/0:*"
  1551. #define OTHER_IPV4_ADDR_STR "6.7.8.9"
  1552. #define OTHER_IPV6_ADDR_STR "[afff::]"
  1553. /** Run unit tests for fascist_firewall_allows_address */
  1554. static void
  1555. test_policies_fascist_firewall_allows_address(void *arg)
  1556. {
  1557. (void)arg;
  1558. tor_addr_t ipv4_addr, ipv6_addr, r_ipv4_addr, r_ipv6_addr;
  1559. tor_addr_t n_ipv4_addr, n_ipv6_addr;
  1560. const uint16_t port = 1234;
  1561. smartlist_t *policy = NULL;
  1562. smartlist_t *e_policy = NULL;
  1563. addr_policy_t *item = NULL;
  1564. int malformed_list = 0;
  1565. /* Setup the options and the items in the policies */
  1566. memset(&mock_options, 0, sizeof(or_options_t));
  1567. MOCK(get_options, mock_get_options);
  1568. policy = smartlist_new();
  1569. item = router_parse_addr_policy_item_from_string("accept "
  1570. TEST_IPV4_ADDR_STR ":*",
  1571. ADDR_POLICY_ACCEPT,
  1572. &malformed_list);
  1573. tt_assert(item);
  1574. tt_assert(!malformed_list);
  1575. smartlist_add(policy, item);
  1576. item = router_parse_addr_policy_item_from_string("accept "
  1577. TEST_IPV6_ADDR_STR,
  1578. ADDR_POLICY_ACCEPT,
  1579. &malformed_list);
  1580. tt_assert(item);
  1581. tt_assert(!malformed_list);
  1582. smartlist_add(policy, item);
  1583. /* Normally, policy_expand_unspec would do this for us */
  1584. item = router_parse_addr_policy_item_from_string(REJECT_IPv4_FINAL_STR,
  1585. ADDR_POLICY_ACCEPT,
  1586. &malformed_list);
  1587. tt_assert(item);
  1588. tt_assert(!malformed_list);
  1589. smartlist_add(policy, item);
  1590. item = router_parse_addr_policy_item_from_string(REJECT_IPv6_FINAL_STR,
  1591. ADDR_POLICY_ACCEPT,
  1592. &malformed_list);
  1593. tt_assert(item);
  1594. tt_assert(!malformed_list);
  1595. smartlist_add(policy, item);
  1596. item = NULL;
  1597. e_policy = smartlist_new();
  1598. /*
  1599. char *polstr = policy_dump_to_string(policy, 1, 1);
  1600. printf("%s\n", polstr);
  1601. tor_free(polstr);
  1602. */
  1603. /* Parse the addresses */
  1604. tor_addr_parse(&ipv4_addr, TEST_IPV4_ADDR_STR);
  1605. tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR_STR);
  1606. tor_addr_parse(&r_ipv4_addr, OTHER_IPV4_ADDR_STR);
  1607. tor_addr_parse(&r_ipv6_addr, OTHER_IPV6_ADDR_STR);
  1608. tor_addr_make_null(&n_ipv4_addr, AF_INET);
  1609. tor_addr_make_null(&n_ipv6_addr, AF_INET6);
  1610. /* Test the function's address matching with IPv4 and IPv6 on */
  1611. memset(&mock_options, 0, sizeof(or_options_t));
  1612. mock_options.ClientUseIPv4 = 1;
  1613. mock_options.ClientUseIPv6 = 1;
  1614. mock_options.UseBridges = 0;
  1615. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
  1616. OP_EQ, 1);
  1617. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
  1618. OP_EQ, 1);
  1619. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
  1620. OP_EQ, 0);
  1621. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
  1622. OP_EQ, 0);
  1623. /* Preferring IPv4 */
  1624. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0),
  1625. OP_EQ, 1);
  1626. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0),
  1627. OP_EQ, 0);
  1628. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0),
  1629. OP_EQ, 0);
  1630. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0),
  1631. OP_EQ, 0);
  1632. /* Preferring IPv6 */
  1633. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1),
  1634. OP_EQ, 0);
  1635. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1),
  1636. OP_EQ, 1);
  1637. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1),
  1638. OP_EQ, 0);
  1639. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1),
  1640. OP_EQ, 0);
  1641. /* Test the function's address matching with UseBridges on */
  1642. memset(&mock_options, 0, sizeof(or_options_t));
  1643. mock_options.ClientUseIPv4 = 1;
  1644. mock_options.ClientUseIPv6 = 1;
  1645. mock_options.UseBridges = 1;
  1646. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
  1647. OP_EQ, 1);
  1648. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
  1649. OP_EQ, 1);
  1650. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
  1651. OP_EQ, 0);
  1652. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
  1653. OP_EQ, 0);
  1654. /* Preferring IPv4 */
  1655. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0),
  1656. OP_EQ, 1);
  1657. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0),
  1658. OP_EQ, 0);
  1659. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0),
  1660. OP_EQ, 0);
  1661. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0),
  1662. OP_EQ, 0);
  1663. /* Preferring IPv6 */
  1664. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1),
  1665. OP_EQ, 0);
  1666. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1),
  1667. OP_EQ, 1);
  1668. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1),
  1669. OP_EQ, 0);
  1670. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1),
  1671. OP_EQ, 0);
  1672. /* bridge clients always use IPv6, regardless of ClientUseIPv6 */
  1673. mock_options.ClientUseIPv4 = 1;
  1674. mock_options.ClientUseIPv6 = 0;
  1675. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
  1676. OP_EQ, 1);
  1677. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
  1678. OP_EQ, 1);
  1679. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
  1680. OP_EQ, 0);
  1681. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
  1682. OP_EQ, 0);
  1683. /* Test the function's address matching with IPv4 on */
  1684. memset(&mock_options, 0, sizeof(or_options_t));
  1685. mock_options.ClientUseIPv4 = 1;
  1686. mock_options.ClientUseIPv6 = 0;
  1687. mock_options.UseBridges = 0;
  1688. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
  1689. OP_EQ, 1);
  1690. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
  1691. OP_EQ, 0);
  1692. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
  1693. OP_EQ, 0);
  1694. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
  1695. OP_EQ, 0);
  1696. /* Test the function's address matching with IPv6 on */
  1697. memset(&mock_options, 0, sizeof(or_options_t));
  1698. mock_options.ClientUseIPv4 = 0;
  1699. mock_options.ClientUseIPv6 = 1;
  1700. mock_options.UseBridges = 0;
  1701. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
  1702. OP_EQ, 0);
  1703. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
  1704. OP_EQ, 1);
  1705. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
  1706. OP_EQ, 0);
  1707. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
  1708. OP_EQ, 0);
  1709. /* Test the function's address matching with ClientUseIPv4 0.
  1710. * This means "use IPv6" regardless of the other settings. */
  1711. memset(&mock_options, 0, sizeof(or_options_t));
  1712. mock_options.ClientUseIPv4 = 0;
  1713. mock_options.ClientUseIPv6 = 0;
  1714. mock_options.UseBridges = 0;
  1715. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
  1716. OP_EQ, 0);
  1717. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
  1718. OP_EQ, 1);
  1719. tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
  1720. OP_EQ, 0);
  1721. tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
  1722. OP_EQ, 0);
  1723. /* Test the function's address matching for unusual inputs */
  1724. memset(&mock_options, 0, sizeof(or_options_t));
  1725. mock_options.ClientUseIPv4 = 1;
  1726. mock_options.ClientUseIPv6 = 1;
  1727. mock_options.UseBridges = 1;
  1728. /* NULL and tor_addr_is_null addresses are rejected */
  1729. tt_int_op(fascist_firewall_allows_address(NULL, port, policy, 0, 0), OP_EQ,
  1730. 0);
  1731. tt_int_op(fascist_firewall_allows_address(&n_ipv4_addr, port, policy, 0, 0),
  1732. OP_EQ, 0);
  1733. tt_int_op(fascist_firewall_allows_address(&n_ipv6_addr, port, policy, 0, 0),
  1734. OP_EQ, 0);
  1735. /* zero ports are rejected */
  1736. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, 0, policy, 0, 0),
  1737. OP_EQ, 0);
  1738. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, 0, policy, 0, 0),
  1739. OP_EQ, 0);
  1740. /* NULL and empty policies accept everything */
  1741. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, NULL, 0, 0),
  1742. OP_EQ, 1);
  1743. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, NULL, 0, 0),
  1744. OP_EQ, 1);
  1745. tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, e_policy, 0, 0),
  1746. OP_EQ, 1);
  1747. tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, e_policy, 0, 0),
  1748. OP_EQ, 1);
  1749. done:
  1750. addr_policy_free(item);
  1751. addr_policy_list_free(policy);
  1752. addr_policy_list_free(e_policy);
  1753. UNMOCK(get_options);
  1754. }
  1755. #undef REJECT_IPv4_FINAL_STR
  1756. #undef REJECT_IPv6_FINAL_STR
  1757. #undef OTHER_IPV4_ADDR_STR
  1758. #undef OTHER_IPV6_ADDR_STR
  1759. #define TEST_IPV4_OR_PORT 1234
  1760. #define TEST_IPV4_DIR_PORT 2345
  1761. #define TEST_IPV6_OR_PORT 61234
  1762. #define TEST_IPV6_DIR_PORT 62345
  1763. /* Check that fascist_firewall_choose_address_rs() returns the expected
  1764. * results. */
  1765. #define CHECK_CHOSEN_ADDR_RS(fake_rs, fw_connection, pref_only, expect_rv, \
  1766. expect_ap) \
  1767. STMT_BEGIN \
  1768. tor_addr_port_t chosen_rs_ap; \
  1769. tor_addr_make_null(&chosen_rs_ap.addr, AF_INET); \
  1770. chosen_rs_ap.port = 0; \
  1771. fascist_firewall_choose_address_rs(&(fake_rs), (fw_connection), \
  1772. (pref_only), &chosen_rs_ap); \
  1773. tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_rs_ap.addr)); \
  1774. tt_int_op((expect_ap).port, OP_EQ, chosen_rs_ap.port); \
  1775. STMT_END
  1776. /* Check that fascist_firewall_choose_address_node() returns the expected
  1777. * results. */
  1778. #define CHECK_CHOSEN_ADDR_NODE(fake_node, fw_connection, pref_only, \
  1779. expect_rv, expect_ap) \
  1780. STMT_BEGIN \
  1781. tor_addr_port_t chosen_node_ap; \
  1782. tor_addr_make_null(&chosen_node_ap.addr, AF_INET); \
  1783. chosen_node_ap.port = 0; \
  1784. fascist_firewall_choose_address_node(&(fake_node),(fw_connection), \
  1785. (pref_only), &chosen_node_ap); \
  1786. tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_node_ap.addr)); \
  1787. tt_int_op((expect_ap).port, OP_EQ, chosen_node_ap.port); \
  1788. STMT_END
  1789. /* Check that fascist_firewall_choose_address_rs and
  1790. * fascist_firewall_choose_address_node() both return the expected results. */
  1791. #define CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, fw_connection, pref_only, \
  1792. expect_rv, expect_ap) \
  1793. STMT_BEGIN \
  1794. CHECK_CHOSEN_ADDR_RS(fake_rs, fw_connection, pref_only, expect_rv, \
  1795. expect_ap); \
  1796. CHECK_CHOSEN_ADDR_NODE(fake_node, fw_connection, pref_only, expect_rv, \
  1797. expect_ap); \
  1798. STMT_END
  1799. /* Check that fascist_firewall_choose_address_ls() returns the expected
  1800. * results. */
  1801. #define CHECK_CHOSEN_ADDR_NULL_LS() \
  1802. STMT_BEGIN \
  1803. tor_addr_port_t chosen_ls_ap; \
  1804. tor_addr_make_null(&chosen_ls_ap.addr, AF_UNSPEC); \
  1805. chosen_ls_ap.port = 0; \
  1806. setup_full_capture_of_logs(LOG_WARN); \
  1807. fascist_firewall_choose_address_ls(NULL, 1, &chosen_ls_ap); \
  1808. expect_single_log_msg("Unknown or missing link specifiers"); \
  1809. teardown_capture_of_logs(); \
  1810. STMT_END
  1811. #define CHECK_CHOSEN_ADDR_LS(fake_ls, pref_only, expect_rv, expect_ap) \
  1812. STMT_BEGIN \
  1813. tor_addr_port_t chosen_ls_ap; \
  1814. tor_addr_make_null(&chosen_ls_ap.addr, AF_UNSPEC); \
  1815. chosen_ls_ap.port = 0; \
  1816. setup_full_capture_of_logs(LOG_WARN); \
  1817. fascist_firewall_choose_address_ls(fake_ls, pref_only, &chosen_ls_ap); \
  1818. if (smartlist_len(fake_ls) == 0) { \
  1819. expect_single_log_msg("Link specifiers are empty"); \
  1820. } else { \
  1821. expect_no_log_entry(); \
  1822. tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_ls_ap.addr)); \
  1823. tt_int_op((expect_ap).port, OP_EQ, chosen_ls_ap.port); \
  1824. } \
  1825. teardown_capture_of_logs(); \
  1826. STMT_END
  1827. #define CHECK_LS_LEGACY_ONLY(fake_ls) \
  1828. STMT_BEGIN \
  1829. tor_addr_port_t chosen_ls_ap; \
  1830. tor_addr_make_null(&chosen_ls_ap.addr, AF_UNSPEC); \
  1831. chosen_ls_ap.port = 0; \
  1832. setup_full_capture_of_logs(LOG_WARN); \
  1833. fascist_firewall_choose_address_ls(fake_ls, 0, &chosen_ls_ap); \
  1834. expect_single_log_msg("None of our link specifiers have IPv4 or IPv6"); \
  1835. teardown_capture_of_logs(); \
  1836. STMT_END
  1837. #define CHECK_HS_EXTEND_INFO_ADDR_LS(fake_ls, direct_conn, expect_ap) \
  1838. STMT_BEGIN \
  1839. curve25519_secret_key_t seckey; \
  1840. curve25519_secret_key_generate(&seckey, 0); \
  1841. curve25519_public_key_t pubkey; \
  1842. curve25519_public_key_generate(&pubkey, &seckey); \
  1843. setup_full_capture_of_logs(LOG_WARN); \
  1844. extend_info_t *ei = hs_get_extend_info_from_lspecs(fake_ls, &pubkey, \
  1845. direct_conn); \
  1846. if (fake_ls == NULL) { \
  1847. tt_ptr_op(ei, OP_EQ, NULL); \
  1848. expect_single_log_msg("Specified link specifiers is null"); \
  1849. } else { \
  1850. expect_no_log_entry(); \
  1851. tt_assert(tor_addr_eq(&(expect_ap).addr, &ei->addr)); \
  1852. tt_int_op((expect_ap).port, OP_EQ, ei->port); \
  1853. extend_info_free(ei); \
  1854. } \
  1855. teardown_capture_of_logs(); \
  1856. STMT_END
  1857. #define CHECK_HS_EXTEND_INFO_ADDR_LS_NULL_KEY(fake_ls) \
  1858. STMT_BEGIN \
  1859. setup_full_capture_of_logs(LOG_WARN); \
  1860. extend_info_t *ei = hs_get_extend_info_from_lspecs(fake_ls, NULL, 0); \
  1861. tt_ptr_op(ei, OP_EQ, NULL); \
  1862. expect_single_log_msg("Specified onion key is null"); \
  1863. teardown_capture_of_logs(); \
  1864. STMT_END
  1865. #define CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_NULL(fake_ls, direct_conn) \
  1866. STMT_BEGIN \
  1867. curve25519_secret_key_t seckey; \
  1868. curve25519_secret_key_generate(&seckey, 0); \
  1869. curve25519_public_key_t pubkey; \
  1870. curve25519_public_key_generate(&pubkey, &seckey); \
  1871. extend_info_t *ei = hs_get_extend_info_from_lspecs(fake_ls, &pubkey, \
  1872. direct_conn); \
  1873. tt_ptr_op(ei, OP_EQ, NULL); \
  1874. STMT_END
  1875. #define CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_MSG(fake_ls, msg_level, msg) \
  1876. STMT_BEGIN \
  1877. curve25519_secret_key_t seckey; \
  1878. curve25519_secret_key_generate(&seckey, 0); \
  1879. curve25519_public_key_t pubkey; \
  1880. curve25519_public_key_generate(&pubkey, &seckey); \
  1881. setup_full_capture_of_logs(msg_level); \
  1882. extend_info_t *ei = hs_get_extend_info_from_lspecs(fake_ls, &pubkey, 0); \
  1883. tt_ptr_op(ei, OP_EQ, NULL); \
  1884. expect_single_log_msg(msg); \
  1885. teardown_capture_of_logs(); \
  1886. STMT_END
  1887. /** Mock the preferred address function to return zero (prefer IPv4). */
  1888. static int
  1889. mock_fascist_firewall_rand_prefer_ipv6_addr_use_ipv4(void)
  1890. {
  1891. return 0;
  1892. }
  1893. /** Mock the preferred address function to return one (prefer IPv6). */
  1894. static int
  1895. mock_fascist_firewall_rand_prefer_ipv6_addr_use_ipv6(void)
  1896. {
  1897. return 1;
  1898. }
  1899. /** Run unit tests for fascist_firewall_choose_address */
  1900. static void
  1901. test_policies_fascist_firewall_choose_address(void *arg)
  1902. {
  1903. (void)arg;
  1904. tor_addr_port_t ipv4_or_ap, ipv4_dir_ap, ipv6_or_ap, ipv6_dir_ap;
  1905. tor_addr_port_t n_ipv4_ap, n_ipv6_ap;
  1906. /* Setup the options */
  1907. memset(&mock_options, 0, sizeof(or_options_t));
  1908. MOCK(get_options, mock_get_options);
  1909. /* Parse the addresses */
  1910. tor_addr_parse(&ipv4_or_ap.addr, TEST_IPV4_ADDR_STR);
  1911. ipv4_or_ap.port = TEST_IPV4_OR_PORT;
  1912. tor_addr_parse(&ipv4_dir_ap.addr, TEST_IPV4_ADDR_STR);
  1913. ipv4_dir_ap.port = TEST_IPV4_DIR_PORT;
  1914. tor_addr_parse(&ipv6_or_ap.addr, TEST_IPV6_ADDR_STR);
  1915. ipv6_or_ap.port = TEST_IPV6_OR_PORT;
  1916. tor_addr_parse(&ipv6_dir_ap.addr, TEST_IPV6_ADDR_STR);
  1917. ipv6_dir_ap.port = TEST_IPV6_DIR_PORT;
  1918. tor_addr_make_null(&n_ipv4_ap.addr, AF_INET);
  1919. n_ipv4_ap.port = 0;
  1920. tor_addr_make_null(&n_ipv6_ap.addr, AF_INET6);
  1921. n_ipv6_ap.port = 0;
  1922. /* Sanity check fascist_firewall_choose_address with IPv4 and IPv6 on */
  1923. memset(&mock_options, 0, sizeof(or_options_t));
  1924. mock_options.ClientUseIPv4 = 1;
  1925. mock_options.ClientUseIPv6 = 1;
  1926. mock_options.UseBridges = 0;
  1927. /* Prefer IPv4 */
  1928. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
  1929. FIREWALL_OR_CONNECTION, 0, 0)
  1930. == &ipv4_or_ap);
  1931. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
  1932. FIREWALL_OR_CONNECTION, 1, 0)
  1933. == &ipv4_or_ap);
  1934. tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1,
  1935. FIREWALL_DIR_CONNECTION, 0, 0)
  1936. == &ipv4_dir_ap);
  1937. tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1,
  1938. FIREWALL_DIR_CONNECTION, 1, 0)
  1939. == &ipv4_dir_ap);
  1940. /* Prefer IPv6 */
  1941. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
  1942. FIREWALL_OR_CONNECTION, 0, 1)
  1943. == &ipv6_or_ap);
  1944. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
  1945. FIREWALL_OR_CONNECTION, 1, 1)
  1946. == &ipv6_or_ap);
  1947. tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0,
  1948. FIREWALL_DIR_CONNECTION, 0, 1)
  1949. == &ipv6_dir_ap);
  1950. tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0,
  1951. FIREWALL_DIR_CONNECTION, 1, 1)
  1952. == &ipv6_dir_ap);
  1953. /* Unusual inputs */
  1954. /* null preferred OR addresses */
  1955. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &n_ipv6_ap, 0,
  1956. FIREWALL_OR_CONNECTION, 0, 1)
  1957. == &ipv4_or_ap);
  1958. tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_or_ap, 1,
  1959. FIREWALL_OR_CONNECTION, 0, 0)
  1960. == &ipv6_or_ap);
  1961. /* null both OR addresses */
  1962. tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
  1963. FIREWALL_OR_CONNECTION, 0, 1),
  1964. OP_EQ, NULL);
  1965. tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
  1966. FIREWALL_OR_CONNECTION, 0, 0),
  1967. OP_EQ, NULL);
  1968. /* null preferred Dir addresses */
  1969. tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &n_ipv6_ap, 0,
  1970. FIREWALL_DIR_CONNECTION, 0, 1)
  1971. == &ipv4_dir_ap);
  1972. tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_dir_ap, 1,
  1973. FIREWALL_DIR_CONNECTION, 0, 0)
  1974. == &ipv6_dir_ap);
  1975. /* null both Dir addresses */
  1976. tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
  1977. FIREWALL_DIR_CONNECTION, 0, 1),
  1978. OP_EQ, NULL);
  1979. tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
  1980. FIREWALL_DIR_CONNECTION, 0, 0),
  1981. OP_EQ, NULL);
  1982. /* Prefer IPv4 but want IPv6 (contradictory) */
  1983. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
  1984. FIREWALL_OR_CONNECTION, 0, 0)
  1985. == &ipv4_or_ap);
  1986. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
  1987. FIREWALL_OR_CONNECTION, 1, 0)
  1988. == &ipv4_or_ap);
  1989. /* Prefer IPv6 but want IPv4 (contradictory) */
  1990. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
  1991. FIREWALL_OR_CONNECTION, 0, 1)
  1992. == &ipv6_or_ap);
  1993. tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
  1994. FIREWALL_OR_CONNECTION, 1, 1)
  1995. == &ipv6_or_ap);
  1996. /* Make a fake rs. There will be no corresponding node.
  1997. * This is what happens when there's no consensus and we're bootstrapping
  1998. * from authorities / fallbacks. */
  1999. routerstatus_t fake_rs;
  2000. memset(&fake_rs, 0, sizeof(routerstatus_t));
  2001. /* In a routerstatus, the OR and Dir addresses are the same */
  2002. fake_rs.addr = tor_addr_to_ipv4h(&ipv4_or_ap.addr);
  2003. fake_rs.or_port = ipv4_or_ap.port;
  2004. fake_rs.dir_port = ipv4_dir_ap.port;
  2005. tor_addr_copy(&fake_rs.ipv6_addr, &ipv6_or_ap.addr);
  2006. fake_rs.ipv6_orport = ipv6_or_ap.port;
  2007. /* In a routerstatus, the IPv4 and IPv6 DirPorts are the same.*/
  2008. ipv6_dir_ap.port = TEST_IPV4_DIR_PORT;
  2009. /* Make a fake node. Even though it contains the fake_rs, a lookup won't
  2010. * find the node from the rs, because they're not in the hash table. */
  2011. node_t fake_node;
  2012. memset(&fake_node, 0, sizeof(node_t));
  2013. fake_node.rs = &fake_rs;
  2014. /* Choose an address with IPv4 and IPv6 on */
  2015. memset(&mock_options, 0, sizeof(or_options_t));
  2016. mock_options.ClientUseIPv4 = 1;
  2017. mock_options.ClientUseIPv6 = 1;
  2018. mock_options.UseBridges = 0;
  2019. /* Preferring IPv4 */
  2020. mock_options.ClientPreferIPv6ORPort = 0;
  2021. mock_options.ClientPreferIPv6DirPort = 0;
  2022. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2023. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2024. &mock_options);
  2025. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2026. ipv4_or_ap);
  2027. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2028. ipv4_or_ap);
  2029. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2030. ipv4_dir_ap);
  2031. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2032. ipv4_dir_ap);
  2033. /* Auto (Preferring IPv4) */
  2034. mock_options.ClientPreferIPv6ORPort = -1;
  2035. mock_options.ClientPreferIPv6DirPort = -1;
  2036. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2037. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2038. &mock_options);
  2039. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2040. ipv4_or_ap);
  2041. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2042. ipv4_or_ap);
  2043. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2044. ipv4_dir_ap);
  2045. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2046. ipv4_dir_ap);
  2047. /* Preferring IPv6 */
  2048. mock_options.ClientPreferIPv6ORPort = 1;
  2049. mock_options.ClientPreferIPv6DirPort = 1;
  2050. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2051. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2052. &mock_options);
  2053. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2054. ipv6_or_ap);
  2055. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2056. ipv6_or_ap);
  2057. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2058. ipv6_dir_ap);
  2059. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2060. ipv6_dir_ap);
  2061. /* Preferring IPv4 OR / IPv6 Dir */
  2062. mock_options.ClientPreferIPv6ORPort = 0;
  2063. mock_options.ClientPreferIPv6DirPort = 1;
  2064. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2065. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2066. &mock_options);
  2067. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2068. ipv4_or_ap);
  2069. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2070. ipv4_or_ap);
  2071. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2072. ipv6_dir_ap);
  2073. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2074. ipv6_dir_ap);
  2075. /* Preferring IPv6 OR / IPv4 Dir */
  2076. mock_options.ClientPreferIPv6ORPort = 1;
  2077. mock_options.ClientPreferIPv6DirPort = 0;
  2078. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2079. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2080. &mock_options);
  2081. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2082. ipv6_or_ap);
  2083. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2084. ipv6_or_ap);
  2085. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2086. ipv4_dir_ap);
  2087. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2088. ipv4_dir_ap);
  2089. /* Choose an address with UseBridges on */
  2090. memset(&mock_options, 0, sizeof(or_options_t));
  2091. mock_options.UseBridges = 1;
  2092. mock_options.ClientUseIPv4 = 1;
  2093. mock_options.ClientUseIPv6 = 1;
  2094. /* Preferring IPv4 */
  2095. mock_options.ClientPreferIPv6ORPort = 0;
  2096. mock_options.ClientPreferIPv6DirPort = 0;
  2097. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2098. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2099. &mock_options);
  2100. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2101. ipv4_or_ap);
  2102. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2103. ipv4_or_ap);
  2104. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2105. ipv4_dir_ap);
  2106. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2107. ipv4_dir_ap);
  2108. /* Auto:
  2109. * - bridge clients prefer the configured bridge OR address from the node,
  2110. * (the configured address family sets node.ipv6_preferred)
  2111. * - other clients prefer IPv4 OR by default (see above),
  2112. * - all clients, including bridge clients, prefer IPv4 Dir by default.
  2113. */
  2114. mock_options.ClientPreferIPv6ORPort = -1;
  2115. mock_options.ClientPreferIPv6DirPort = -1;
  2116. /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge
  2117. * configured with an IPv4 address */
  2118. fake_node.ipv6_preferred = 0;
  2119. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap);
  2120. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap);
  2121. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2122. ipv4_dir_ap);
  2123. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2124. ipv4_dir_ap);
  2125. /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge
  2126. * configured with an IPv6 address */
  2127. fake_node.ipv6_preferred = 1;
  2128. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv6_or_ap);
  2129. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv6_or_ap);
  2130. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2131. ipv4_dir_ap);
  2132. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2133. ipv4_dir_ap);
  2134. /* When a rs has no node, it defaults to IPv4 under auto. */
  2135. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap);
  2136. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap);
  2137. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 0, 1, ipv4_dir_ap);
  2138. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 1, 1, ipv4_dir_ap);
  2139. /* Preferring IPv6 */
  2140. mock_options.ClientPreferIPv6ORPort = 1;
  2141. mock_options.ClientPreferIPv6DirPort = 1;
  2142. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2143. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2144. &mock_options);
  2145. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2146. ipv6_or_ap);
  2147. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2148. ipv6_or_ap);
  2149. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2150. ipv6_dir_ap);
  2151. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2152. ipv6_dir_ap);
  2153. /* In the default configuration (Auto / IPv6 off), bridge clients should
  2154. * use both IPv4 and IPv6, but only prefer IPv6 for bridges configured with
  2155. * an IPv6 address, regardless of ClientUseIPv6. (See above.) */
  2156. mock_options.ClientUseIPv6 = 0;
  2157. mock_options.ClientPreferIPv6ORPort = -1;
  2158. mock_options.ClientPreferIPv6DirPort = -1;
  2159. /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge
  2160. * configured with an IPv4 address */
  2161. fake_node.ipv6_preferred = 0;
  2162. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap);
  2163. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap);
  2164. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2165. ipv4_dir_ap);
  2166. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2167. ipv4_dir_ap);
  2168. /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge
  2169. * configured with an IPv6 address */
  2170. fake_node.ipv6_preferred = 1;
  2171. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv6_or_ap);
  2172. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv6_or_ap);
  2173. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2174. ipv4_dir_ap);
  2175. CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2176. ipv4_dir_ap);
  2177. /* When a rs has no node, it defaults to IPv4 under auto. */
  2178. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap);
  2179. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap);
  2180. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 0, 1, ipv4_dir_ap);
  2181. CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 1, 1, ipv4_dir_ap);
  2182. /* Choose an address with IPv4 on */
  2183. memset(&mock_options, 0, sizeof(or_options_t));
  2184. mock_options.ClientUseIPv4 = 1;
  2185. mock_options.ClientUseIPv6 = 0;
  2186. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2187. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2188. &mock_options);
  2189. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2190. ipv4_or_ap);
  2191. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2192. ipv4_or_ap);
  2193. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2194. ipv4_dir_ap);
  2195. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2196. ipv4_dir_ap);
  2197. /* Choose an address with IPv6 on */
  2198. memset(&mock_options, 0, sizeof(or_options_t));
  2199. mock_options.ClientUseIPv4 = 0;
  2200. mock_options.ClientUseIPv6 = 1;
  2201. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2202. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2203. &mock_options);
  2204. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2205. ipv6_or_ap);
  2206. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2207. ipv6_or_ap);
  2208. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2209. ipv6_dir_ap);
  2210. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2211. ipv6_dir_ap);
  2212. /* Choose an address with ClientUseIPv4 0.
  2213. * This means "use IPv6" regardless of the other settings. */
  2214. memset(&mock_options, 0, sizeof(or_options_t));
  2215. mock_options.ClientUseIPv4 = 0;
  2216. mock_options.ClientUseIPv6 = 0;
  2217. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2218. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2219. &mock_options);
  2220. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2221. ipv6_or_ap);
  2222. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2223. ipv6_or_ap);
  2224. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2225. ipv6_dir_ap);
  2226. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2227. ipv6_dir_ap);
  2228. /* Choose an address with ORPort_set 1 (server mode).
  2229. * This means "use IPv4" regardless of the other settings. */
  2230. memset(&mock_options, 0, sizeof(or_options_t));
  2231. mock_options.ORPort_set = 1;
  2232. mock_options.ClientUseIPv4 = 0;
  2233. mock_options.ClientUseIPv6 = 1;
  2234. mock_options.ClientPreferIPv6ORPort = 1;
  2235. mock_options.ClientPreferIPv6DirPort = 1;
  2236. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2237. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2238. &mock_options);
  2239. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2240. ipv4_or_ap);
  2241. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2242. ipv4_or_ap);
  2243. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1,
  2244. ipv4_dir_ap);
  2245. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1,
  2246. ipv4_dir_ap);
  2247. /* Test ClientAutoIPv6ORPort and pretend we prefer IPv4. */
  2248. memset(&mock_options, 0, sizeof(or_options_t));
  2249. mock_options.ClientAutoIPv6ORPort = 1;
  2250. mock_options.ClientUseIPv4 = 1;
  2251. mock_options.ClientUseIPv6 = 1;
  2252. MOCK(fascist_firewall_rand_prefer_ipv6_addr,
  2253. mock_fascist_firewall_rand_prefer_ipv6_addr_use_ipv4);
  2254. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2255. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2256. &mock_options);
  2257. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2258. ipv4_or_ap);
  2259. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2260. ipv4_or_ap);
  2261. UNMOCK(fascist_firewall_rand_prefer_ipv6_addr);
  2262. /* Test ClientAutoIPv6ORPort and pretend we prefer IPv6. */
  2263. memset(&mock_options, 0, sizeof(or_options_t));
  2264. mock_options.ClientAutoIPv6ORPort = 1;
  2265. mock_options.ClientUseIPv4 = 1;
  2266. mock_options.ClientUseIPv6 = 1;
  2267. MOCK(fascist_firewall_rand_prefer_ipv6_addr,
  2268. mock_fascist_firewall_rand_prefer_ipv6_addr_use_ipv6);
  2269. /* Simulate the initialisation of fake_node.ipv6_preferred */
  2270. fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
  2271. &mock_options);
  2272. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
  2273. ipv6_or_ap);
  2274. CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1,
  2275. ipv6_or_ap);
  2276. UNMOCK(fascist_firewall_rand_prefer_ipv6_addr);
  2277. /* Test firewall_choose_address_ls(). To do this, we make a fake link
  2278. * specifier. */
  2279. smartlist_t *lspecs = smartlist_new(),
  2280. *lspecs_blank = smartlist_new(),
  2281. *lspecs_v4 = smartlist_new(),
  2282. *lspecs_v6 = smartlist_new(),
  2283. *lspecs_no_legacy = smartlist_new(),
  2284. *lspecs_legacy_only = smartlist_new();
  2285. link_specifier_t *fake_ls;
  2286. /* IPv4 link specifier */
  2287. fake_ls = link_specifier_new();
  2288. link_specifier_set_ls_type(fake_ls, LS_IPV4);
  2289. link_specifier_set_un_ipv4_addr(fake_ls,
  2290. tor_addr_to_ipv4h(&ipv4_or_ap.addr));
  2291. link_specifier_set_un_ipv4_port(fake_ls, ipv4_or_ap.port);
  2292. link_specifier_set_ls_len(fake_ls, sizeof(ipv4_or_ap.addr.addr.in_addr) +
  2293. sizeof(ipv4_or_ap.port));
  2294. smartlist_add(lspecs, fake_ls);
  2295. smartlist_add(lspecs_v4, fake_ls);
  2296. smartlist_add(lspecs_no_legacy, fake_ls);
  2297. /* IPv6 link specifier */
  2298. fake_ls = link_specifier_new();
  2299. link_specifier_set_ls_type(fake_ls, LS_IPV6);
  2300. size_t addr_len = link_specifier_getlen_un_ipv6_addr(fake_ls);
  2301. const uint8_t *in6_addr = tor_addr_to_in6_addr8(&ipv6_or_ap.addr);
  2302. uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(fake_ls);
  2303. memcpy(ipv6_array, in6_addr, addr_len);
  2304. link_specifier_set_un_ipv6_port(fake_ls, ipv6_or_ap.port);
  2305. link_specifier_set_ls_len(fake_ls, addr_len + sizeof(ipv6_or_ap.port));
  2306. smartlist_add(lspecs, fake_ls);
  2307. smartlist_add(lspecs_v6, fake_ls);
  2308. /* Legacy ID link specifier */
  2309. fake_ls = link_specifier_new();
  2310. link_specifier_set_ls_type(fake_ls, LS_LEGACY_ID);
  2311. uint8_t *legacy_id = link_specifier_getarray_un_legacy_id(fake_ls);
  2312. memset(legacy_id, 'A', sizeof(*legacy_id));
  2313. link_specifier_set_ls_len(fake_ls,
  2314. link_specifier_getlen_un_legacy_id(fake_ls));
  2315. smartlist_add(lspecs, fake_ls);
  2316. smartlist_add(lspecs_legacy_only, fake_ls);
  2317. smartlist_add(lspecs_v4, fake_ls);
  2318. smartlist_add(lspecs_v6, fake_ls);
  2319. /* Check with bogus requests. */
  2320. tor_addr_port_t null_ap; \
  2321. tor_addr_make_null(&null_ap.addr, AF_UNSPEC); \
  2322. null_ap.port = 0; \
  2323. /* Check for a null link state. */
  2324. CHECK_CHOSEN_ADDR_NULL_LS();
  2325. CHECK_HS_EXTEND_INFO_ADDR_LS(NULL, 1, null_ap);
  2326. /* Check for a blank link state. */
  2327. CHECK_CHOSEN_ADDR_LS(lspecs_blank, 0, 0, null_ap);
  2328. CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_NULL(lspecs_blank, 0);
  2329. /* Check for a link state with only a Legacy ID. */
  2330. CHECK_LS_LEGACY_ONLY(lspecs_legacy_only);
  2331. CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_NULL(lspecs_legacy_only, 0);
  2332. smartlist_free(lspecs_legacy_only);
  2333. /* Check with a null onion_key. */
  2334. CHECK_HS_EXTEND_INFO_ADDR_LS_NULL_KEY(lspecs_blank);
  2335. smartlist_free(lspecs_blank);
  2336. /* Check with a null onion_key. */
  2337. CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_MSG(lspecs_no_legacy, LOG_WARN,
  2338. "Missing Legacy ID in link state");
  2339. smartlist_free(lspecs_no_legacy);
  2340. /* Enable both IPv4 and IPv6. */
  2341. memset(&mock_options, 0, sizeof(or_options_t));
  2342. mock_options.ClientUseIPv4 = 1;
  2343. mock_options.ClientUseIPv6 = 1;
  2344. /* Prefer IPv4, enable both IPv4 and IPv6. */
  2345. mock_options.ClientPreferIPv6ORPort = 0;
  2346. CHECK_CHOSEN_ADDR_LS(lspecs, 0, 1, ipv4_or_ap);
  2347. CHECK_CHOSEN_ADDR_LS(lspecs, 1, 1, ipv4_or_ap);
  2348. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 1, ipv4_or_ap);
  2349. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 0, ipv4_or_ap);
  2350. /* Prefer IPv6, enable both IPv4 and IPv6. */
  2351. mock_options.ClientPreferIPv6ORPort = 1;
  2352. CHECK_CHOSEN_ADDR_LS(lspecs, 0, 1, ipv6_or_ap);
  2353. CHECK_CHOSEN_ADDR_LS(lspecs, 1, 1, ipv6_or_ap);
  2354. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 1, ipv6_or_ap);
  2355. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 0, ipv4_or_ap);
  2356. /* IPv4-only. */
  2357. memset(&mock_options, 0, sizeof(or_options_t));
  2358. mock_options.ClientUseIPv4 = 1;
  2359. mock_options.ClientUseIPv6 = 0;
  2360. CHECK_CHOSEN_ADDR_LS(lspecs, 0, 1, ipv4_or_ap);
  2361. CHECK_CHOSEN_ADDR_LS(lspecs, 1, 1, ipv4_or_ap);
  2362. CHECK_CHOSEN_ADDR_LS(lspecs_v6, 0, 0, null_ap);
  2363. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 1, ipv4_or_ap);
  2364. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 0, ipv4_or_ap);
  2365. CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_NULL(lspecs_v6, 0);
  2366. CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_NULL(lspecs_v6, 1);
  2367. /* IPv6-only. */
  2368. memset(&mock_options, 0, sizeof(or_options_t));
  2369. mock_options.ClientUseIPv4 = 0;
  2370. mock_options.ClientUseIPv6 = 1;
  2371. CHECK_CHOSEN_ADDR_LS(lspecs, 0, 1, ipv6_or_ap);
  2372. CHECK_CHOSEN_ADDR_LS(lspecs, 1, 1, ipv6_or_ap);
  2373. CHECK_CHOSEN_ADDR_LS(lspecs_v4, 0, 0, null_ap);
  2374. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 1, ipv6_or_ap);
  2375. CHECK_HS_EXTEND_INFO_ADDR_LS(lspecs, 0, ipv4_or_ap);
  2376. CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_NULL(lspecs_v4, 1);
  2377. CHECK_HS_EXTEND_INFO_ADDR_LS_EXPECT_NULL(lspecs_v6, 0);
  2378. smartlist_free(lspecs_v4);
  2379. smartlist_free(lspecs_v6);
  2380. SMARTLIST_FOREACH(lspecs, link_specifier_t *, lspec, \
  2381. link_specifier_free(lspec)); \
  2382. smartlist_free(lspecs);
  2383. done:
  2384. UNMOCK(get_options);
  2385. }
  2386. #undef TEST_IPV4_ADDR_STR
  2387. #undef TEST_IPV6_ADDR_STR
  2388. #undef TEST_IPV4_OR_PORT
  2389. #undef TEST_IPV4_DIR_PORT
  2390. #undef TEST_IPV6_OR_PORT
  2391. #undef TEST_IPV6_DIR_PORT
  2392. #undef CHECK_CHOSEN_ADDR_RS
  2393. #undef CHECK_CHOSEN_ADDR_NODE
  2394. #undef CHECK_CHOSEN_ADDR_RN
  2395. struct testcase_t policy_tests[] = {
  2396. { "router_dump_exit_policy_to_string", test_dump_exit_policy_to_string, 0,
  2397. NULL, NULL },
  2398. { "general", test_policies_general, 0, NULL, NULL },
  2399. { "getinfo_helper_policies", test_policies_getinfo_helper_policies, 0, NULL,
  2400. NULL },
  2401. { "reject_exit_address", test_policies_reject_exit_address, 0, NULL, NULL },
  2402. { "reject_interface_address", test_policies_reject_interface_address, 0,
  2403. NULL, NULL },
  2404. { "reject_port_address", test_policies_reject_port_address, 0, NULL, NULL },
  2405. { "fascist_firewall_allows_address",
  2406. test_policies_fascist_firewall_allows_address, 0, NULL, NULL },
  2407. { "fascist_firewall_choose_address",
  2408. test_policies_fascist_firewall_choose_address, 0, NULL, NULL },
  2409. END_OF_TESTCASES
  2410. };