test_controller.c 58 KB

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