test_controller.c 58 KB

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