test_controller.c 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824
  1. /* Copyright (c) 2015-2019, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define CONTROL_CMD_PRIVATE
  4. #define CONTROL_GETINFO_PRIVATE
  5. #include "core/or/or.h"
  6. #include "lib/crypt_ops/crypto_ed25519.h"
  7. #include "feature/client/bridges.h"
  8. #include "feature/control/control.h"
  9. #include "feature/control/control_cmd.h"
  10. #include "feature/control/control_getinfo.h"
  11. #include "feature/client/entrynodes.h"
  12. #include "feature/hs/hs_common.h"
  13. #include "feature/nodelist/networkstatus.h"
  14. #include "feature/rend/rendservice.h"
  15. #include "feature/nodelist/authcert.h"
  16. #include "feature/nodelist/nodelist.h"
  17. #include "test/test.h"
  18. #include "test/test_helpers.h"
  19. #include "lib/net/resolve.h"
  20. #include "lib/encoding/confline.h"
  21. #include "lib/encoding/kvline.h"
  22. #include "feature/control/control_connection_st.h"
  23. #include "feature/control/control_cmd_args_st.h"
  24. #include "feature/dirclient/download_status_st.h"
  25. #include "feature/nodelist/microdesc_st.h"
  26. #include "feature/nodelist/node_st.h"
  27. typedef struct {
  28. const char *input;
  29. const char *expected_parse;
  30. const char *expected_error;
  31. } parser_testcase_t;
  32. typedef struct {
  33. const control_cmd_syntax_t *syntax;
  34. size_t n_testcases;
  35. const parser_testcase_t *testcases;
  36. } parse_test_params_t;
  37. static char *
  38. control_cmd_dump_args(const control_cmd_args_t *result)
  39. {
  40. buf_t *buf = buf_new();
  41. buf_add_string(buf, "{ args=[");
  42. if (result->args) {
  43. if (smartlist_len(result->args)) {
  44. buf_add_string(buf, " ");
  45. }
  46. SMARTLIST_FOREACH_BEGIN(result->args, const char *, s) {
  47. const bool last = (s_sl_idx == smartlist_len(result->args)-1);
  48. buf_add_printf(buf, "%s%s ",
  49. escaped(s),
  50. last ? "" : ",");
  51. } SMARTLIST_FOREACH_END(s);
  52. }
  53. buf_add_string(buf, "]");
  54. if (result->cmddata) {
  55. buf_add_string(buf, ", obj=");
  56. buf_add_string(buf, escaped(result->cmddata));
  57. }
  58. if (result->kwargs) {
  59. buf_add_string(buf, ", { ");
  60. const config_line_t *line;
  61. for (line = result->kwargs; line; line = line->next) {
  62. const bool last = (line->next == NULL);
  63. buf_add_printf(buf, "%s=%s%s ", line->key, escaped(line->value),
  64. last ? "" : ",");
  65. }
  66. buf_add_string(buf, "}");
  67. }
  68. buf_add_string(buf, " }");
  69. char *encoded = buf_extract(buf, NULL);
  70. buf_free(buf);
  71. return encoded;
  72. }
  73. static void
  74. test_controller_parse_cmd(void *arg)
  75. {
  76. const parse_test_params_t *params = arg;
  77. control_cmd_args_t *result = NULL;
  78. char *error = NULL;
  79. char *encoded = NULL;
  80. for (size_t i = 0; i < params->n_testcases; ++i) {
  81. const parser_testcase_t *t = &params->testcases[i];
  82. result = control_cmd_parse_args("EXAMPLE",
  83. params->syntax,
  84. strlen(t->input),
  85. t->input,
  86. &error);
  87. // A valid test should expect exactly one parse or error.
  88. tt_int_op((t->expected_parse == NULL), OP_NE,
  89. (t->expected_error == NULL));
  90. // We get a result or an error, not both.
  91. tt_int_op((result == NULL), OP_EQ, (error != NULL));
  92. // We got the one we expected.
  93. tt_int_op((result == NULL), OP_EQ, (t->expected_parse == NULL));
  94. if (result) {
  95. encoded = control_cmd_dump_args(result);
  96. tt_str_op(encoded, OP_EQ, t->expected_parse);
  97. } else {
  98. tt_str_op(error, OP_EQ, t->expected_error);
  99. }
  100. tor_free(error);
  101. tor_free(encoded);
  102. control_cmd_args_free(result);
  103. }
  104. done:
  105. tor_free(error);
  106. tor_free(encoded);
  107. control_cmd_args_free(result);
  108. }
  109. #define OK(inp, out) \
  110. { inp "\r\n", out, NULL }
  111. #define ERR(inp, err) \
  112. { inp "\r\n", NULL, err }
  113. #define TESTPARAMS(syntax, array) \
  114. { &syntax, \
  115. ARRAY_LENGTH(array), \
  116. array }
  117. static const parser_testcase_t one_to_three_tests[] = {
  118. ERR("", "Need at least 1 argument(s)"),
  119. ERR(" \t", "Need at least 1 argument(s)"),
  120. OK("hello", "{ args=[ \"hello\" ] }"),
  121. OK("hello world", "{ args=[ \"hello\", \"world\" ] }"),
  122. OK("hello world", "{ args=[ \"hello\", \"world\" ] }"),
  123. OK(" hello world", "{ args=[ \"hello\", \"world\" ] }"),
  124. OK(" hello world ", "{ args=[ \"hello\", \"world\" ] }"),
  125. OK("hello there world", "{ args=[ \"hello\", \"there\", \"world\" ] }"),
  126. ERR("why hello there world", "Cannot accept more than 3 argument(s)"),
  127. ERR("hello\r\nworld.\r\n.", "Unexpected body"),
  128. };
  129. static const control_cmd_syntax_t one_to_three_syntax = {
  130. .min_args=1, .max_args=3
  131. };
  132. static const parse_test_params_t parse_one_to_three_params =
  133. TESTPARAMS( one_to_three_syntax, one_to_three_tests );
  134. // =
  135. static const parser_testcase_t no_args_one_obj_tests[] = {
  136. ERR("Hi there!\r\n.", "Cannot accept more than 0 argument(s)"),
  137. ERR("", "Empty body"),
  138. OK("\r\n", "{ args=[], obj=\"\\n\" }"),
  139. OK("\r\nHello world\r\n", "{ args=[], obj=\"Hello world\\n\\n\" }"),
  140. OK("\r\nHello\r\nworld\r\n", "{ args=[], obj=\"Hello\\nworld\\n\\n\" }"),
  141. OK("\r\nHello\r\n..\r\nworld\r\n",
  142. "{ args=[], obj=\"Hello\\n.\\nworld\\n\\n\" }"),
  143. };
  144. static const control_cmd_syntax_t no_args_one_obj_syntax = {
  145. .min_args=0, .max_args=0,
  146. .want_cmddata=true,
  147. };
  148. static const parse_test_params_t parse_no_args_one_obj_params =
  149. TESTPARAMS( no_args_one_obj_syntax, no_args_one_obj_tests );
  150. static const parser_testcase_t no_args_kwargs_tests[] = {
  151. OK("", "{ args=[] }"),
  152. OK(" ", "{ args=[] }"),
  153. OK("hello there=world", "{ args=[], { hello=\"\", there=\"world\" } }"),
  154. OK("hello there=world today",
  155. "{ args=[], { hello=\"\", there=\"world\", today=\"\" } }"),
  156. ERR("=Foo", "Cannot parse keyword argument(s)"),
  157. };
  158. static const control_cmd_syntax_t no_args_kwargs_syntax = {
  159. .min_args=0, .max_args=0,
  160. .accept_keywords=true,
  161. .kvline_flags=KV_OMIT_VALS
  162. };
  163. static const parse_test_params_t parse_no_args_kwargs_params =
  164. TESTPARAMS( no_args_kwargs_syntax, no_args_kwargs_tests );
  165. static const char *one_arg_kwargs_allow_keywords[] = {
  166. "Hello", "world", NULL
  167. };
  168. static const parser_testcase_t one_arg_kwargs_tests[] = {
  169. ERR("", "Need at least 1 argument(s)"),
  170. OK("Hi", "{ args=[ \"Hi\" ] }"),
  171. ERR("hello there=world", "Unrecognized keyword argument \"there\""),
  172. OK("Hi HELLO=foo", "{ args=[ \"Hi\" ], { HELLO=\"foo\" } }"),
  173. OK("Hi world=\"bar baz\" hello ",
  174. "{ args=[ \"Hi\" ], { world=\"bar baz\", hello=\"\" } }"),
  175. };
  176. static const control_cmd_syntax_t one_arg_kwargs_syntax = {
  177. .min_args=1, .max_args=1,
  178. .accept_keywords=true,
  179. .allowed_keywords=one_arg_kwargs_allow_keywords,
  180. .kvline_flags=KV_OMIT_VALS|KV_QUOTED,
  181. };
  182. static const parse_test_params_t parse_one_arg_kwargs_params =
  183. TESTPARAMS( one_arg_kwargs_syntax, one_arg_kwargs_tests );
  184. static void
  185. test_add_onion_helper_keyarg_v3(void *arg)
  186. {
  187. int ret, hs_version;
  188. add_onion_secret_key_t pk;
  189. char *key_new_blob = NULL;
  190. char *err_msg = NULL;
  191. const char *key_new_alg = NULL;
  192. (void) arg;
  193. memset(&pk, 0, sizeof(pk));
  194. /* Test explicit ED25519-V3 key generation. */
  195. ret = add_onion_helper_keyarg("NEW:ED25519-V3", 0, &key_new_alg,
  196. &key_new_blob, &pk, &hs_version,
  197. &err_msg);
  198. tt_int_op(ret, OP_EQ, 0);
  199. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  200. tt_assert(pk.v3);
  201. tt_str_op(key_new_alg, OP_EQ, "ED25519-V3");
  202. tt_assert(key_new_blob);
  203. tt_ptr_op(err_msg, OP_EQ, NULL);
  204. tor_free(pk.v3); pk.v3 = NULL;
  205. tor_free(key_new_blob);
  206. /* Test discarding the private key. */
  207. ret = add_onion_helper_keyarg("NEW:ED25519-V3", 1, &key_new_alg,
  208. &key_new_blob, &pk, &hs_version,
  209. &err_msg);
  210. tt_int_op(ret, OP_EQ, 0);
  211. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  212. tt_assert(pk.v3);
  213. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  214. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  215. tt_ptr_op(err_msg, OP_EQ, NULL);
  216. tor_free(pk.v3); pk.v3 = NULL;
  217. tor_free(key_new_blob);
  218. /* Test passing a key blob. */
  219. {
  220. /* The base64 key and hex key are the same. Hex key is 64 bytes long. The
  221. * sk has been generated randomly using python3. */
  222. const char *base64_sk =
  223. "a9bT19PqGC9Y+BmOo1IQvCGjjwxMiaaxEXZ+FKMxpEQW"
  224. "6AmSV5roThUGMRCaqQSCnR2jI1vL2QxHORzI4RxMmw==";
  225. const char *hex_sk =
  226. "\x6b\xd6\xd3\xd7\xd3\xea\x18\x2f\x58\xf8\x19\x8e\xa3\x52\x10\xbc"
  227. "\x21\xa3\x8f\x0c\x4c\x89\xa6\xb1\x11\x76\x7e\x14\xa3\x31\xa4\x44"
  228. "\x16\xe8\x09\x92\x57\x9a\xe8\x4e\x15\x06\x31\x10\x9a\xa9\x04\x82"
  229. "\x9d\x1d\xa3\x23\x5b\xcb\xd9\x0c\x47\x39\x1c\xc8\xe1\x1c\x4c\x9b";
  230. char *key_blob = NULL;
  231. tor_asprintf(&key_blob, "ED25519-V3:%s", base64_sk);
  232. tt_assert(key_blob);
  233. ret = add_onion_helper_keyarg(key_blob, 1, &key_new_alg,
  234. &key_new_blob, &pk, &hs_version,
  235. &err_msg);
  236. tor_free(key_blob);
  237. tt_int_op(ret, OP_EQ, 0);
  238. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  239. tt_assert(pk.v3);
  240. tt_mem_op(pk.v3, OP_EQ, hex_sk, 64);
  241. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  242. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  243. tt_ptr_op(err_msg, OP_EQ, NULL);
  244. tor_free(pk.v3); pk.v3 = NULL;
  245. tor_free(key_new_blob);
  246. }
  247. done:
  248. tor_free(pk.v3);
  249. tor_free(key_new_blob);
  250. tor_free(err_msg);
  251. }
  252. static void
  253. test_add_onion_helper_keyarg_v2(void *arg)
  254. {
  255. int ret, hs_version;
  256. add_onion_secret_key_t pk;
  257. crypto_pk_t *pk1 = NULL;
  258. const char *key_new_alg = NULL;
  259. char *key_new_blob = NULL;
  260. char *err_msg = NULL;
  261. char *encoded = NULL;
  262. char *arg_str = NULL;
  263. (void) arg;
  264. memset(&pk, 0, sizeof(pk));
  265. /* Test explicit RSA1024 key generation. */
  266. ret = add_onion_helper_keyarg("NEW:RSA1024", 0, &key_new_alg, &key_new_blob,
  267. &pk, &hs_version, &err_msg);
  268. tt_int_op(ret, OP_EQ, 0);
  269. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  270. tt_assert(pk.v2);
  271. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  272. tt_assert(key_new_blob);
  273. tt_ptr_op(err_msg, OP_EQ, NULL);
  274. /* Test "BEST" key generation (Assumes BEST = RSA1024). */
  275. crypto_pk_free(pk.v2); pk.v2 = NULL;
  276. tor_free(key_new_blob);
  277. ret = add_onion_helper_keyarg("NEW:BEST", 0, &key_new_alg, &key_new_blob,
  278. &pk, &hs_version, &err_msg);
  279. tt_int_op(ret, OP_EQ, 0);
  280. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  281. tt_assert(pk.v2);
  282. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  283. tt_assert(key_new_blob);
  284. tt_ptr_op(err_msg, OP_EQ, NULL);
  285. /* Test discarding the private key. */
  286. crypto_pk_free(pk.v2); pk.v2 = NULL;
  287. tor_free(key_new_blob);
  288. ret = add_onion_helper_keyarg("NEW:BEST", 1, &key_new_alg, &key_new_blob,
  289. &pk, &hs_version, &err_msg);
  290. tt_int_op(ret, OP_EQ, 0);
  291. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  292. tt_assert(pk.v2);
  293. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  294. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  295. tt_ptr_op(err_msg, OP_EQ, NULL);
  296. /* Test generating a invalid key type. */
  297. crypto_pk_free(pk.v2); pk.v2 = NULL;
  298. ret = add_onion_helper_keyarg("NEW:RSA512", 0, &key_new_alg, &key_new_blob,
  299. &pk, &hs_version, &err_msg);
  300. tt_int_op(ret, OP_EQ, -1);
  301. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  302. tt_assert(!pk.v2);
  303. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  304. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  305. tt_assert(err_msg);
  306. /* Test loading a RSA1024 key. */
  307. tor_free(err_msg);
  308. pk1 = pk_generate(0);
  309. tt_int_op(0, OP_EQ, crypto_pk_base64_encode_private(pk1, &encoded));
  310. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  311. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  312. &pk, &hs_version, &err_msg);
  313. tt_int_op(ret, OP_EQ, 0);
  314. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  315. tt_assert(pk.v2);
  316. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  317. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  318. tt_ptr_op(err_msg, OP_EQ, NULL);
  319. tt_int_op(crypto_pk_cmp_keys(pk1, pk.v2), OP_EQ, 0);
  320. /* Test loading a invalid key type. */
  321. tor_free(arg_str);
  322. crypto_pk_free(pk1); pk1 = NULL;
  323. crypto_pk_free(pk.v2); pk.v2 = NULL;
  324. tor_asprintf(&arg_str, "RSA512:%s", encoded);
  325. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  326. &pk, &hs_version, &err_msg);
  327. tt_int_op(ret, OP_EQ, -1);
  328. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  329. tt_assert(!pk.v2);
  330. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  331. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  332. tt_assert(err_msg);
  333. /* Test loading a invalid key. */
  334. tor_free(arg_str);
  335. crypto_pk_free(pk.v2); pk.v2 = NULL;
  336. tor_free(err_msg);
  337. encoded[strlen(encoded)/2] = '\0';
  338. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  339. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  340. &pk, &hs_version, &err_msg);
  341. tt_int_op(ret, OP_EQ, -1);
  342. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  343. tt_assert(!pk.v2);
  344. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  345. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  346. tt_assert(err_msg);
  347. done:
  348. crypto_pk_free(pk1);
  349. crypto_pk_free(pk.v2);
  350. tor_free(key_new_blob);
  351. tor_free(err_msg);
  352. tor_free(encoded);
  353. tor_free(arg_str);
  354. }
  355. static void
  356. test_getinfo_helper_onion(void *arg)
  357. {
  358. (void)arg;
  359. control_connection_t dummy;
  360. /* Get results out */
  361. char *answer = NULL;
  362. const char *errmsg = NULL;
  363. char *service_id = NULL;
  364. int rt = 0;
  365. dummy.ephemeral_onion_services = NULL;
  366. /* successfully get an empty answer */
  367. rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
  368. tt_int_op(rt, OP_EQ, 0);
  369. tt_str_op(answer, OP_EQ, "");
  370. tor_free(answer);
  371. /* successfully get an empty answer */
  372. rt = getinfo_helper_onions(&dummy, "onions/detached", &answer, &errmsg);
  373. tt_int_op(rt, OP_EQ, 0);
  374. tt_str_op(answer, OP_EQ, "");
  375. tor_free(answer);
  376. /* get an answer for one onion service */
  377. service_id = tor_strdup("dummy_onion_id");
  378. dummy.ephemeral_onion_services = smartlist_new();
  379. smartlist_add(dummy.ephemeral_onion_services, service_id);
  380. rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
  381. tt_int_op(rt, OP_EQ, 0);
  382. tt_str_op(answer, OP_EQ, "dummy_onion_id");
  383. done:
  384. tor_free(answer);
  385. tor_free(service_id);
  386. smartlist_free(dummy.ephemeral_onion_services);
  387. }
  388. static void
  389. test_rend_service_parse_port_config(void *arg)
  390. {
  391. const char *sep = ",";
  392. rend_service_port_config_t *cfg = NULL;
  393. char *err_msg = NULL;
  394. (void)arg;
  395. /* Test "VIRTPORT" only. */
  396. cfg = rend_service_parse_port_config("80", sep, &err_msg);
  397. tt_assert(cfg);
  398. tt_ptr_op(err_msg, OP_EQ, NULL);
  399. /* Test "VIRTPORT,TARGET" (Target is port). */
  400. rend_service_port_config_free(cfg);
  401. cfg = rend_service_parse_port_config("80,8080", sep, &err_msg);
  402. tt_assert(cfg);
  403. tt_ptr_op(err_msg, OP_EQ, NULL);
  404. /* Test "VIRTPORT,TARGET" (Target is IPv4:port). */
  405. rend_service_port_config_free(cfg);
  406. cfg = rend_service_parse_port_config("80,192.0.2.1:8080", sep, &err_msg);
  407. tt_assert(cfg);
  408. tt_ptr_op(err_msg, OP_EQ, NULL);
  409. /* Test "VIRTPORT,TARGET" (Target is IPv6:port). */
  410. rend_service_port_config_free(cfg);
  411. cfg = rend_service_parse_port_config("80,[2001:db8::1]:8080", sep, &err_msg);
  412. tt_assert(cfg);
  413. tt_ptr_op(err_msg, OP_EQ, NULL);
  414. rend_service_port_config_free(cfg);
  415. cfg = NULL;
  416. /* XXX: Someone should add tests for AF_UNIX targets if supported. */
  417. /* Test empty config. */
  418. rend_service_port_config_free(cfg);
  419. cfg = rend_service_parse_port_config("", sep, &err_msg);
  420. tt_ptr_op(cfg, OP_EQ, NULL);
  421. tt_assert(err_msg);
  422. /* Test invalid port. */
  423. tor_free(err_msg);
  424. cfg = rend_service_parse_port_config("90001", sep, &err_msg);
  425. tt_ptr_op(cfg, OP_EQ, NULL);
  426. tt_assert(err_msg);
  427. tor_free(err_msg);
  428. /* unix port */
  429. cfg = NULL;
  430. /* quoted unix port */
  431. tor_free(err_msg);
  432. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
  433. " ", &err_msg);
  434. tt_assert(cfg);
  435. tt_ptr_op(err_msg, OP_EQ, NULL);
  436. rend_service_port_config_free(cfg);
  437. cfg = NULL;
  438. /* quoted unix port */
  439. tor_free(err_msg);
  440. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
  441. " ", &err_msg);
  442. tt_assert(cfg);
  443. tt_ptr_op(err_msg, OP_EQ, NULL);
  444. rend_service_port_config_free(cfg);
  445. cfg = NULL;
  446. /* quoted unix port, missing end quote */
  447. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar",
  448. " ", &err_msg);
  449. tt_ptr_op(cfg, OP_EQ, NULL);
  450. tt_str_op(err_msg, OP_EQ, "Couldn't process address <unix:\"/tmp/foo bar> "
  451. "from hidden service configuration");
  452. tor_free(err_msg);
  453. /* bogus IP address */
  454. MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs);
  455. cfg = rend_service_parse_port_config("100 foo!!.example.com:9000",
  456. " ", &err_msg);
  457. UNMOCK(tor_addr_lookup);
  458. tt_ptr_op(cfg, OP_EQ, NULL);
  459. tt_str_op(err_msg, OP_EQ, "Unparseable address in hidden service port "
  460. "configuration.");
  461. tor_free(err_msg);
  462. /* bogus port port */
  463. cfg = rend_service_parse_port_config("100 99999",
  464. " ", &err_msg);
  465. tt_ptr_op(cfg, OP_EQ, NULL);
  466. tt_str_op(err_msg, OP_EQ, "Unparseable or out-of-range port \"99999\" "
  467. "in hidden service port configuration.");
  468. tor_free(err_msg);
  469. /* Wrong target address and port separation */
  470. cfg = rend_service_parse_port_config("80,127.0.0.1 1234", sep,
  471. &err_msg);
  472. tt_ptr_op(cfg, OP_EQ, NULL);
  473. tt_assert(err_msg);
  474. tor_free(err_msg);
  475. done:
  476. rend_service_port_config_free(cfg);
  477. tor_free(err_msg);
  478. }
  479. static void
  480. test_add_onion_helper_clientauth(void *arg)
  481. {
  482. rend_authorized_client_t *client = NULL;
  483. char *err_msg = NULL;
  484. int created = 0;
  485. (void)arg;
  486. /* Test "ClientName" only. */
  487. client = add_onion_helper_clientauth("alice", &created, &err_msg);
  488. tt_assert(client);
  489. tt_assert(created);
  490. tt_ptr_op(err_msg, OP_EQ, NULL);
  491. rend_authorized_client_free(client);
  492. /* Test "ClientName:Blob" */
  493. client = add_onion_helper_clientauth("alice:475hGBHPlq7Mc0cRZitK/B",
  494. &created, &err_msg);
  495. tt_assert(client);
  496. tt_assert(!created);
  497. tt_ptr_op(err_msg, OP_EQ, NULL);
  498. rend_authorized_client_free(client);
  499. /* Test invalid client names */
  500. client = add_onion_helper_clientauth("no*asterisks*allowed", &created,
  501. &err_msg);
  502. tt_ptr_op(client, OP_EQ, NULL);
  503. tt_assert(err_msg);
  504. tor_free(err_msg);
  505. /* Test invalid auth cookie */
  506. client = add_onion_helper_clientauth("alice:12345", &created, &err_msg);
  507. tt_ptr_op(client, OP_EQ, NULL);
  508. tt_assert(err_msg);
  509. tor_free(err_msg);
  510. /* Test invalid syntax */
  511. client = add_onion_helper_clientauth(":475hGBHPlq7Mc0cRZitK/B", &created,
  512. &err_msg);
  513. tt_ptr_op(client, OP_EQ, NULL);
  514. tt_assert(err_msg);
  515. tor_free(err_msg);
  516. done:
  517. rend_authorized_client_free(client);
  518. tor_free(err_msg);
  519. }
  520. /* Mocks and data/variables used for GETINFO download status tests */
  521. static const download_status_t dl_status_default =
  522. { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER,
  523. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  524. static download_status_t ns_dl_status[N_CONSENSUS_FLAVORS];
  525. static download_status_t ns_dl_status_bootstrap[N_CONSENSUS_FLAVORS];
  526. static download_status_t ns_dl_status_running[N_CONSENSUS_FLAVORS];
  527. /*
  528. * These should explore all the possible cases of download_status_to_string()
  529. * in control.c
  530. */
  531. static const download_status_t dls_sample_1 =
  532. { 1467163900, 0, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER,
  533. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  534. static const char * dls_sample_1_str =
  535. "next-attempt-at 2016-06-29 01:31:40\n"
  536. "n-download-failures 0\n"
  537. "n-download-attempts 0\n"
  538. "schedule DL_SCHED_GENERIC\n"
  539. "want-authority DL_WANT_ANY_DIRSERVER\n"
  540. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  541. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  542. "last-backoff-position 0\n"
  543. "last-delay-used 0\n";
  544. static const download_status_t dls_sample_2 =
  545. { 1467164400, 1, 2, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  546. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  547. static const char * dls_sample_2_str =
  548. "next-attempt-at 2016-06-29 01:40:00\n"
  549. "n-download-failures 1\n"
  550. "n-download-attempts 2\n"
  551. "schedule DL_SCHED_CONSENSUS\n"
  552. "want-authority DL_WANT_AUTHORITY\n"
  553. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  554. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  555. "last-backoff-position 0\n"
  556. "last-delay-used 0\n";
  557. static const download_status_t dls_sample_3 =
  558. { 1467154400, 12, 25, DL_SCHED_BRIDGE, DL_WANT_ANY_DIRSERVER,
  559. DL_SCHED_INCREMENT_ATTEMPT, 0, 0 };
  560. static const char * dls_sample_3_str =
  561. "next-attempt-at 2016-06-28 22:53:20\n"
  562. "n-download-failures 12\n"
  563. "n-download-attempts 25\n"
  564. "schedule DL_SCHED_BRIDGE\n"
  565. "want-authority DL_WANT_ANY_DIRSERVER\n"
  566. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  567. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  568. "last-backoff-position 0\n"
  569. "last-delay-used 0\n";
  570. static const download_status_t dls_sample_4 =
  571. { 1467166600, 3, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER,
  572. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  573. static const char * dls_sample_4_str =
  574. "next-attempt-at 2016-06-29 02:16:40\n"
  575. "n-download-failures 3\n"
  576. "n-download-attempts 0\n"
  577. "schedule DL_SCHED_GENERIC\n"
  578. "want-authority DL_WANT_ANY_DIRSERVER\n"
  579. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  580. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  581. "last-backoff-position 0\n"
  582. "last-delay-used 0\n";
  583. static const download_status_t dls_sample_5 =
  584. { 1467164600, 3, 7, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER,
  585. DL_SCHED_INCREMENT_FAILURE, 1, 2112, };
  586. static const char * dls_sample_5_str =
  587. "next-attempt-at 2016-06-29 01:43:20\n"
  588. "n-download-failures 3\n"
  589. "n-download-attempts 7\n"
  590. "schedule DL_SCHED_CONSENSUS\n"
  591. "want-authority DL_WANT_ANY_DIRSERVER\n"
  592. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  593. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  594. "last-backoff-position 1\n"
  595. "last-delay-used 2112\n";
  596. static const download_status_t dls_sample_6 =
  597. { 1467164200, 4, 9, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  598. DL_SCHED_INCREMENT_ATTEMPT, 3, 432 };
  599. static const char * dls_sample_6_str =
  600. "next-attempt-at 2016-06-29 01:36:40\n"
  601. "n-download-failures 4\n"
  602. "n-download-attempts 9\n"
  603. "schedule DL_SCHED_CONSENSUS\n"
  604. "want-authority DL_WANT_AUTHORITY\n"
  605. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  606. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  607. "last-backoff-position 3\n"
  608. "last-delay-used 432\n";
  609. /* Simulated auth certs */
  610. static const char *auth_id_digest_1_str =
  611. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061";
  612. static download_status_t auth_def_cert_download_status_1;
  613. static const char *auth_id_digest_2_str =
  614. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99";
  615. static download_status_t auth_def_cert_download_status_2;
  616. /* Expected form of digest list returned for GETINFO downloads/cert/fps */
  617. static const char *auth_id_digest_expected_list =
  618. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061\n"
  619. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99\n";
  620. /* Signing keys for simulated auth 1 */
  621. static const char *auth_1_sk_1_str =
  622. "AA69566029B1F023BA09451B8F1B10952384EB58";
  623. static download_status_t auth_1_sk_1_dls;
  624. static const char *auth_1_sk_2_str =
  625. "710865C7F06B73C5292695A8C34F1C94F769FF72";
  626. static download_status_t auth_1_sk_2_dls;
  627. /*
  628. * Expected form of sk digest list for
  629. * GETINFO downloads/cert/<auth_id_digest_1_str>/sks
  630. */
  631. static const char *auth_1_sk_digest_expected_list =
  632. "AA69566029B1F023BA09451B8F1B10952384EB58\n"
  633. "710865C7F06B73C5292695A8C34F1C94F769FF72\n";
  634. /* Signing keys for simulated auth 2 */
  635. static const char *auth_2_sk_1_str =
  636. "4299047E00D070AD6703FE00BE7AA756DB061E62";
  637. static download_status_t auth_2_sk_1_dls;
  638. static const char *auth_2_sk_2_str =
  639. "9451B8F1B10952384EB58B5F230C0BB701626C9B";
  640. static download_status_t auth_2_sk_2_dls;
  641. /*
  642. * Expected form of sk digest list for
  643. * GETINFO downloads/cert/<auth_id_digest_2_str>/sks
  644. */
  645. static const char *auth_2_sk_digest_expected_list =
  646. "4299047E00D070AD6703FE00BE7AA756DB061E62\n"
  647. "9451B8F1B10952384EB58B5F230C0BB701626C9B\n";
  648. /* Simulated router descriptor digests or bridge identity digests */
  649. static const char *descbr_digest_1_str =
  650. "616408544C7345822696074A1A3DFA16AB381CBD";
  651. static download_status_t descbr_digest_1_dl;
  652. static const char *descbr_digest_2_str =
  653. "06E8067246967265DBCB6641631B530EFEC12DC3";
  654. static download_status_t descbr_digest_2_dl;
  655. /* Expected form of digest list returned for GETINFO downloads/desc/descs */
  656. static const char *descbr_expected_list =
  657. "616408544C7345822696074A1A3DFA16AB381CBD\n"
  658. "06E8067246967265DBCB6641631B530EFEC12DC3\n";
  659. /*
  660. * Flag to make all descbr queries fail, to simulate not being
  661. * configured such that such queries make sense.
  662. */
  663. static int disable_descbr = 0;
  664. static void
  665. reset_mocked_dl_statuses(void)
  666. {
  667. int i;
  668. for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) {
  669. memcpy(&(ns_dl_status[i]), &dl_status_default,
  670. sizeof(download_status_t));
  671. memcpy(&(ns_dl_status_bootstrap[i]), &dl_status_default,
  672. sizeof(download_status_t));
  673. memcpy(&(ns_dl_status_running[i]), &dl_status_default,
  674. sizeof(download_status_t));
  675. }
  676. memcpy(&auth_def_cert_download_status_1, &dl_status_default,
  677. sizeof(download_status_t));
  678. memcpy(&auth_def_cert_download_status_2, &dl_status_default,
  679. sizeof(download_status_t));
  680. memcpy(&auth_1_sk_1_dls, &dl_status_default,
  681. sizeof(download_status_t));
  682. memcpy(&auth_1_sk_2_dls, &dl_status_default,
  683. sizeof(download_status_t));
  684. memcpy(&auth_2_sk_1_dls, &dl_status_default,
  685. sizeof(download_status_t));
  686. memcpy(&auth_2_sk_2_dls, &dl_status_default,
  687. sizeof(download_status_t));
  688. memcpy(&descbr_digest_1_dl, &dl_status_default,
  689. sizeof(download_status_t));
  690. memcpy(&descbr_digest_2_dl, &dl_status_default,
  691. sizeof(download_status_t));
  692. }
  693. static download_status_t *
  694. ns_dl_status_mock(consensus_flavor_t flavor)
  695. {
  696. return &(ns_dl_status[flavor]);
  697. }
  698. static download_status_t *
  699. ns_dl_status_bootstrap_mock(consensus_flavor_t flavor)
  700. {
  701. return &(ns_dl_status_bootstrap[flavor]);
  702. }
  703. static download_status_t *
  704. ns_dl_status_running_mock(consensus_flavor_t flavor)
  705. {
  706. return &(ns_dl_status_running[flavor]);
  707. }
  708. static void
  709. setup_ns_mocks(void)
  710. {
  711. MOCK(networkstatus_get_dl_status_by_flavor, ns_dl_status_mock);
  712. MOCK(networkstatus_get_dl_status_by_flavor_bootstrap,
  713. ns_dl_status_bootstrap_mock);
  714. MOCK(networkstatus_get_dl_status_by_flavor_running,
  715. ns_dl_status_running_mock);
  716. reset_mocked_dl_statuses();
  717. }
  718. static void
  719. clear_ns_mocks(void)
  720. {
  721. UNMOCK(networkstatus_get_dl_status_by_flavor);
  722. UNMOCK(networkstatus_get_dl_status_by_flavor_bootstrap);
  723. UNMOCK(networkstatus_get_dl_status_by_flavor_running);
  724. }
  725. static smartlist_t *
  726. cert_dl_status_auth_ids_mock(void)
  727. {
  728. char digest[DIGEST_LEN], *tmp;
  729. int len;
  730. smartlist_t *list = NULL;
  731. /* Just pretend we have only the two hard-coded digests listed above */
  732. list = smartlist_new();
  733. len = base16_decode(digest, DIGEST_LEN,
  734. auth_id_digest_1_str, strlen(auth_id_digest_1_str));
  735. tt_int_op(len, OP_EQ, DIGEST_LEN);
  736. tmp = tor_malloc(DIGEST_LEN);
  737. memcpy(tmp, digest, DIGEST_LEN);
  738. smartlist_add(list, tmp);
  739. len = base16_decode(digest, DIGEST_LEN,
  740. auth_id_digest_2_str, strlen(auth_id_digest_2_str));
  741. tt_int_op(len, OP_EQ, DIGEST_LEN);
  742. tmp = tor_malloc(DIGEST_LEN);
  743. memcpy(tmp, digest, DIGEST_LEN);
  744. smartlist_add(list, tmp);
  745. done:
  746. return list;
  747. }
  748. static download_status_t *
  749. cert_dl_status_def_for_auth_mock(const char *digest)
  750. {
  751. download_status_t *dl = NULL;
  752. char digest_str[HEX_DIGEST_LEN+1];
  753. tt_ptr_op(digest, OP_NE, NULL);
  754. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  755. digest, DIGEST_LEN);
  756. digest_str[HEX_DIGEST_LEN] = '\0';
  757. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  758. dl = &auth_def_cert_download_status_1;
  759. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  760. dl = &auth_def_cert_download_status_2;
  761. }
  762. done:
  763. return dl;
  764. }
  765. static smartlist_t *
  766. cert_dl_status_sks_for_auth_id_mock(const char *digest)
  767. {
  768. smartlist_t *list = NULL;
  769. char sk[DIGEST_LEN];
  770. char digest_str[HEX_DIGEST_LEN+1];
  771. char *tmp;
  772. int len;
  773. tt_ptr_op(digest, OP_NE, NULL);
  774. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  775. digest, DIGEST_LEN);
  776. digest_str[HEX_DIGEST_LEN] = '\0';
  777. /*
  778. * Build a list of two hard-coded digests, depending on what we
  779. * were just passed.
  780. */
  781. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  782. list = smartlist_new();
  783. len = base16_decode(sk, DIGEST_LEN,
  784. auth_1_sk_1_str, strlen(auth_1_sk_1_str));
  785. tt_int_op(len, OP_EQ, DIGEST_LEN);
  786. tmp = tor_malloc(DIGEST_LEN);
  787. memcpy(tmp, sk, DIGEST_LEN);
  788. smartlist_add(list, tmp);
  789. len = base16_decode(sk, DIGEST_LEN,
  790. auth_1_sk_2_str, strlen(auth_1_sk_2_str));
  791. tt_int_op(len, OP_EQ, DIGEST_LEN);
  792. tmp = tor_malloc(DIGEST_LEN);
  793. memcpy(tmp, sk, DIGEST_LEN);
  794. smartlist_add(list, tmp);
  795. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  796. list = smartlist_new();
  797. len = base16_decode(sk, DIGEST_LEN,
  798. auth_2_sk_1_str, strlen(auth_2_sk_1_str));
  799. tt_int_op(len, OP_EQ, DIGEST_LEN);
  800. tmp = tor_malloc(DIGEST_LEN);
  801. memcpy(tmp, sk, DIGEST_LEN);
  802. smartlist_add(list, tmp);
  803. len = base16_decode(sk, DIGEST_LEN,
  804. auth_2_sk_2_str, strlen(auth_2_sk_2_str));
  805. tt_int_op(len, OP_EQ, DIGEST_LEN);
  806. tmp = tor_malloc(DIGEST_LEN);
  807. memcpy(tmp, sk, DIGEST_LEN);
  808. smartlist_add(list, tmp);
  809. }
  810. done:
  811. return list;
  812. }
  813. static download_status_t *
  814. cert_dl_status_fp_sk_mock(const char *fp_digest, const char *sk_digest)
  815. {
  816. download_status_t *dl = NULL;
  817. char fp_digest_str[HEX_DIGEST_LEN+1], sk_digest_str[HEX_DIGEST_LEN+1];
  818. /*
  819. * Unpack the digests so we can compare them and figure out which
  820. * dl status we want.
  821. */
  822. tt_ptr_op(fp_digest, OP_NE, NULL);
  823. base16_encode(fp_digest_str, HEX_DIGEST_LEN + 1,
  824. fp_digest, DIGEST_LEN);
  825. fp_digest_str[HEX_DIGEST_LEN] = '\0';
  826. tt_ptr_op(sk_digest, OP_NE, NULL);
  827. base16_encode(sk_digest_str, HEX_DIGEST_LEN + 1,
  828. sk_digest, DIGEST_LEN);
  829. sk_digest_str[HEX_DIGEST_LEN] = '\0';
  830. if (strcmp(fp_digest_str, auth_id_digest_1_str) == 0) {
  831. if (strcmp(sk_digest_str, auth_1_sk_1_str) == 0) {
  832. dl = &auth_1_sk_1_dls;
  833. } else if (strcmp(sk_digest_str, auth_1_sk_2_str) == 0) {
  834. dl = &auth_1_sk_2_dls;
  835. }
  836. } else if (strcmp(fp_digest_str, auth_id_digest_2_str) == 0) {
  837. if (strcmp(sk_digest_str, auth_2_sk_1_str) == 0) {
  838. dl = &auth_2_sk_1_dls;
  839. } else if (strcmp(sk_digest_str, auth_2_sk_2_str) == 0) {
  840. dl = &auth_2_sk_2_dls;
  841. }
  842. }
  843. done:
  844. return dl;
  845. }
  846. static void
  847. setup_cert_mocks(void)
  848. {
  849. MOCK(list_authority_ids_with_downloads, cert_dl_status_auth_ids_mock);
  850. MOCK(id_only_download_status_for_authority_id,
  851. cert_dl_status_def_for_auth_mock);
  852. MOCK(list_sk_digests_for_authority_id,
  853. cert_dl_status_sks_for_auth_id_mock);
  854. MOCK(download_status_for_authority_id_and_sk,
  855. cert_dl_status_fp_sk_mock);
  856. reset_mocked_dl_statuses();
  857. }
  858. static void
  859. clear_cert_mocks(void)
  860. {
  861. UNMOCK(list_authority_ids_with_downloads);
  862. UNMOCK(id_only_download_status_for_authority_id);
  863. UNMOCK(list_sk_digests_for_authority_id);
  864. UNMOCK(download_status_for_authority_id_and_sk);
  865. }
  866. static smartlist_t *
  867. descbr_get_digests_mock(void)
  868. {
  869. char digest[DIGEST_LEN], *tmp;
  870. int len;
  871. smartlist_t *list = NULL;
  872. if (!disable_descbr) {
  873. /* Just pretend we have only the two hard-coded digests listed above */
  874. list = smartlist_new();
  875. len = base16_decode(digest, DIGEST_LEN,
  876. descbr_digest_1_str, strlen(descbr_digest_1_str));
  877. tt_int_op(len, OP_EQ, DIGEST_LEN);
  878. tmp = tor_malloc(DIGEST_LEN);
  879. memcpy(tmp, digest, DIGEST_LEN);
  880. smartlist_add(list, tmp);
  881. len = base16_decode(digest, DIGEST_LEN,
  882. descbr_digest_2_str, strlen(descbr_digest_2_str));
  883. tt_int_op(len, OP_EQ, DIGEST_LEN);
  884. tmp = tor_malloc(DIGEST_LEN);
  885. memcpy(tmp, digest, DIGEST_LEN);
  886. smartlist_add(list, tmp);
  887. }
  888. done:
  889. return list;
  890. }
  891. static download_status_t *
  892. descbr_get_dl_by_digest_mock(const char *digest)
  893. {
  894. download_status_t *dl = NULL;
  895. char digest_str[HEX_DIGEST_LEN+1];
  896. if (!disable_descbr) {
  897. tt_ptr_op(digest, OP_NE, NULL);
  898. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  899. digest, DIGEST_LEN);
  900. digest_str[HEX_DIGEST_LEN] = '\0';
  901. if (strcmp(digest_str, descbr_digest_1_str) == 0) {
  902. dl = &descbr_digest_1_dl;
  903. } else if (strcmp(digest_str, descbr_digest_2_str) == 0) {
  904. dl = &descbr_digest_2_dl;
  905. }
  906. }
  907. done:
  908. return dl;
  909. }
  910. static void
  911. setup_desc_mocks(void)
  912. {
  913. MOCK(router_get_descriptor_digests,
  914. descbr_get_digests_mock);
  915. MOCK(router_get_dl_status_by_descriptor_digest,
  916. descbr_get_dl_by_digest_mock);
  917. reset_mocked_dl_statuses();
  918. }
  919. static void
  920. clear_desc_mocks(void)
  921. {
  922. UNMOCK(router_get_descriptor_digests);
  923. UNMOCK(router_get_dl_status_by_descriptor_digest);
  924. }
  925. static void
  926. setup_bridge_mocks(void)
  927. {
  928. disable_descbr = 0;
  929. MOCK(list_bridge_identities,
  930. descbr_get_digests_mock);
  931. MOCK(get_bridge_dl_status_by_id,
  932. descbr_get_dl_by_digest_mock);
  933. reset_mocked_dl_statuses();
  934. }
  935. static void
  936. clear_bridge_mocks(void)
  937. {
  938. UNMOCK(list_bridge_identities);
  939. UNMOCK(get_bridge_dl_status_by_id);
  940. disable_descbr = 0;
  941. }
  942. static void
  943. test_download_status_consensus(void *arg)
  944. {
  945. /* We just need one of these to pass, it doesn't matter what's in it */
  946. control_connection_t dummy;
  947. /* Get results out */
  948. char *answer = NULL;
  949. const char *errmsg = NULL;
  950. (void)arg;
  951. /* Check that the unknown prefix case works; no mocks needed yet */
  952. getinfo_helper_downloads(&dummy, "downloads/foo", &answer, &errmsg);
  953. tt_ptr_op(answer, OP_EQ, NULL);
  954. tt_str_op(errmsg, OP_EQ, "Unknown download status query");
  955. setup_ns_mocks();
  956. /*
  957. * Check returning serialized dlstatuses, and implicitly also test
  958. * download_status_to_string().
  959. */
  960. /* Case 1 default/FLAV_NS*/
  961. memcpy(&(ns_dl_status[FLAV_NS]), &dls_sample_1,
  962. sizeof(download_status_t));
  963. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns",
  964. &answer, &errmsg);
  965. tt_ptr_op(answer, OP_NE, NULL);
  966. tt_ptr_op(errmsg, OP_EQ, NULL);
  967. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  968. tor_free(answer);
  969. errmsg = NULL;
  970. /* Case 2 default/FLAV_MICRODESC */
  971. memcpy(&(ns_dl_status[FLAV_MICRODESC]), &dls_sample_2,
  972. sizeof(download_status_t));
  973. getinfo_helper_downloads(&dummy, "downloads/networkstatus/microdesc",
  974. &answer, &errmsg);
  975. tt_ptr_op(answer, OP_NE, NULL);
  976. tt_ptr_op(errmsg, OP_EQ, NULL);
  977. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  978. tor_free(answer);
  979. errmsg = NULL;
  980. /* Case 3 bootstrap/FLAV_NS */
  981. memcpy(&(ns_dl_status_bootstrap[FLAV_NS]), &dls_sample_3,
  982. sizeof(download_status_t));
  983. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns/bootstrap",
  984. &answer, &errmsg);
  985. tt_ptr_op(answer, OP_NE, NULL);
  986. tt_ptr_op(errmsg, OP_EQ, NULL);
  987. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  988. tor_free(answer);
  989. errmsg = NULL;
  990. /* Case 4 bootstrap/FLAV_MICRODESC */
  991. memcpy(&(ns_dl_status_bootstrap[FLAV_MICRODESC]), &dls_sample_4,
  992. sizeof(download_status_t));
  993. getinfo_helper_downloads(&dummy,
  994. "downloads/networkstatus/microdesc/bootstrap",
  995. &answer, &errmsg);
  996. tt_ptr_op(answer, OP_NE, NULL);
  997. tt_ptr_op(errmsg, OP_EQ, NULL);
  998. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  999. tor_free(answer);
  1000. errmsg = NULL;
  1001. /* Case 5 running/FLAV_NS */
  1002. memcpy(&(ns_dl_status_running[FLAV_NS]), &dls_sample_5,
  1003. sizeof(download_status_t));
  1004. getinfo_helper_downloads(&dummy,
  1005. "downloads/networkstatus/ns/running",
  1006. &answer, &errmsg);
  1007. tt_ptr_op(answer, OP_NE, NULL);
  1008. tt_ptr_op(errmsg, OP_EQ, NULL);
  1009. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  1010. tor_free(answer);
  1011. errmsg = NULL;
  1012. /* Case 6 running/FLAV_MICRODESC */
  1013. memcpy(&(ns_dl_status_running[FLAV_MICRODESC]), &dls_sample_6,
  1014. sizeof(download_status_t));
  1015. getinfo_helper_downloads(&dummy,
  1016. "downloads/networkstatus/microdesc/running",
  1017. &answer, &errmsg);
  1018. tt_ptr_op(answer, OP_NE, NULL);
  1019. tt_ptr_op(errmsg, OP_EQ, NULL);
  1020. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  1021. tor_free(answer);
  1022. errmsg = NULL;
  1023. /* Now check the error case */
  1024. getinfo_helper_downloads(&dummy, "downloads/networkstatus/foo",
  1025. &answer, &errmsg);
  1026. tt_ptr_op(answer, OP_EQ, NULL);
  1027. tt_ptr_op(errmsg, OP_NE, NULL);
  1028. tt_str_op(errmsg, OP_EQ, "Unknown flavor");
  1029. errmsg = NULL;
  1030. done:
  1031. clear_ns_mocks();
  1032. tor_free(answer);
  1033. return;
  1034. }
  1035. static void
  1036. test_download_status_cert(void *arg)
  1037. {
  1038. /* We just need one of these to pass, it doesn't matter what's in it */
  1039. control_connection_t dummy;
  1040. /* Get results out */
  1041. char *question = NULL;
  1042. char *answer = NULL;
  1043. const char *errmsg = NULL;
  1044. (void)arg;
  1045. setup_cert_mocks();
  1046. /*
  1047. * Check returning serialized dlstatuses and digest lists, and implicitly
  1048. * also test download_status_to_string() and digest_list_to_string().
  1049. */
  1050. /* Case 1 - list of authority identity fingerprints */
  1051. getinfo_helper_downloads(&dummy,
  1052. "downloads/cert/fps",
  1053. &answer, &errmsg);
  1054. tt_ptr_op(answer, OP_NE, NULL);
  1055. tt_ptr_op(errmsg, OP_EQ, NULL);
  1056. tt_str_op(answer, OP_EQ, auth_id_digest_expected_list);
  1057. tor_free(answer);
  1058. errmsg = NULL;
  1059. /* Case 2 - download status for default cert for 1st auth id */
  1060. memcpy(&auth_def_cert_download_status_1, &dls_sample_1,
  1061. sizeof(download_status_t));
  1062. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_1_str);
  1063. tt_ptr_op(question, OP_NE, NULL);
  1064. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1065. tt_ptr_op(answer, OP_NE, NULL);
  1066. tt_ptr_op(errmsg, OP_EQ, NULL);
  1067. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  1068. tor_free(question);
  1069. tor_free(answer);
  1070. errmsg = NULL;
  1071. /* Case 3 - download status for default cert for 2nd auth id */
  1072. memcpy(&auth_def_cert_download_status_2, &dls_sample_2,
  1073. sizeof(download_status_t));
  1074. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_2_str);
  1075. tt_ptr_op(question, OP_NE, NULL);
  1076. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1077. tt_ptr_op(answer, OP_NE, NULL);
  1078. tt_ptr_op(errmsg, OP_EQ, NULL);
  1079. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  1080. tor_free(question);
  1081. tor_free(answer);
  1082. errmsg = NULL;
  1083. /* Case 4 - list of signing key digests for 1st auth id */
  1084. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_1_str);
  1085. tt_ptr_op(question, OP_NE, NULL);
  1086. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1087. tt_ptr_op(answer, OP_NE, NULL);
  1088. tt_ptr_op(errmsg, OP_EQ, NULL);
  1089. tt_str_op(answer, OP_EQ, auth_1_sk_digest_expected_list);
  1090. tor_free(question);
  1091. tor_free(answer);
  1092. errmsg = NULL;
  1093. /* Case 5 - list of signing key digests for 2nd auth id */
  1094. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_2_str);
  1095. tt_ptr_op(question, OP_NE, NULL);
  1096. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1097. tt_ptr_op(answer, OP_NE, NULL);
  1098. tt_ptr_op(errmsg, OP_EQ, NULL);
  1099. tt_str_op(answer, OP_EQ, auth_2_sk_digest_expected_list);
  1100. tor_free(question);
  1101. tor_free(answer);
  1102. errmsg = NULL;
  1103. /* Case 6 - download status for 1st auth id, 1st sk */
  1104. memcpy(&auth_1_sk_1_dls, &dls_sample_3,
  1105. sizeof(download_status_t));
  1106. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  1107. auth_id_digest_1_str, auth_1_sk_1_str);
  1108. tt_ptr_op(question, OP_NE, NULL);
  1109. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1110. tt_ptr_op(answer, OP_NE, NULL);
  1111. tt_ptr_op(errmsg, OP_EQ, NULL);
  1112. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  1113. tor_free(question);
  1114. tor_free(answer);
  1115. errmsg = NULL;
  1116. /* Case 7 - download status for 1st auth id, 2nd sk */
  1117. memcpy(&auth_1_sk_2_dls, &dls_sample_4,
  1118. sizeof(download_status_t));
  1119. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  1120. auth_id_digest_1_str, auth_1_sk_2_str);
  1121. tt_ptr_op(question, OP_NE, NULL);
  1122. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1123. tt_ptr_op(answer, OP_NE, NULL);
  1124. tt_ptr_op(errmsg, OP_EQ, NULL);
  1125. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  1126. tor_free(question);
  1127. tor_free(answer);
  1128. errmsg = NULL;
  1129. /* Case 8 - download status for 2nd auth id, 1st sk */
  1130. memcpy(&auth_2_sk_1_dls, &dls_sample_5,
  1131. sizeof(download_status_t));
  1132. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  1133. auth_id_digest_2_str, auth_2_sk_1_str);
  1134. tt_ptr_op(question, OP_NE, NULL);
  1135. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1136. tt_ptr_op(answer, OP_NE, NULL);
  1137. tt_ptr_op(errmsg, OP_EQ, NULL);
  1138. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  1139. tor_free(question);
  1140. tor_free(answer);
  1141. errmsg = NULL;
  1142. /* Case 9 - download status for 2nd auth id, 2nd sk */
  1143. memcpy(&auth_2_sk_2_dls, &dls_sample_6,
  1144. sizeof(download_status_t));
  1145. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  1146. auth_id_digest_2_str, auth_2_sk_2_str);
  1147. tt_ptr_op(question, OP_NE, NULL);
  1148. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1149. tt_ptr_op(answer, OP_NE, NULL);
  1150. tt_ptr_op(errmsg, OP_EQ, NULL);
  1151. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  1152. tor_free(question);
  1153. tor_free(answer);
  1154. errmsg = NULL;
  1155. /* Now check the error cases */
  1156. /* Case 1 - query is garbage after downloads/cert/ part */
  1157. getinfo_helper_downloads(&dummy, "downloads/cert/blahdeblah",
  1158. &answer, &errmsg);
  1159. tt_ptr_op(answer, OP_EQ, NULL);
  1160. tt_ptr_op(errmsg, OP_NE, NULL);
  1161. tt_str_op(errmsg, OP_EQ, "Unknown certificate download status query");
  1162. errmsg = NULL;
  1163. /*
  1164. * Case 2 - looks like downloads/cert/fp/<fp>, but <fp> isn't even
  1165. * the right length for a digest.
  1166. */
  1167. getinfo_helper_downloads(&dummy, "downloads/cert/fp/2B1D36D32B2942406",
  1168. &answer, &errmsg);
  1169. tt_ptr_op(answer, OP_EQ, NULL);
  1170. tt_ptr_op(errmsg, OP_NE, NULL);
  1171. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1172. errmsg = NULL;
  1173. /*
  1174. * Case 3 - looks like downloads/cert/fp/<fp>, and <fp> is digest-sized,
  1175. * but not parseable as one.
  1176. */
  1177. getinfo_helper_downloads(&dummy,
  1178. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1",
  1179. &answer, &errmsg);
  1180. tt_ptr_op(answer, OP_EQ, NULL);
  1181. tt_ptr_op(errmsg, OP_NE, NULL);
  1182. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1183. errmsg = NULL;
  1184. /*
  1185. * Case 4 - downloads/cert/fp/<fp>, and <fp> is not a known authority
  1186. * identity digest
  1187. */
  1188. getinfo_helper_downloads(&dummy,
  1189. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61",
  1190. &answer, &errmsg);
  1191. tt_ptr_op(answer, OP_EQ, NULL);
  1192. tt_ptr_op(errmsg, OP_NE, NULL);
  1193. tt_str_op(errmsg, OP_EQ,
  1194. "Failed to get download status for this authority identity digest");
  1195. errmsg = NULL;
  1196. /*
  1197. * Case 5 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1198. * parse as a sensible digest.
  1199. */
  1200. getinfo_helper_downloads(&dummy,
  1201. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1/blah",
  1202. &answer, &errmsg);
  1203. tt_ptr_op(answer, OP_EQ, NULL);
  1204. tt_ptr_op(errmsg, OP_NE, NULL);
  1205. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1206. errmsg = NULL;
  1207. /*
  1208. * Case 6 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1209. * parse as a sensible digest.
  1210. */
  1211. getinfo_helper_downloads(&dummy,
  1212. "downloads/cert/fp/82F52AF55D25/blah",
  1213. &answer, &errmsg);
  1214. tt_ptr_op(answer, OP_EQ, NULL);
  1215. tt_ptr_op(errmsg, OP_NE, NULL);
  1216. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1217. errmsg = NULL;
  1218. /*
  1219. * Case 7 - downloads/cert/fp/<fp>/sks, and <fp> is not a known authority
  1220. * digest.
  1221. */
  1222. getinfo_helper_downloads(&dummy,
  1223. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/sks",
  1224. &answer, &errmsg);
  1225. tt_ptr_op(answer, OP_EQ, NULL);
  1226. tt_ptr_op(errmsg, OP_NE, NULL);
  1227. tt_str_op(errmsg, OP_EQ,
  1228. "Failed to get list of signing key digests for this authority "
  1229. "identity digest");
  1230. errmsg = NULL;
  1231. /*
  1232. * Case 8 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1233. * parse as a signing key digest.
  1234. */
  1235. getinfo_helper_downloads(&dummy,
  1236. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1237. "82F52AF55D250115FE44D3GC81D49643241D56A1",
  1238. &answer, &errmsg);
  1239. tt_ptr_op(answer, OP_EQ, NULL);
  1240. tt_ptr_op(errmsg, OP_NE, NULL);
  1241. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1242. errmsg = NULL;
  1243. /*
  1244. * Case 9 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1245. * parse as a signing key digest.
  1246. */
  1247. getinfo_helper_downloads(&dummy,
  1248. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1249. "82F52AF55D250115FE44D",
  1250. &answer, &errmsg);
  1251. tt_ptr_op(answer, OP_EQ, NULL);
  1252. tt_ptr_op(errmsg, OP_NE, NULL);
  1253. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1254. errmsg = NULL;
  1255. /*
  1256. * Case 10 - downloads/cert/fp/<fp>/<sk>, but <fp> isn't a known
  1257. * authority identity digest.
  1258. */
  1259. getinfo_helper_downloads(&dummy,
  1260. "downloads/cert/fp/C6B05DF332F74DB9A13498EE3BBC7AA2F69FCB45/"
  1261. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1262. &answer, &errmsg);
  1263. tt_ptr_op(answer, OP_EQ, NULL);
  1264. tt_ptr_op(errmsg, OP_NE, NULL);
  1265. tt_str_op(errmsg, OP_EQ,
  1266. "Failed to get download status for this identity/"
  1267. "signing key digest pair");
  1268. errmsg = NULL;
  1269. /*
  1270. * Case 11 - downloads/cert/fp/<fp>/<sk>, but <sk> isn't a known
  1271. * signing key digest.
  1272. */
  1273. getinfo_helper_downloads(&dummy,
  1274. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1275. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1276. &answer, &errmsg);
  1277. tt_ptr_op(answer, OP_EQ, NULL);
  1278. tt_ptr_op(errmsg, OP_NE, NULL);
  1279. tt_str_op(errmsg, OP_EQ,
  1280. "Failed to get download status for this identity/"
  1281. "signing key digest pair");
  1282. errmsg = NULL;
  1283. /*
  1284. * Case 12 - downloads/cert/fp/<fp>/<sk>, but <sk> is on the list for
  1285. * a different authority identity digest.
  1286. */
  1287. getinfo_helper_downloads(&dummy,
  1288. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1289. "9451B8F1B10952384EB58B5F230C0BB701626C9B",
  1290. &answer, &errmsg);
  1291. tt_ptr_op(answer, OP_EQ, NULL);
  1292. tt_ptr_op(errmsg, OP_NE, NULL);
  1293. tt_str_op(errmsg, OP_EQ,
  1294. "Failed to get download status for this identity/"
  1295. "signing key digest pair");
  1296. errmsg = NULL;
  1297. done:
  1298. clear_cert_mocks();
  1299. tor_free(answer);
  1300. return;
  1301. }
  1302. static void
  1303. test_download_status_desc(void *arg)
  1304. {
  1305. /* We just need one of these to pass, it doesn't matter what's in it */
  1306. control_connection_t dummy;
  1307. /* Get results out */
  1308. char *question = NULL;
  1309. char *answer = NULL;
  1310. const char *errmsg = NULL;
  1311. (void)arg;
  1312. setup_desc_mocks();
  1313. /*
  1314. * Check returning serialized dlstatuses and digest lists, and implicitly
  1315. * also test download_status_to_string() and digest_list_to_string().
  1316. */
  1317. /* Case 1 - list of router descriptor digests */
  1318. getinfo_helper_downloads(&dummy,
  1319. "downloads/desc/descs",
  1320. &answer, &errmsg);
  1321. tt_ptr_op(answer, OP_NE, NULL);
  1322. tt_ptr_op(errmsg, OP_EQ, NULL);
  1323. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1324. tor_free(answer);
  1325. errmsg = NULL;
  1326. /* Case 2 - get download status for router descriptor 1 */
  1327. memcpy(&descbr_digest_1_dl, &dls_sample_1,
  1328. sizeof(download_status_t));
  1329. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_1_str);
  1330. tt_ptr_op(question, OP_NE, NULL);
  1331. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1332. tt_ptr_op(answer, OP_NE, NULL);
  1333. tt_ptr_op(errmsg, OP_EQ, NULL);
  1334. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  1335. tor_free(question);
  1336. tor_free(answer);
  1337. errmsg = NULL;
  1338. /* Case 3 - get download status for router descriptor 1 */
  1339. memcpy(&descbr_digest_2_dl, &dls_sample_2,
  1340. sizeof(download_status_t));
  1341. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_2_str);
  1342. tt_ptr_op(question, OP_NE, NULL);
  1343. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1344. tt_ptr_op(answer, OP_NE, NULL);
  1345. tt_ptr_op(errmsg, OP_EQ, NULL);
  1346. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  1347. tor_free(question);
  1348. tor_free(answer);
  1349. errmsg = NULL;
  1350. /* Now check the error cases */
  1351. /* Case 1 - non-digest-length garbage after downloads/desc */
  1352. getinfo_helper_downloads(&dummy, "downloads/desc/blahdeblah",
  1353. &answer, &errmsg);
  1354. tt_ptr_op(answer, OP_EQ, NULL);
  1355. tt_ptr_op(errmsg, OP_NE, NULL);
  1356. tt_str_op(errmsg, OP_EQ, "Unknown router descriptor download status query");
  1357. errmsg = NULL;
  1358. /* Case 2 - nonparseable digest-shaped thing */
  1359. getinfo_helper_downloads(
  1360. &dummy,
  1361. "downloads/desc/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1362. &answer, &errmsg);
  1363. tt_ptr_op(answer, OP_EQ, NULL);
  1364. tt_ptr_op(errmsg, OP_NE, NULL);
  1365. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1366. errmsg = NULL;
  1367. /* Case 3 - digest we have no descriptor for */
  1368. getinfo_helper_downloads(
  1369. &dummy,
  1370. "downloads/desc/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1371. &answer, &errmsg);
  1372. tt_ptr_op(answer, OP_EQ, NULL);
  1373. tt_ptr_op(errmsg, OP_NE, NULL);
  1374. tt_str_op(errmsg, OP_EQ, "No such descriptor digest found");
  1375. errmsg = NULL;
  1376. /* Case 4 - microdescs only */
  1377. disable_descbr = 1;
  1378. getinfo_helper_downloads(&dummy,
  1379. "downloads/desc/descs",
  1380. &answer, &errmsg);
  1381. tt_ptr_op(answer, OP_EQ, NULL);
  1382. tt_ptr_op(errmsg, OP_NE, NULL);
  1383. tt_str_op(errmsg, OP_EQ,
  1384. "We don't seem to have a networkstatus-flavored consensus");
  1385. errmsg = NULL;
  1386. disable_descbr = 0;
  1387. done:
  1388. clear_desc_mocks();
  1389. tor_free(answer);
  1390. return;
  1391. }
  1392. static void
  1393. test_download_status_bridge(void *arg)
  1394. {
  1395. /* We just need one of these to pass, it doesn't matter what's in it */
  1396. control_connection_t dummy;
  1397. /* Get results out */
  1398. char *question = NULL;
  1399. char *answer = NULL;
  1400. const char *errmsg = NULL;
  1401. (void)arg;
  1402. setup_bridge_mocks();
  1403. /*
  1404. * Check returning serialized dlstatuses and digest lists, and implicitly
  1405. * also test download_status_to_string() and digest_list_to_string().
  1406. */
  1407. /* Case 1 - list of bridge identity digests */
  1408. getinfo_helper_downloads(&dummy,
  1409. "downloads/bridge/bridges",
  1410. &answer, &errmsg);
  1411. tt_ptr_op(answer, OP_NE, NULL);
  1412. tt_ptr_op(errmsg, OP_EQ, NULL);
  1413. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1414. tor_free(answer);
  1415. errmsg = NULL;
  1416. /* Case 2 - get download status for bridge descriptor 1 */
  1417. memcpy(&descbr_digest_1_dl, &dls_sample_3,
  1418. sizeof(download_status_t));
  1419. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_1_str);
  1420. tt_ptr_op(question, OP_NE, NULL);
  1421. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1422. tt_ptr_op(answer, OP_NE, NULL);
  1423. tt_ptr_op(errmsg, OP_EQ, NULL);
  1424. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  1425. tor_free(question);
  1426. tor_free(answer);
  1427. errmsg = NULL;
  1428. /* Case 3 - get download status for router descriptor 1 */
  1429. memcpy(&descbr_digest_2_dl, &dls_sample_4,
  1430. sizeof(download_status_t));
  1431. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_2_str);
  1432. tt_ptr_op(question, OP_NE, NULL);
  1433. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1434. tt_ptr_op(answer, OP_NE, NULL);
  1435. tt_ptr_op(errmsg, OP_EQ, NULL);
  1436. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  1437. tor_free(question);
  1438. tor_free(answer);
  1439. errmsg = NULL;
  1440. /* Now check the error cases */
  1441. /* Case 1 - non-digest-length garbage after downloads/bridge */
  1442. getinfo_helper_downloads(&dummy, "downloads/bridge/blahdeblah",
  1443. &answer, &errmsg);
  1444. tt_ptr_op(answer, OP_EQ, NULL);
  1445. tt_ptr_op(errmsg, OP_NE, NULL);
  1446. tt_str_op(errmsg, OP_EQ, "Unknown bridge descriptor download status query");
  1447. errmsg = NULL;
  1448. /* Case 2 - nonparseable digest-shaped thing */
  1449. getinfo_helper_downloads(
  1450. &dummy,
  1451. "downloads/bridge/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1452. &answer, &errmsg);
  1453. tt_ptr_op(answer, OP_EQ, NULL);
  1454. tt_ptr_op(errmsg, OP_NE, NULL);
  1455. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1456. errmsg = NULL;
  1457. /* Case 3 - digest we have no descriptor for */
  1458. getinfo_helper_downloads(
  1459. &dummy,
  1460. "downloads/bridge/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1461. &answer, &errmsg);
  1462. tt_ptr_op(answer, OP_EQ, NULL);
  1463. tt_ptr_op(errmsg, OP_NE, NULL);
  1464. tt_str_op(errmsg, OP_EQ, "No such bridge identity digest found");
  1465. errmsg = NULL;
  1466. /* Case 4 - bridges disabled */
  1467. disable_descbr = 1;
  1468. getinfo_helper_downloads(&dummy,
  1469. "downloads/bridge/bridges",
  1470. &answer, &errmsg);
  1471. tt_ptr_op(answer, OP_EQ, NULL);
  1472. tt_ptr_op(errmsg, OP_NE, NULL);
  1473. tt_str_op(errmsg, OP_EQ, "We don't seem to be using bridges");
  1474. errmsg = NULL;
  1475. disable_descbr = 0;
  1476. done:
  1477. clear_bridge_mocks();
  1478. tor_free(answer);
  1479. return;
  1480. }
  1481. /** Set timeval to a mock date and time. This is necessary
  1482. * to make tor_gettimeofday() mockable. */
  1483. static void
  1484. mock_tor_gettimeofday(struct timeval *timeval)
  1485. {
  1486. timeval->tv_sec = 1523405073;
  1487. timeval->tv_usec = 271645;
  1488. }
  1489. static void
  1490. test_current_time(void *arg)
  1491. {
  1492. /* We just need one of these to pass, it doesn't matter what's in it */
  1493. control_connection_t dummy;
  1494. /* Get results out */
  1495. char *answer = NULL;
  1496. const char *errmsg = NULL;
  1497. (void)arg;
  1498. /* We need these for storing the (mock) time. */
  1499. MOCK(tor_gettimeofday, mock_tor_gettimeofday);
  1500. struct timeval now;
  1501. tor_gettimeofday(&now);
  1502. char timebuf[ISO_TIME_LEN+1];
  1503. /* Case 1 - local time */
  1504. format_local_iso_time_nospace(timebuf, (time_t)now.tv_sec);
  1505. getinfo_helper_current_time(&dummy,
  1506. "current-time/local",
  1507. &answer, &errmsg);
  1508. tt_ptr_op(answer, OP_NE, NULL);
  1509. tt_ptr_op(errmsg, OP_EQ, NULL);
  1510. tt_str_op(answer, OP_EQ, timebuf);
  1511. tor_free(answer);
  1512. errmsg = NULL;
  1513. /* Case 2 - UTC time */
  1514. format_iso_time_nospace(timebuf, (time_t)now.tv_sec);
  1515. getinfo_helper_current_time(&dummy,
  1516. "current-time/utc",
  1517. &answer, &errmsg);
  1518. tt_ptr_op(answer, OP_NE, NULL);
  1519. tt_ptr_op(errmsg, OP_EQ, NULL);
  1520. tt_str_op(answer, OP_EQ, timebuf);
  1521. tor_free(answer);
  1522. errmsg = NULL;
  1523. done:
  1524. UNMOCK(tor_gettimeofday);
  1525. tor_free(answer);
  1526. return;
  1527. }
  1528. static size_t n_nodelist_get_list = 0;
  1529. static smartlist_t *nodes = NULL;
  1530. static smartlist_t *
  1531. mock_nodelist_get_list(void)
  1532. {
  1533. n_nodelist_get_list++;
  1534. tor_assert(nodes);
  1535. return nodes;
  1536. }
  1537. static void
  1538. test_getinfo_md_all(void *arg)
  1539. {
  1540. char *answer = NULL;
  1541. const char *errmsg = NULL;
  1542. int retval = 0;
  1543. (void)arg;
  1544. node_t *node1 = tor_malloc(sizeof(node_t));
  1545. memset(node1, 0, sizeof(node_t));
  1546. node1->md = tor_malloc(sizeof(microdesc_t));
  1547. memset(node1->md, 0, sizeof(microdesc_t));
  1548. node1->md->body = tor_strdup("md1\n");
  1549. node1->md->bodylen = 4;
  1550. node_t *node2 = tor_malloc(sizeof(node_t));
  1551. memset(node2, 0, sizeof(node_t));
  1552. node2->md = tor_malloc(sizeof(microdesc_t));
  1553. memset(node2->md, 0, sizeof(microdesc_t));
  1554. node2->md->body = tor_strdup("md2\n");
  1555. node2->md->bodylen = 4;
  1556. MOCK(nodelist_get_list, mock_nodelist_get_list);
  1557. nodes = smartlist_new();
  1558. retval = getinfo_helper_dir(NULL, "md/all", &answer, &errmsg);
  1559. tt_int_op(n_nodelist_get_list, OP_EQ, 1);
  1560. tt_int_op(retval, OP_EQ, 0);
  1561. tt_assert(answer != NULL);
  1562. tt_assert(errmsg == NULL);
  1563. tt_str_op(answer, OP_EQ, "");
  1564. tor_free(answer);
  1565. smartlist_add(nodes, node1);
  1566. smartlist_add(nodes, node2);
  1567. retval = getinfo_helper_dir(NULL, "md/all", &answer, &errmsg);
  1568. tt_int_op(n_nodelist_get_list, OP_EQ, 2);
  1569. tt_int_op(retval, OP_EQ, 0);
  1570. tt_assert(answer != NULL);
  1571. tt_assert(errmsg == NULL);
  1572. tt_str_op(answer, OP_EQ, "md1\nmd2\n");
  1573. done:
  1574. UNMOCK(nodelist_get_list);
  1575. tor_free(node1->md->body);
  1576. tor_free(node1->md);
  1577. tor_free(node1);
  1578. tor_free(node2->md->body);
  1579. tor_free(node2->md);
  1580. tor_free(node2);
  1581. tor_free(answer);
  1582. smartlist_free(nodes);
  1583. return;
  1584. }
  1585. #define PARSER_TEST(type) \
  1586. { "parse/" #type, test_controller_parse_cmd, 0, &passthrough_setup, \
  1587. (void*)&parse_ ## type ## _params }
  1588. struct testcase_t controller_tests[] = {
  1589. PARSER_TEST(one_to_three),
  1590. PARSER_TEST(no_args_one_obj),
  1591. PARSER_TEST(no_args_kwargs),
  1592. PARSER_TEST(one_arg_kwargs),
  1593. { "add_onion_helper_keyarg_v2", test_add_onion_helper_keyarg_v2, 0,
  1594. NULL, NULL },
  1595. { "add_onion_helper_keyarg_v3", test_add_onion_helper_keyarg_v3, 0,
  1596. NULL, NULL },
  1597. { "getinfo_helper_onion", test_getinfo_helper_onion, 0, NULL, NULL },
  1598. { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0,
  1599. NULL, NULL },
  1600. { "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL,
  1601. NULL },
  1602. { "download_status_consensus", test_download_status_consensus, 0, NULL,
  1603. NULL },
  1604. { "download_status_cert", test_download_status_cert, 0, NULL,
  1605. NULL },
  1606. { "download_status_desc", test_download_status_desc, 0, NULL, NULL },
  1607. { "download_status_bridge", test_download_status_bridge, 0, NULL, NULL },
  1608. { "current_time", test_current_time, 0, NULL, NULL },
  1609. { "getinfo_md_all", test_getinfo_md_all, 0, NULL, NULL },
  1610. END_OF_TESTCASES
  1611. };