control.c
上传用户:awang829
上传日期:2019-07-14
资源大小:2356k
文件大小:136k
源码类别:

网络

开发平台:

Unix_Linux

  1. }
  2. /** Lookup the 'getinfo' entry <b>question</b>, and return
  3.  * the answer in <b>*answer</b> (or NULL if key not recognized).
  4.  * Return 0 if success or unrecognized, or -1 if recognized but
  5.  * internal error. */
  6. static int
  7. handle_getinfo_helper(control_connection_t *control_conn,
  8.                       const char *question, char **answer)
  9. {
  10.   int i;
  11.   *answer = NULL; /* unrecognized key by default */
  12.   for (i = 0; getinfo_items[i].varname; ++i) {
  13.     int match;
  14.     if (getinfo_items[i].is_prefix)
  15.       match = !strcmpstart(question, getinfo_items[i].varname);
  16.     else
  17.       match = !strcmp(question, getinfo_items[i].varname);
  18.     if (match) {
  19.       tor_assert(getinfo_items[i].fn);
  20.       return getinfo_items[i].fn(control_conn, question, answer);
  21.     }
  22.   }
  23.   return 0; /* unrecognized */
  24. }
  25. /** Called when we receive a GETINFO command.  Try to fetch all requested
  26.  * information, and reply with information or error message. */
  27. static int
  28. handle_control_getinfo(control_connection_t *conn, uint32_t len,
  29.                        const char *body)
  30. {
  31.   smartlist_t *questions = smartlist_create();
  32.   smartlist_t *answers = smartlist_create();
  33.   smartlist_t *unrecognized = smartlist_create();
  34.   char *msg = NULL, *ans = NULL;
  35.   int i;
  36.   (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */
  37.   smartlist_split_string(questions, body, " ",
  38.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  39.   SMARTLIST_FOREACH(questions, const char *, q,
  40.   {
  41.     if (handle_getinfo_helper(conn, q, &ans) < 0) {
  42.       connection_write_str_to_buf("551 Internal errorrn", conn);
  43.       goto done;
  44.     }
  45.     if (!ans) {
  46.       smartlist_add(unrecognized, (char*)q);
  47.     } else {
  48.       smartlist_add(answers, tor_strdup(q));
  49.       smartlist_add(answers, ans);
  50.     }
  51.   });
  52.   if (smartlist_len(unrecognized)) {
  53.     for (i=0; i < smartlist_len(unrecognized)-1; ++i)
  54.       connection_printf_to_buf(conn,
  55.                                "552-Unrecognized key "%s"rn",
  56.                                (char*)smartlist_get(unrecognized, i));
  57.     connection_printf_to_buf(conn,
  58.                              "552 Unrecognized key "%s"rn",
  59.                              (char*)smartlist_get(unrecognized, i));
  60.     goto done;
  61.   }
  62.   for (i = 0; i < smartlist_len(answers); i += 2) {
  63.     char *k = smartlist_get(answers, i);
  64.     char *v = smartlist_get(answers, i+1);
  65.     if (!strchr(v, 'n') && !strchr(v, 'r')) {
  66.       connection_printf_to_buf(conn, "250-%s=", k);
  67.       connection_write_str_to_buf(v, conn);
  68.       connection_write_str_to_buf("rn", conn);
  69.     } else {
  70.       char *esc = NULL;
  71.       size_t esc_len;
  72.       esc_len = write_escaped_data(v, strlen(v), &esc);
  73.       connection_printf_to_buf(conn, "250+%s=rn", k);
  74.       connection_write_to_buf(esc, esc_len, TO_CONN(conn));
  75.       tor_free(esc);
  76.     }
  77.   }
  78.   connection_write_str_to_buf("250 OKrn", conn);
  79.  done:
  80.   SMARTLIST_FOREACH(answers, char *, cp, tor_free(cp));
  81.   smartlist_free(answers);
  82.   SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp));
  83.   smartlist_free(questions);
  84.   smartlist_free(unrecognized);
  85.   tor_free(msg);
  86.   return 0;
  87. }
  88. /** Given a string, convert it to a circuit purpose. */
  89. static uint8_t
  90. circuit_purpose_from_string(const char *string)
  91. {
  92.   if (!strcmpstart(string, "purpose="))
  93.     string += strlen("purpose=");
  94.   if (!strcmp(string, "general"))
  95.     return CIRCUIT_PURPOSE_C_GENERAL;
  96.   else if (!strcmp(string, "controller"))
  97.     return CIRCUIT_PURPOSE_CONTROLLER;
  98.   else
  99.     return CIRCUIT_PURPOSE_UNKNOWN;
  100. }
  101. /** Return a newly allocated smartlist containing the arguments to the command
  102.  * waiting in <b>body</b>. If there are fewer than <b>min_args</b> arguments,
  103.  * or if <b>max_args</b> is nonnegative and there are more than
  104.  * <b>max_args</b> arguments, send a 512 error to the controller, using
  105.  * <b>command</b> as the command name in the error message. */
  106. static smartlist_t *
  107. getargs_helper(const char *command, control_connection_t *conn,
  108.                const char *body, int min_args, int max_args)
  109. {
  110.   smartlist_t *args = smartlist_create();
  111.   smartlist_split_string(args, body, " ",
  112.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  113.   if (smartlist_len(args) < min_args) {
  114.     connection_printf_to_buf(conn, "512 Missing argument to %srn",command);
  115.     goto err;
  116.   } else if (max_args >= 0 && smartlist_len(args) > max_args) {
  117.     connection_printf_to_buf(conn, "512 Too many arguments to %srn",command);
  118.     goto err;
  119.   }
  120.   return args;
  121.  err:
  122.   SMARTLIST_FOREACH(args, char *, s, tor_free(s));
  123.   smartlist_free(args);
  124.   return NULL;
  125. }
  126. /** Called when we get an EXTENDCIRCUIT message.  Try to extend the listed
  127.  * circuit, and report success or failure. */
  128. static int
  129. handle_control_extendcircuit(control_connection_t *conn, uint32_t len,
  130.                              const char *body)
  131. {
  132.   smartlist_t *router_nicknames=NULL, *routers=NULL;
  133.   origin_circuit_t *circ = NULL;
  134.   int zero_circ;
  135.   uint8_t intended_purpose = CIRCUIT_PURPOSE_C_GENERAL;
  136.   smartlist_t *args;
  137.   (void) len;
  138.   router_nicknames = smartlist_create();
  139.   args = getargs_helper("EXTENDCIRCUIT", conn, body, 2, -1);
  140.   if (!args)
  141.     goto done;
  142.   zero_circ = !strcmp("0", (char*)smartlist_get(args,0));
  143.   if (!zero_circ && !(circ = get_circ(smartlist_get(args,0)))) {
  144.     connection_printf_to_buf(conn, "552 Unknown circuit "%s"rn",
  145.                              (char*)smartlist_get(args, 0));
  146.   }
  147.   smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0);
  148.   if (zero_circ && smartlist_len(args)>2) {
  149.     char *purp = smartlist_get(args,2);
  150.     intended_purpose = circuit_purpose_from_string(purp);
  151.     if (intended_purpose == CIRCUIT_PURPOSE_UNKNOWN) {
  152.       connection_printf_to_buf(conn, "552 Unknown purpose "%s"rn", purp);
  153.       SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  154.       smartlist_free(args);
  155.       goto done;
  156.     }
  157.   }
  158.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  159.   smartlist_free(args);
  160.   if (!zero_circ && !circ) {
  161.     goto done;
  162.   }
  163.   routers = smartlist_create();
  164.   SMARTLIST_FOREACH(router_nicknames, const char *, n,
  165.   {
  166.     routerinfo_t *r = router_get_by_nickname(n, 1);
  167.     if (!r) {
  168.       connection_printf_to_buf(conn, "552 No such router "%s"rn", n);
  169.       goto done;
  170.     }
  171.     smartlist_add(routers, r);
  172.   });
  173.   if (!smartlist_len(routers)) {
  174.     connection_write_str_to_buf("512 No router names providedrn", conn);
  175.     goto done;
  176.   }
  177.   if (zero_circ) {
  178.     /* start a new circuit */
  179.     circ = origin_circuit_init(intended_purpose, 0);
  180.   }
  181.   /* now circ refers to something that is ready to be extended */
  182.   SMARTLIST_FOREACH(routers, routerinfo_t *, r,
  183.   {
  184.     extend_info_t *info = extend_info_from_router(r);
  185.     circuit_append_new_exit(circ, info);
  186.     extend_info_free(info);
  187.   });
  188.   /* now that we've populated the cpath, start extending */
  189.   if (zero_circ) {
  190.     int err_reason = 0;
  191.     if ((err_reason = circuit_handle_first_hop(circ)) < 0) {
  192.       circuit_mark_for_close(TO_CIRCUIT(circ), -err_reason);
  193.       connection_write_str_to_buf("551 Couldn't start circuitrn", conn);
  194.       goto done;
  195.     }
  196.   } else {
  197.     if (circ->_base.state == CIRCUIT_STATE_OPEN) {
  198.       int err_reason = 0;
  199.       circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING);
  200.       if ((err_reason = circuit_send_next_onion_skin(circ)) < 0) {
  201.         log_info(LD_CONTROL,
  202.                  "send_next_onion_skin failed; circuit marked for closing.");
  203.         circuit_mark_for_close(TO_CIRCUIT(circ), -err_reason);
  204.         connection_write_str_to_buf("551 Couldn't send onion skinrn", conn);
  205.         goto done;
  206.       }
  207.     }
  208.   }
  209.   connection_printf_to_buf(conn, "250 EXTENDED %lurn",
  210.                              (unsigned long)circ->global_identifier);
  211.   if (zero_circ) /* send a 'launched' event, for completeness */
  212.     control_event_circuit_status(circ, CIRC_EVENT_LAUNCHED, 0);
  213.  done:
  214.   SMARTLIST_FOREACH(router_nicknames, char *, n, tor_free(n));
  215.   smartlist_free(router_nicknames);
  216.   if (routers)
  217.     smartlist_free(routers);
  218.   return 0;
  219. }
  220. /** Called when we get a SETCIRCUITPURPOSE message. If we can find the
  221.  * circuit and it's a valid purpose, change it. */
  222. static int
  223. handle_control_setcircuitpurpose(control_connection_t *conn,
  224.                                  uint32_t len, const char *body)
  225. {
  226.   origin_circuit_t *circ = NULL;
  227.   uint8_t new_purpose;
  228.   smartlist_t *args;
  229.   (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */
  230.   args = getargs_helper("SETCIRCUITPURPOSE", conn, body, 2, -1);
  231.   if (!args)
  232.     goto done;
  233.   if (!(circ = get_circ(smartlist_get(args,0)))) {
  234.     connection_printf_to_buf(conn, "552 Unknown circuit "%s"rn",
  235.                              (char*)smartlist_get(args, 0));
  236.     goto done;
  237.   }
  238.   {
  239.     char *purp = smartlist_get(args,1);
  240.     new_purpose = circuit_purpose_from_string(purp);
  241.     if (new_purpose == CIRCUIT_PURPOSE_UNKNOWN) {
  242.       connection_printf_to_buf(conn, "552 Unknown purpose "%s"rn", purp);
  243.       goto done;
  244.     }
  245.   }
  246.   circ->_base.purpose = new_purpose;
  247.   connection_write_str_to_buf("250 OKrn", conn);
  248. done:
  249.   if (args) {
  250.     SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  251.     smartlist_free(args);
  252.   }
  253.   return 0;
  254. }
  255. /** Called when we get an ATTACHSTREAM message.  Try to attach the requested
  256.  * stream, and report success or failure. */
  257. static int
  258. handle_control_attachstream(control_connection_t *conn, uint32_t len,
  259.                             const char *body)
  260. {
  261.   edge_connection_t *ap_conn = NULL;
  262.   origin_circuit_t *circ = NULL;
  263.   int zero_circ;
  264.   smartlist_t *args;
  265.   crypt_path_t *cpath=NULL;
  266.   int hop=0, hop_line_ok=1;
  267.   (void) len;
  268.   args = getargs_helper("ATTACHSTREAM", conn, body, 2, -1);
  269.   if (!args)
  270.     return 0;
  271.   zero_circ = !strcmp("0", (char*)smartlist_get(args,1));
  272.   if (!(ap_conn = get_stream(smartlist_get(args, 0)))) {
  273.     connection_printf_to_buf(conn, "552 Unknown stream "%s"rn",
  274.                              (char*)smartlist_get(args, 0));
  275.   } else if (!zero_circ && !(circ = get_circ(smartlist_get(args, 1)))) {
  276.     connection_printf_to_buf(conn, "552 Unknown circuit "%s"rn",
  277.                              (char*)smartlist_get(args, 1));
  278.   } else if (circ && smartlist_len(args) > 2) {
  279.     char *hopstring = smartlist_get(args, 2);
  280.     if (!strcasecmpstart(hopstring, "HOP=")) {
  281.       hopstring += strlen("HOP=");
  282.       hop = (int) tor_parse_ulong(hopstring, 10, 0, INT_MAX,
  283.                                   &hop_line_ok, NULL);
  284.       if (!hop_line_ok) { /* broken hop line */
  285.         connection_printf_to_buf(conn, "552 Bad value hop=%srn", hopstring);
  286.       }
  287.     }
  288.   }
  289.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  290.   smartlist_free(args);
  291.   if (!ap_conn || (!zero_circ && !circ) || !hop_line_ok)
  292.     return 0;
  293.   if (ap_conn->_base.state != AP_CONN_STATE_CONTROLLER_WAIT &&
  294.       ap_conn->_base.state != AP_CONN_STATE_CONNECT_WAIT &&
  295.       ap_conn->_base.state != AP_CONN_STATE_RESOLVE_WAIT) {
  296.     connection_write_str_to_buf(
  297.                     "555 Connection is not managed by controller.rn",
  298.                     conn);
  299.     return 0;
  300.   }
  301.   /* Do we need to detach it first? */
  302.   if (ap_conn->_base.state != AP_CONN_STATE_CONTROLLER_WAIT) {
  303.     circuit_t *tmpcirc = circuit_get_by_edge_conn(ap_conn);
  304.     connection_edge_end(ap_conn, END_STREAM_REASON_TIMEOUT);
  305.     /* Un-mark it as ending, since we're going to reuse it. */
  306.     ap_conn->edge_has_sent_end = 0;
  307.     ap_conn->end_reason = 0;
  308.     if (tmpcirc)
  309.       circuit_detach_stream(tmpcirc,ap_conn);
  310.     ap_conn->_base.state = AP_CONN_STATE_CONTROLLER_WAIT;
  311.   }
  312.   if (circ && (circ->_base.state != CIRCUIT_STATE_OPEN)) {
  313.     connection_write_str_to_buf(
  314.                     "551 Can't attach stream to non-open origin circuitrn",
  315.                     conn);
  316.     return 0;
  317.   }
  318.   /* Is this a single hop circuit? */
  319.   if (circ && (circuit_get_cpath_len(circ)<2 || hop==1)) {
  320.     routerinfo_t *r = NULL;
  321.     char* exit_digest;
  322.     if (circ->build_state &&
  323.         circ->build_state->chosen_exit &&
  324.         circ->build_state->chosen_exit->identity_digest) {
  325.       exit_digest = circ->build_state->chosen_exit->identity_digest;
  326.       r = router_get_by_digest(exit_digest);
  327.     }
  328.     /* Do both the client and relay allow one-hop exit circuits? */
  329.     if (!r || !r->allow_single_hop_exits ||
  330.         !get_options()->AllowSingleHopCircuits) {
  331.       connection_write_str_to_buf(
  332.       "551 Can't attach stream to this one-hop circuit.rn", conn);
  333.       return 0;
  334.     }
  335.     ap_conn->chosen_exit_name = tor_strdup(hex_str(exit_digest, DIGEST_LEN));
  336.   }
  337.   if (circ && hop>0) {
  338.     /* find this hop in the circuit, and set cpath */
  339.     cpath = circuit_get_cpath_hop(circ, hop);
  340.     if (!cpath) {
  341.       connection_printf_to_buf(conn,
  342.                                "551 Circuit doesn't have %d hops.rn", hop);
  343.       return 0;
  344.     }
  345.   }
  346.   if (connection_ap_handshake_rewrite_and_attach(ap_conn, circ, cpath) < 0) {
  347.     connection_write_str_to_buf("551 Unable to attach streamrn", conn);
  348.     return 0;
  349.   }
  350.   send_control_done(conn);
  351.   return 0;
  352. }
  353. /** Called when we get a POSTDESCRIPTOR message.  Try to learn the provided
  354.  * descriptor, and report success or failure. */
  355. static int
  356. handle_control_postdescriptor(control_connection_t *conn, uint32_t len,
  357.                               const char *body)
  358. {
  359.   char *desc;
  360.   const char *msg=NULL;
  361.   uint8_t purpose = ROUTER_PURPOSE_GENERAL;
  362.   int cache = 0; /* eventually, we may switch this to 1 */
  363.   char *cp = memchr(body, 'n', len);
  364.   smartlist_t *args = smartlist_create();
  365.   tor_assert(cp);
  366.   *cp++ = '';
  367.   smartlist_split_string(args, body, " ",
  368.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  369.   SMARTLIST_FOREACH(args, char *, option,
  370.   {
  371.     if (!strcasecmpstart(option, "purpose=")) {
  372.       option += strlen("purpose=");
  373.       purpose = router_purpose_from_string(option);
  374.       if (purpose == ROUTER_PURPOSE_UNKNOWN) {
  375.         connection_printf_to_buf(conn, "552 Unknown purpose "%s"rn",
  376.                                  option);
  377.         goto done;
  378.       }
  379.     } else if (!strcasecmpstart(option, "cache=")) {
  380.       option += strlen("cache=");
  381.       if (!strcmp(option, "no"))
  382.         cache = 0;
  383.       else if (!strcmp(option, "yes"))
  384.         cache = 1;
  385.       else {
  386.         connection_printf_to_buf(conn, "552 Unknown cache request "%s"rn",
  387.                                  option);
  388.         goto done;
  389.       }
  390.     } else { /* unrecognized argument? */
  391.       connection_printf_to_buf(conn,
  392.         "512 Unexpected argument "%s" to postdescriptorrn", option);
  393.       goto done;
  394.     }
  395.   });
  396.   read_escaped_data(cp, len-(cp-body), &desc);
  397.   switch (router_load_single_router(desc, purpose, cache, &msg)) {
  398.   case -1:
  399.     if (!msg) msg = "Could not parse descriptor";
  400.     connection_printf_to_buf(conn, "554 %srn", msg);
  401.     break;
  402.   case 0:
  403.     if (!msg) msg = "Descriptor not added";
  404.     connection_printf_to_buf(conn, "251 %srn",msg);
  405.     break;
  406.   case 1:
  407.     send_control_done(conn);
  408.     break;
  409.   }
  410.   tor_free(desc);
  411.  done:
  412.   SMARTLIST_FOREACH(args, char *, arg, tor_free(arg));
  413.   smartlist_free(args);
  414.   return 0;
  415. }
  416. /** Called when we receive a REDIRECTSTERAM command.  Try to change the target
  417.  * address of the named AP stream, and report success or failure. */
  418. static int
  419. handle_control_redirectstream(control_connection_t *conn, uint32_t len,
  420.                               const char *body)
  421. {
  422.   edge_connection_t *ap_conn = NULL;
  423.   char *new_addr = NULL;
  424.   uint16_t new_port = 0;
  425.   smartlist_t *args;
  426.   (void) len;
  427.   args = getargs_helper("REDIRECTSTREAM", conn, body, 2, -1);
  428.   if (!args)
  429.     return 0;
  430.   if (!(ap_conn = get_stream(smartlist_get(args, 0)))
  431.            || !ap_conn->socks_request) {
  432.     connection_printf_to_buf(conn, "552 Unknown stream "%s"rn",
  433.                              (char*)smartlist_get(args, 0));
  434.   } else {
  435.     int ok = 1;
  436.     if (smartlist_len(args) > 2) { /* they included a port too */
  437.       new_port = (uint16_t) tor_parse_ulong(smartlist_get(args, 2),
  438.                                             10, 1, 65535, &ok, NULL);
  439.     }
  440.     if (!ok) {
  441.       connection_printf_to_buf(conn, "512 Cannot parse port "%s"rn",
  442.                                (char*)smartlist_get(args, 2));
  443.     } else {
  444.       new_addr = tor_strdup(smartlist_get(args, 1));
  445.     }
  446.   }
  447.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  448.   smartlist_free(args);
  449.   if (!new_addr)
  450.     return 0;
  451.   strlcpy(ap_conn->socks_request->address, new_addr,
  452.           sizeof(ap_conn->socks_request->address));
  453.   if (new_port)
  454.     ap_conn->socks_request->port = new_port;
  455.   tor_free(new_addr);
  456.   send_control_done(conn);
  457.   return 0;
  458. }
  459. /** Called when we get a CLOSESTREAM command; try to close the named stream
  460.  * and report success or failure. */
  461. static int
  462. handle_control_closestream(control_connection_t *conn, uint32_t len,
  463.                            const char *body)
  464. {
  465.   edge_connection_t *ap_conn=NULL;
  466.   uint8_t reason=0;
  467.   smartlist_t *args;
  468.   int ok;
  469.   (void) len;
  470.   args = getargs_helper("CLOSESTREAM", conn, body, 2, -1);
  471.   if (!args)
  472.     return 0;
  473.   else if (!(ap_conn = get_stream(smartlist_get(args, 0))))
  474.     connection_printf_to_buf(conn, "552 Unknown stream "%s"rn",
  475.                              (char*)smartlist_get(args, 0));
  476.   else {
  477.     reason = (uint8_t) tor_parse_ulong(smartlist_get(args,1), 10, 0, 255,
  478.                                        &ok, NULL);
  479.     if (!ok) {
  480.       connection_printf_to_buf(conn, "552 Unrecognized reason "%s"rn",
  481.                                (char*)smartlist_get(args, 1));
  482.       ap_conn = NULL;
  483.     }
  484.   }
  485.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  486.   smartlist_free(args);
  487.   if (!ap_conn)
  488.     return 0;
  489.   connection_mark_unattached_ap(ap_conn, reason);
  490.   send_control_done(conn);
  491.   return 0;
  492. }
  493. /** Called when we get a CLOSECIRCUIT command; try to close the named circuit
  494.  * and report success or failure. */
  495. static int
  496. handle_control_closecircuit(control_connection_t *conn, uint32_t len,
  497.                             const char *body)
  498. {
  499.   origin_circuit_t *circ = NULL;
  500.   int safe = 0;
  501.   smartlist_t *args;
  502.   (void) len;
  503.   args = getargs_helper("CLOSECIRCUIT", conn, body, 1, -1);
  504.   if (!args)
  505.     return 0;
  506.   if (!(circ=get_circ(smartlist_get(args, 0))))
  507.     connection_printf_to_buf(conn, "552 Unknown circuit "%s"rn",
  508.                              (char*)smartlist_get(args, 0));
  509.   else {
  510.     int i;
  511.     for (i=1; i < smartlist_len(args); ++i) {
  512.       if (!strcasecmp(smartlist_get(args, i), "IfUnused"))
  513.         safe = 1;
  514.       else
  515.         log_info(LD_CONTROL, "Skipping unknown option %s",
  516.                  (char*)smartlist_get(args,i));
  517.     }
  518.   }
  519.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  520.   smartlist_free(args);
  521.   if (!circ)
  522.     return 0;
  523.   if (!safe || !circ->p_streams) {
  524.     circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_REQUESTED);
  525.   }
  526.   send_control_done(conn);
  527.   return 0;
  528. }
  529. /** Called when we get a RESOLVE command: start trying to resolve
  530.  * the listed addresses. */
  531. static int
  532. handle_control_resolve(control_connection_t *conn, uint32_t len,
  533.                        const char *body)
  534. {
  535.   smartlist_t *args, *failed;
  536.   int is_reverse = 0;
  537.   (void) len; /* body is nul-terminated; it's safe to ignore the length */
  538.   if (!(conn->event_mask & ((uint32_t)1L<<EVENT_ADDRMAP))) {
  539.     log_warn(LD_CONTROL, "Controller asked us to resolve an address, but "
  540.              "isn't listening for ADDRMAP events.  It probably won't see "
  541.              "the answer.");
  542.   }
  543.   args = smartlist_create();
  544.   smartlist_split_string(args, body, " ",
  545.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  546.   if (smartlist_len(args) &&
  547.       !strcasecmp(smartlist_get(args, 0), "mode=reverse")) {
  548.     char *cp = smartlist_get(args, 0);
  549.     smartlist_del_keeporder(args, 0);
  550.     tor_free(cp);
  551.     is_reverse = 1;
  552.   }
  553.   failed = smartlist_create();
  554.   SMARTLIST_FOREACH(args, const char *, arg, {
  555.       if (dnsserv_launch_request(arg, is_reverse)<0)
  556.         smartlist_add(failed, (char*)arg);
  557.   });
  558.   send_control_done(conn);
  559.   SMARTLIST_FOREACH(failed, const char *, arg, {
  560.       control_event_address_mapped(arg, arg, time(NULL),
  561.                                    "Unable to launch resolve request");
  562.   });
  563.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  564.   smartlist_free(args);
  565.   smartlist_free(failed);
  566.   return 0;
  567. }
  568. /** Called when we get a PROTOCOLINFO command: send back a reply. */
  569. static int
  570. handle_control_protocolinfo(control_connection_t *conn, uint32_t len,
  571.                             const char *body)
  572. {
  573.   const char *bad_arg = NULL;
  574.   smartlist_t *args;
  575.   (void)len;
  576.   conn->have_sent_protocolinfo = 1;
  577.   args = smartlist_create();
  578.   smartlist_split_string(args, body, " ",
  579.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  580.   SMARTLIST_FOREACH(args, const char *, arg, {
  581.       int ok;
  582.       tor_parse_long(arg, 10, 0, LONG_MAX, &ok, NULL);
  583.       if (!ok) {
  584.         bad_arg = arg;
  585.         break;
  586.       }
  587.     });
  588.   if (bad_arg) {
  589.     connection_printf_to_buf(conn, "513 No such version %srn",
  590.                              escaped(bad_arg));
  591.     /* Don't tolerate bad arguments when not authenticated. */
  592.     if (!STATE_IS_OPEN(TO_CONN(conn)->state))
  593.       connection_mark_for_close(TO_CONN(conn));
  594.     goto done;
  595.   } else {
  596.     or_options_t *options = get_options();
  597.     int cookies = options->CookieAuthentication;
  598.     char *cfile = get_cookie_file();
  599.     char *esc_cfile = esc_for_log(cfile);
  600.     char *methods;
  601.     {
  602.       int passwd = (options->HashedControlPassword != NULL ||
  603.                     options->HashedControlSessionPassword != NULL);
  604.       smartlist_t *mlist = smartlist_create();
  605.       if (cookies)
  606.         smartlist_add(mlist, (char*)"COOKIE");
  607.       if (passwd)
  608.         smartlist_add(mlist, (char*)"HASHEDPASSWORD");
  609.       if (!cookies && !passwd)
  610.         smartlist_add(mlist, (char*)"NULL");
  611.       methods = smartlist_join_strings(mlist, ",", 0, NULL);
  612.       smartlist_free(mlist);
  613.     }
  614.     connection_printf_to_buf(conn,
  615.                              "250-PROTOCOLINFO 1rn"
  616.                              "250-AUTH METHODS=%s%s%srn"
  617.                              "250-VERSION Tor=%srn"
  618.                              "250 OKrn",
  619.                              methods,
  620.                              cookies?" COOKIEFILE=":"",
  621.                              cookies?esc_cfile:"",
  622.                              escaped(VERSION));
  623.     tor_free(methods);
  624.     tor_free(cfile);
  625.     tor_free(esc_cfile);
  626.   }
  627.  done:
  628.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  629.   smartlist_free(args);
  630.   return 0;
  631. }
  632. /** Called when we get a USEFEATURE command: parse the feature list, and
  633.  * set up the control_connection's options properly. */
  634. static int
  635. handle_control_usefeature(control_connection_t *conn,
  636.                           uint32_t len,
  637.                           const char *body)
  638. {
  639.   smartlist_t *args;
  640.   int verbose_names = 0, extended_events = 0;
  641.   int bad = 0;
  642.   (void) len; /* body is nul-terminated; it's safe to ignore the length */
  643.   args = smartlist_create();
  644.   smartlist_split_string(args, body, " ",
  645.                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  646.   SMARTLIST_FOREACH(args, const char *, arg, {
  647.       if (!strcasecmp(arg, "VERBOSE_NAMES"))
  648.         verbose_names = 1;
  649.       else if (!strcasecmp(arg, "EXTENDED_EVENTS"))
  650.         extended_events = 1;
  651.       else {
  652.         connection_printf_to_buf(conn, "552 Unrecognized feature "%s"rn",
  653.                                  arg);
  654.         bad = 1;
  655.         break;
  656.       }
  657.     });
  658.   if (!bad) {
  659.     if (verbose_names) {
  660.       conn->use_long_names = 1;
  661.       control_update_global_event_mask();
  662.     }
  663.     if (extended_events)
  664.       conn->use_extended_events = 1;
  665.     send_control_done(conn);
  666.   }
  667.   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
  668.   smartlist_free(args);
  669.   return 0;
  670. }
  671. /** Called when <b>conn</b> has no more bytes left on its outbuf. */
  672. int
  673. connection_control_finished_flushing(control_connection_t *conn)
  674. {
  675.   tor_assert(conn);
  676.   connection_stop_writing(TO_CONN(conn));
  677.   return 0;
  678. }
  679. /** Called when <b>conn</b> has gotten its socket closed. */
  680. int
  681. connection_control_reached_eof(control_connection_t *conn)
  682. {
  683.   tor_assert(conn);
  684.   log_info(LD_CONTROL,"Control connection reached EOF. Closing.");
  685.   connection_mark_for_close(TO_CONN(conn));
  686.   return 0;
  687. }
  688. /** Return true iff <b>cmd</b> is allowable (or at least forgivable) at this
  689.  * stage of the protocol. */
  690. static int
  691. is_valid_initial_command(control_connection_t *conn, const char *cmd)
  692. {
  693.   if (conn->_base.state == CONTROL_CONN_STATE_OPEN)
  694.     return 1;
  695.   if (!strcasecmp(cmd, "PROTOCOLINFO"))
  696.     return !conn->have_sent_protocolinfo;
  697.   if (!strcasecmp(cmd, "AUTHENTICATE") ||
  698.       !strcasecmp(cmd, "QUIT"))
  699.     return 1;
  700.   return 0;
  701. }
  702. /** Do not accept any control command of more than 1MB in length.  Anything
  703.  * that needs to be anywhere near this long probably means that one of our
  704.  * interfaces is broken. */
  705. #define MAX_COMMAND_LINE_LENGTH (1024*1024)
  706. /** Called when data has arrived on a v1 control connection: Try to fetch
  707.  * commands from conn->inbuf, and execute them.
  708.  */
  709. int
  710. connection_control_process_inbuf(control_connection_t *conn)
  711. {
  712.   size_t data_len;
  713.   uint32_t cmd_data_len;
  714.   int cmd_len;
  715.   char *args;
  716.   tor_assert(conn);
  717.   tor_assert(conn->_base.state == CONTROL_CONN_STATE_OPEN ||
  718.              conn->_base.state == CONTROL_CONN_STATE_NEEDAUTH);
  719.   if (!conn->incoming_cmd) {
  720.     conn->incoming_cmd = tor_malloc(1024);
  721.     conn->incoming_cmd_len = 1024;
  722.     conn->incoming_cmd_cur_len = 0;
  723.   }
  724.   if (conn->_base.state == CONTROL_CONN_STATE_NEEDAUTH &&
  725.       peek_buf_has_control0_command(conn->_base.inbuf)) {
  726.     /* Detect v0 commands and send a "no more v0" message. */
  727.     size_t body_len;
  728.     char buf[128];
  729.     set_uint16(buf+2, htons(0x0000)); /* type == error */
  730.     set_uint16(buf+4, htons(0x0001)); /* code == internal error */
  731.     strlcpy(buf+6, "The v0 control protocol is not supported by Tor 0.1.2.17 "
  732.             "and later; upgrade your controller.",
  733.             sizeof(buf)-6);
  734.     body_len = 2+strlen(buf+6)+2; /* code, msg, nul. */
  735.     set_uint16(buf+0, htons(body_len));
  736.     connection_write_to_buf(buf, 4+body_len, TO_CONN(conn));
  737.     connection_mark_for_close(TO_CONN(conn));
  738.     conn->_base.hold_open_until_flushed = 1;
  739.     return 0;
  740.   }
  741.  again:
  742.   while (1) {
  743.     size_t last_idx;
  744.     int r;
  745.     /* First, fetch a line. */
  746.     do {
  747.       data_len = conn->incoming_cmd_len - conn->incoming_cmd_cur_len;
  748.       r = fetch_from_buf_line(conn->_base.inbuf,
  749.                               conn->incoming_cmd+conn->incoming_cmd_cur_len,
  750.                               &data_len);
  751.       if (r == 0)
  752.         /* Line not all here yet. Wait. */
  753.         return 0;
  754.       else if (r == -1) {
  755.         if (data_len + conn->incoming_cmd_cur_len > MAX_COMMAND_LINE_LENGTH) {
  756.           connection_write_str_to_buf("500 Line too long.rn", conn);
  757.           connection_stop_reading(TO_CONN(conn));
  758.           connection_mark_for_close(TO_CONN(conn));
  759.           conn->_base.hold_open_until_flushed = 1;
  760.         }
  761.         while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len)
  762.           conn->incoming_cmd_len *= 2;
  763.         conn->incoming_cmd = tor_realloc(conn->incoming_cmd,
  764.                                          conn->incoming_cmd_len);
  765.       }
  766.     } while (r != 1);
  767.     tor_assert(data_len);
  768.     last_idx = conn->incoming_cmd_cur_len;
  769.     conn->incoming_cmd_cur_len += (int)data_len;
  770.     /* We have appended a line to incoming_cmd.  Is the command done? */
  771.     if (last_idx == 0 && *conn->incoming_cmd != '+')
  772.       /* One line command, didn't start with '+'. */
  773.       break;
  774.     /* XXXX this code duplication is kind of dumb. */
  775.     if (last_idx+3 == conn->incoming_cmd_cur_len &&
  776.         !memcmp(conn->incoming_cmd + last_idx, ".rn", 3)) {
  777.       /* Just appended ".rn"; we're done. Remove it. */
  778.       conn->incoming_cmd[last_idx] = '';
  779.       conn->incoming_cmd_cur_len -= 3;
  780.       break;
  781.     } else if (last_idx+2 == conn->incoming_cmd_cur_len &&
  782.                !memcmp(conn->incoming_cmd + last_idx, ".n", 2)) {
  783.       /* Just appended ".n"; we're done. Remove it. */
  784.       conn->incoming_cmd[last_idx] = '';
  785.       conn->incoming_cmd_cur_len -= 2;
  786.       break;
  787.     }
  788.     /* Otherwise, read another line. */
  789.   }
  790.   data_len = conn->incoming_cmd_cur_len;
  791.   /* Okay, we now have a command sitting on conn->incoming_cmd. See if we
  792.    * recognize it.
  793.    */
  794.   cmd_len = 0;
  795.   while ((size_t)cmd_len < data_len
  796.          && !TOR_ISSPACE(conn->incoming_cmd[cmd_len]))
  797.     ++cmd_len;
  798.   data_len -= cmd_len;
  799.   conn->incoming_cmd[cmd_len]='';
  800.   args = conn->incoming_cmd+cmd_len+1;
  801.   while (*args == ' ' || *args == 't') {
  802.     ++args;
  803.     --data_len;
  804.   }
  805.   /* If the connection is already closing, ignore further commands */
  806.   if (TO_CONN(conn)->marked_for_close) {
  807.     return 0;
  808.   }
  809.   /* Otherwise, Quit is always valid. */
  810.   if (!strcasecmp(conn->incoming_cmd, "QUIT")) {
  811.     connection_write_str_to_buf("250 closing connectionrn", conn);
  812.     connection_mark_for_close(TO_CONN(conn));
  813.     conn->_base.hold_open_until_flushed = 1;
  814.     return 0;
  815.   }
  816.   if (conn->_base.state == CONTROL_CONN_STATE_NEEDAUTH &&
  817.       !is_valid_initial_command(conn, conn->incoming_cmd)) {
  818.     connection_write_str_to_buf("514 Authentication required.rn", conn);
  819.     connection_mark_for_close(TO_CONN(conn));
  820.     return 0;
  821.   }
  822.   if (data_len >= UINT32_MAX) {
  823.     connection_write_str_to_buf("500 A 4GB command? Nice try.rn", conn);
  824.     connection_mark_for_close(TO_CONN(conn));
  825.     return 0;
  826.   }
  827.   cmd_data_len = (uint32_t)data_len;
  828.   if (!strcasecmp(conn->incoming_cmd, "SETCONF")) {
  829.     if (handle_control_setconf(conn, cmd_data_len, args))
  830.       return -1;
  831.   } else if (!strcasecmp(conn->incoming_cmd, "RESETCONF")) {
  832.     if (handle_control_resetconf(conn, cmd_data_len, args))
  833.       return -1;
  834.   } else if (!strcasecmp(conn->incoming_cmd, "GETCONF")) {
  835.     if (handle_control_getconf(conn, cmd_data_len, args))
  836.       return -1;
  837.   } else if (!strcasecmp(conn->incoming_cmd, "+LOADCONF")) {
  838.     if (handle_control_loadconf(conn, cmd_data_len, args))
  839.       return -1;
  840.   } else if (!strcasecmp(conn->incoming_cmd, "SETEVENTS")) {
  841.     if (handle_control_setevents(conn, cmd_data_len, args))
  842.       return -1;
  843.   } else if (!strcasecmp(conn->incoming_cmd, "AUTHENTICATE")) {
  844.     if (handle_control_authenticate(conn, cmd_data_len, args))
  845.       return -1;
  846.   } else if (!strcasecmp(conn->incoming_cmd, "SAVECONF")) {
  847.     if (handle_control_saveconf(conn, cmd_data_len, args))
  848.       return -1;
  849.   } else if (!strcasecmp(conn->incoming_cmd, "SIGNAL")) {
  850.     if (handle_control_signal(conn, cmd_data_len, args))
  851.       return -1;
  852.   } else if (!strcasecmp(conn->incoming_cmd, "MAPADDRESS")) {
  853.     if (handle_control_mapaddress(conn, cmd_data_len, args))
  854.       return -1;
  855.   } else if (!strcasecmp(conn->incoming_cmd, "GETINFO")) {
  856.     if (handle_control_getinfo(conn, cmd_data_len, args))
  857.       return -1;
  858.   } else if (!strcasecmp(conn->incoming_cmd, "EXTENDCIRCUIT")) {
  859.     if (handle_control_extendcircuit(conn, cmd_data_len, args))
  860.       return -1;
  861.   } else if (!strcasecmp(conn->incoming_cmd, "SETCIRCUITPURPOSE")) {
  862.     if (handle_control_setcircuitpurpose(conn, cmd_data_len, args))
  863.       return -1;
  864.   } else if (!strcasecmp(conn->incoming_cmd, "SETROUTERPURPOSE")) {
  865.     connection_write_str_to_buf("511 SETROUTERPURPOSE is obsolete.rn", conn);
  866.   } else if (!strcasecmp(conn->incoming_cmd, "ATTACHSTREAM")) {
  867.     if (handle_control_attachstream(conn, cmd_data_len, args))
  868.       return -1;
  869.   } else if (!strcasecmp(conn->incoming_cmd, "+POSTDESCRIPTOR")) {
  870.     if (handle_control_postdescriptor(conn, cmd_data_len, args))
  871.       return -1;
  872.   } else if (!strcasecmp(conn->incoming_cmd, "REDIRECTSTREAM")) {
  873.     if (handle_control_redirectstream(conn, cmd_data_len, args))
  874.       return -1;
  875.   } else if (!strcasecmp(conn->incoming_cmd, "CLOSESTREAM")) {
  876.     if (handle_control_closestream(conn, cmd_data_len, args))
  877.       return -1;
  878.   } else if (!strcasecmp(conn->incoming_cmd, "CLOSECIRCUIT")) {
  879.     if (handle_control_closecircuit(conn, cmd_data_len, args))
  880.       return -1;
  881.   } else if (!strcasecmp(conn->incoming_cmd, "USEFEATURE")) {
  882.     if (handle_control_usefeature(conn, cmd_data_len, args))
  883.       return -1;
  884.   } else if (!strcasecmp(conn->incoming_cmd, "RESOLVE")) {
  885.     if (handle_control_resolve(conn, cmd_data_len, args))
  886.       return -1;
  887.   } else if (!strcasecmp(conn->incoming_cmd, "PROTOCOLINFO")) {
  888.     if (handle_control_protocolinfo(conn, cmd_data_len, args))
  889.       return -1;
  890.   } else {
  891.     connection_printf_to_buf(conn, "510 Unrecognized command "%s"rn",
  892.                              conn->incoming_cmd);
  893.   }
  894.   conn->incoming_cmd_cur_len = 0;
  895.   goto again;
  896. }
  897. /** Something has happened to circuit <b>circ</b>: tell any interested
  898.  * control connections. */
  899. int
  900. control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp,
  901.                              int reason_code)
  902. {
  903.   const char *status;
  904.   char extended_buf[96];
  905.   int providing_reason=0;
  906.   if (!EVENT_IS_INTERESTING(EVENT_CIRCUIT_STATUS))
  907.     return 0;
  908.   tor_assert(circ);
  909.   switch (tp)
  910.     {
  911.     case CIRC_EVENT_LAUNCHED: status = "LAUNCHED"; break;
  912.     case CIRC_EVENT_BUILT: status = "BUILT"; break;
  913.     case CIRC_EVENT_EXTENDED: status = "EXTENDED"; break;
  914.     case CIRC_EVENT_FAILED: status = "FAILED"; break;
  915.     case CIRC_EVENT_CLOSED: status = "CLOSED"; break;
  916.     default:
  917.       log_warn(LD_BUG, "Unrecognized status code %d", (int)tp);
  918.       return 0;
  919.     }
  920.   tor_snprintf(extended_buf, sizeof(extended_buf), "PURPOSE=%s",
  921.                circuit_purpose_to_controller_string(circ->_base.purpose));
  922.   if (tp == CIRC_EVENT_FAILED || tp == CIRC_EVENT_CLOSED) {
  923.     const char *reason_str = circuit_end_reason_to_control_string(reason_code);
  924.     char *reason = NULL;
  925.     size_t n=strlen(extended_buf);
  926.     providing_reason=1;
  927.     if (!reason_str) {
  928.       reason = tor_malloc(16);
  929.       tor_snprintf(reason, 16, "UNKNOWN_%d", reason_code);
  930.       reason_str = reason;
  931.     }
  932.     if (reason_code > 0 && reason_code & END_CIRC_REASON_FLAG_REMOTE) {
  933.       tor_snprintf(extended_buf+n, sizeof(extended_buf)-n,
  934.                    " REASON=DESTROYED REMOTE_REASON=%s", reason_str);
  935.     } else {
  936.       tor_snprintf(extended_buf+n, sizeof(extended_buf)-n,
  937.                    " REASON=%s", reason_str);
  938.     }
  939.     tor_free(reason);
  940.   }
  941.   if (EVENT_IS_INTERESTING1S(EVENT_CIRCUIT_STATUS)) {
  942.     char *path = circuit_list_path(circ,0);
  943.     const char *sp = strlen(path) ? " " : "";
  944.     send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES,
  945.                                 "650 CIRC %lu %s%s%s@%srn",
  946.                                 (unsigned long)circ->global_identifier,
  947.                                 status, sp, path, extended_buf);
  948.     tor_free(path);
  949.   }
  950.   if (EVENT_IS_INTERESTING1L(EVENT_CIRCUIT_STATUS)) {
  951.     char *vpath = circuit_list_path_for_controller(circ);
  952.     const char *sp = strlen(vpath) ? " " : "";
  953.     send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES,
  954.                                 "650 CIRC %lu %s%s%s@%srn",
  955.                                 (unsigned long)circ->global_identifier,
  956.                                 status, sp, vpath, extended_buf);
  957.     tor_free(vpath);
  958.   }
  959.   return 0;
  960. }
  961. /** Given an AP connection <b>conn</b> and a <b>len</b>-character buffer
  962.  * <b>buf</b>, determine the address:port combination requested on
  963.  * <b>conn</b>, and write it to <b>buf</b>.  Return 0 on success, -1 on
  964.  * failure. */
  965. static int
  966. write_stream_target_to_buf(edge_connection_t *conn, char *buf, size_t len)
  967. {
  968.   char buf2[256];
  969.   if (conn->chosen_exit_name)
  970.     if (tor_snprintf(buf2, sizeof(buf2), ".%s.exit", conn->chosen_exit_name)<0)
  971.       return -1;
  972.   if (!conn->socks_request)
  973.     return -1;
  974.   if (tor_snprintf(buf, len, "%s%s%s:%d",
  975.                conn->socks_request->address,
  976.                conn->chosen_exit_name ? buf2 : "",
  977.                !conn->chosen_exit_name &&
  978.                  connection_edge_is_rendezvous_stream(conn) ? ".onion" : "",
  979.                conn->socks_request->port)<0)
  980.     return -1;
  981.   return 0;
  982. }
  983. /** Something has happened to the stream associated with AP connection
  984.  * <b>conn</b>: tell any interested control connections. */
  985. int
  986. control_event_stream_status(edge_connection_t *conn, stream_status_event_t tp,
  987.                             int reason_code)
  988. {
  989.   char reason_buf[64];
  990.   char addrport_buf[64];
  991.   const char *status;
  992.   circuit_t *circ;
  993.   origin_circuit_t *origin_circ = NULL;
  994.   char buf[256];
  995.   const char *purpose = "";
  996.   tor_assert(conn->socks_request);
  997.   if (!EVENT_IS_INTERESTING(EVENT_STREAM_STATUS))
  998.     return 0;
  999.   if (tp == STREAM_EVENT_CLOSED &&
  1000.       (reason_code & END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED))
  1001.     return 0;
  1002.   write_stream_target_to_buf(conn, buf, sizeof(buf));
  1003.   reason_buf[0] = '';
  1004.   switch (tp)
  1005.     {
  1006.     case STREAM_EVENT_SENT_CONNECT: status = "SENTCONNECT"; break;
  1007.     case STREAM_EVENT_SENT_RESOLVE: status = "SENTRESOLVE"; break;
  1008.     case STREAM_EVENT_SUCCEEDED: status = "SUCCEEDED"; break;
  1009.     case STREAM_EVENT_FAILED: status = "FAILED"; break;
  1010.     case STREAM_EVENT_CLOSED: status = "CLOSED"; break;
  1011.     case STREAM_EVENT_NEW: status = "NEW"; break;
  1012.     case STREAM_EVENT_NEW_RESOLVE: status = "NEWRESOLVE"; break;
  1013.     case STREAM_EVENT_FAILED_RETRIABLE: status = "DETACHED"; break;
  1014.     case STREAM_EVENT_REMAP: status = "REMAP"; break;
  1015.     default:
  1016.       log_warn(LD_BUG, "Unrecognized status code %d", (int)tp);
  1017.       return 0;
  1018.     }
  1019.   if (reason_code && (tp == STREAM_EVENT_FAILED ||
  1020.                       tp == STREAM_EVENT_CLOSED ||
  1021.                       tp == STREAM_EVENT_FAILED_RETRIABLE)) {
  1022.     const char *reason_str = stream_end_reason_to_control_string(reason_code);
  1023.     char *r = NULL;
  1024.     if (!reason_str) {
  1025.       r = tor_malloc(16);
  1026.       tor_snprintf(r, 16, "UNKNOWN_%d", reason_code);
  1027.       reason_str = r;
  1028.     }
  1029.     if (reason_code & END_STREAM_REASON_FLAG_REMOTE)
  1030.       tor_snprintf(reason_buf, sizeof(reason_buf),
  1031.                    "REASON=END REMOTE_REASON=%s", reason_str);
  1032.     else
  1033.       tor_snprintf(reason_buf, sizeof(reason_buf),
  1034.                    "REASON=%s", reason_str);
  1035.     tor_free(r);
  1036.   } else if (reason_code && tp == STREAM_EVENT_REMAP) {
  1037.     switch (reason_code) {
  1038.     case REMAP_STREAM_SOURCE_CACHE:
  1039.       strlcpy(reason_buf, "SOURCE=CACHE", sizeof(reason_buf));
  1040.       break;
  1041.     case REMAP_STREAM_SOURCE_EXIT:
  1042.       strlcpy(reason_buf, "SOURCE=EXIT", sizeof(reason_buf));
  1043.       break;
  1044.     default:
  1045.       tor_snprintf(reason_buf, sizeof(reason_buf), "REASON=UNKNOWN_%d",
  1046.                    reason_code);
  1047.       /* XXX do we want SOURCE=UNKNOWN_%d above instead? -RD */
  1048.       break;
  1049.     }
  1050.   }
  1051.   if (tp == STREAM_EVENT_NEW) {
  1052.     tor_snprintf(addrport_buf,sizeof(addrport_buf), "%sSOURCE_ADDR=%s:%d",
  1053.                  strlen(reason_buf) ? " " : "",
  1054.                  TO_CONN(conn)->address, TO_CONN(conn)->port );
  1055.   } else {
  1056.     addrport_buf[0] = '';
  1057.   }
  1058.   if (tp == STREAM_EVENT_NEW_RESOLVE) {
  1059.     purpose = " PURPOSE=DNS_REQUEST";
  1060.   } else if (tp == STREAM_EVENT_NEW) {
  1061.     if (conn->is_dns_request ||
  1062.         (conn->socks_request &&
  1063.          SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)))
  1064.       purpose = " PURPOSE=DNS_REQUEST";
  1065.     else if (conn->use_begindir) {
  1066.       connection_t *linked = TO_CONN(conn)->linked_conn;
  1067.       int linked_dir_purpose = -1;
  1068.       if (linked && linked->type == CONN_TYPE_DIR)
  1069.         linked_dir_purpose = linked->purpose;
  1070.       if (DIR_PURPOSE_IS_UPLOAD(linked_dir_purpose))
  1071.         purpose = " PURPOSE=DIR_UPLOAD";
  1072.       else
  1073.         purpose = " PURPOSE=DIR_FETCH";
  1074.     } else
  1075.       purpose = " PURPOSE=USER";
  1076.   }
  1077.   circ = circuit_get_by_edge_conn(conn);
  1078.   if (circ && CIRCUIT_IS_ORIGIN(circ))
  1079.     origin_circ = TO_ORIGIN_CIRCUIT(circ);
  1080.   send_control_event_extended(EVENT_STREAM_STATUS, ALL_NAMES,
  1081.                         "650 STREAM "U64_FORMAT" %s %lu %s@%s%s%srn",
  1082.                         U64_PRINTF_ARG(conn->_base.global_identifier), status,
  1083.                         origin_circ?
  1084.                            (unsigned long)origin_circ->global_identifier : 0ul,
  1085.                         buf, reason_buf, addrport_buf, purpose);
  1086.   /* XXX need to specify its intended exit, etc? */
  1087.   return 0;
  1088. }
  1089. /** Figure out the best name for the target router of an OR connection
  1090.  * <b>conn</b>, and write it into the <b>len</b>-character buffer
  1091.  * <b>name</b>.  Use verbose names if <b>long_names</b> is set. */
  1092. static void
  1093. orconn_target_get_name(int long_names,
  1094.                        char *name, size_t len, or_connection_t *conn)
  1095. {
  1096.   if (! long_names) {
  1097.     if (conn->nickname)
  1098.       strlcpy(name, conn->nickname, len);
  1099.     else
  1100.       tor_snprintf(name, len, "%s:%d",
  1101.                    conn->_base.address, conn->_base.port);
  1102.   } else {
  1103.     routerinfo_t *ri = router_get_by_digest(conn->identity_digest);
  1104.     if (ri) {
  1105.       tor_assert(len > MAX_VERBOSE_NICKNAME_LEN);
  1106.       router_get_verbose_nickname(name, ri);
  1107.     } else if (! tor_digest_is_zero(conn->identity_digest)) {
  1108.       name[0] = '$';
  1109.       base16_encode(name+1, len-1, conn->identity_digest,
  1110.                     DIGEST_LEN);
  1111.     } else {
  1112.      tor_snprintf(name, len, "%s:%d",
  1113.                    conn->_base.address, conn->_base.port);
  1114.     }
  1115.   }
  1116. }
  1117. /** Called when the status of an OR connection <b>conn</b> changes: tell any
  1118.  * interested control connections. <b>tp</b> is the new status for the
  1119.  * connection.  If <b>conn</b> has just closed or failed, then <b>reason</b>
  1120.  * may be the reason why.
  1121.  */
  1122. int
  1123. control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp,
  1124.                              int reason)
  1125. {
  1126.   int ncircs = 0;
  1127.   const char *status;
  1128.   char name[128];
  1129.   char ncircs_buf[32] = {0}; /* > 8 + log10(2^32)=10 + 2 */
  1130.   if (!EVENT_IS_INTERESTING(EVENT_OR_CONN_STATUS))
  1131.     return 0;
  1132.   switch (tp)
  1133.     {
  1134.     case OR_CONN_EVENT_LAUNCHED: status = "LAUNCHED"; break;
  1135.     case OR_CONN_EVENT_CONNECTED: status = "CONNECTED"; break;
  1136.     case OR_CONN_EVENT_FAILED: status = "FAILED"; break;
  1137.     case OR_CONN_EVENT_CLOSED: status = "CLOSED"; break;
  1138.     case OR_CONN_EVENT_NEW: status = "NEW"; break;
  1139.     default:
  1140.       log_warn(LD_BUG, "Unrecognized status code %d", (int)tp);
  1141.       return 0;
  1142.     }
  1143.   ncircs = circuit_count_pending_on_or_conn(conn);
  1144.   ncircs += conn->n_circuits;
  1145.   if (ncircs && (tp == OR_CONN_EVENT_FAILED || tp == OR_CONN_EVENT_CLOSED)) {
  1146.     tor_snprintf(ncircs_buf, sizeof(ncircs_buf), "%sNCIRCS=%d",
  1147.                  reason ? " " : "", ncircs);
  1148.   }
  1149.   if (EVENT_IS_INTERESTING1S(EVENT_OR_CONN_STATUS)) {
  1150.     orconn_target_get_name(0, name, sizeof(name), conn);
  1151.     send_control_event_extended(EVENT_OR_CONN_STATUS, SHORT_NAMES,
  1152.                           "650 ORCONN %s %s@%s%s%srn",
  1153.                           name, status,
  1154.                           reason ? "REASON=" : "",
  1155.                           orconn_end_reason_to_control_string(reason),
  1156.                           ncircs_buf);
  1157.   }
  1158.   if (EVENT_IS_INTERESTING1L(EVENT_OR_CONN_STATUS)) {
  1159.     orconn_target_get_name(1, name, sizeof(name), conn);
  1160.     send_control_event_extended(EVENT_OR_CONN_STATUS, LONG_NAMES,
  1161.                           "650 ORCONN %s %s@%s%s%srn",
  1162.                           name, status,
  1163.                           reason ? "REASON=" : "",
  1164.                           orconn_end_reason_to_control_string(reason),
  1165.                           ncircs_buf);
  1166.   }
  1167.   return 0;
  1168. }
  1169. /**
  1170.  * Print out STREAM_BW event for a single conn
  1171.  */
  1172. int
  1173. control_event_stream_bandwidth(edge_connection_t *edge_conn)
  1174. {
  1175.   if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) {
  1176.     if (!edge_conn->n_read && !edge_conn->n_written)
  1177.       return 0;
  1178.     send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_NAMES,
  1179.                        "650 STREAM_BW "U64_FORMAT" %lu %lurn",
  1180.                        U64_PRINTF_ARG(edge_conn->_base.global_identifier),
  1181.                        (unsigned long)edge_conn->n_read,
  1182.                        (unsigned long)edge_conn->n_written);
  1183.     edge_conn->n_written = edge_conn->n_read = 0;
  1184.   }
  1185.   return 0;
  1186. }
  1187. /** A second or more has elapsed: tell any interested control
  1188.  * connections how much bandwidth streams have used. */
  1189. int
  1190. control_event_stream_bandwidth_used(void)
  1191. {
  1192.   if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) {
  1193.     smartlist_t *conns = get_connection_array();
  1194.     edge_connection_t *edge_conn;
  1195.     SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn)
  1196.     {
  1197.         if (conn->type != CONN_TYPE_AP)
  1198.           continue;
  1199.         edge_conn = TO_EDGE_CONN(conn);
  1200.         if (!edge_conn->n_read && !edge_conn->n_written)
  1201.           continue;
  1202.         send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_NAMES,
  1203.                            "650 STREAM_BW "U64_FORMAT" %lu %lurn",
  1204.                            U64_PRINTF_ARG(edge_conn->_base.global_identifier),
  1205.                            (unsigned long)edge_conn->n_read,
  1206.                            (unsigned long)edge_conn->n_written);
  1207.         edge_conn->n_written = edge_conn->n_read = 0;
  1208.     }
  1209.     SMARTLIST_FOREACH_END(conn);
  1210.   }
  1211.   return 0;
  1212. }
  1213. /** A second or more has elapsed: tell any interested control
  1214.  * connections how much bandwidth we used. */
  1215. int
  1216. control_event_bandwidth_used(uint32_t n_read, uint32_t n_written)
  1217. {
  1218.   if (EVENT_IS_INTERESTING(EVENT_BANDWIDTH_USED)) {
  1219.     send_control_event(EVENT_BANDWIDTH_USED, ALL_NAMES,
  1220.                        "650 BW %lu %lurn",
  1221.                        (unsigned long)n_read,
  1222.                        (unsigned long)n_written);
  1223.   }
  1224.   return 0;
  1225. }
  1226. /** Called when we are sending a log message to the controllers: suspend
  1227.  * sending further log messages to the controllers until we're done.  Used by
  1228.  * CONN_LOG_PROTECT. */
  1229. void
  1230. disable_control_logging(void)
  1231. {
  1232.   ++disable_log_messages;
  1233. }
  1234. /** We're done sending a log message to the controllers: re-enable controller
  1235.  * logging.  Used by CONN_LOG_PROTECT. */
  1236. void
  1237. enable_control_logging(void)
  1238. {
  1239.   if (--disable_log_messages < 0)
  1240.     tor_assert(0);
  1241. }
  1242. /** We got a log message: tell any interested control connections. */
  1243. void
  1244. control_event_logmsg(int severity, uint32_t domain, const char *msg)
  1245. {
  1246.   int event;
  1247.   /* Don't even think of trying to add stuff to a buffer from a cpuworker
  1248.    * thread. */
  1249.   if (! in_main_thread())
  1250.     return;
  1251.   if (disable_log_messages)
  1252.     return;
  1253.   if (domain == LD_BUG && EVENT_IS_INTERESTING(EVENT_STATUS_GENERAL) &&
  1254.       severity <= LOG_NOTICE) {
  1255.     char *esc = esc_for_log(msg);
  1256.     ++disable_log_messages;
  1257.     control_event_general_status(severity, "BUG REASON="%s"", esc);
  1258.     --disable_log_messages;
  1259.     tor_free(esc);
  1260.   }
  1261.   event = log_severity_to_event(severity);
  1262.   if (event >= 0 && EVENT_IS_INTERESTING(event)) {
  1263.     char *b = NULL;
  1264.     const char *s;
  1265.     if (strchr(msg, 'n')) {
  1266.       char *cp;
  1267.       b = tor_strdup(msg);
  1268.       for (cp = b; *cp; ++cp)
  1269.         if (*cp == 'r' || *cp == 'n')
  1270.           *cp = ' ';
  1271.     }
  1272.     switch (severity) {
  1273.       case LOG_DEBUG: s = "DEBUG"; break;
  1274.       case LOG_INFO: s = "INFO"; break;
  1275.       case LOG_NOTICE: s = "NOTICE"; break;
  1276.       case LOG_WARN: s = "WARN"; break;
  1277.       case LOG_ERR: s = "ERR"; break;
  1278.       default: s = "UnknownLogSeverity"; break;
  1279.     }
  1280.     ++disable_log_messages;
  1281.     send_control_event(event, ALL_NAMES, "650 %s %srn", s, b?b:msg);
  1282.     --disable_log_messages;
  1283.     tor_free(b);
  1284.   }
  1285. }
  1286. /** Called whenever we receive new router descriptors: tell any
  1287.  * interested control connections.  <b>routers</b> is a list of
  1288.  * routerinfo_t's.
  1289.  */
  1290. int
  1291. control_event_descriptors_changed(smartlist_t *routers)
  1292. {
  1293.   size_t len;
  1294.   char *msg;
  1295.   smartlist_t *identities = NULL;
  1296.   char buf[HEX_DIGEST_LEN+1];
  1297.   if (!EVENT_IS_INTERESTING(EVENT_NEW_DESC))
  1298.     return 0;
  1299.   if (EVENT_IS_INTERESTING1S(EVENT_NEW_DESC)) {
  1300.     identities = smartlist_create();
  1301.     SMARTLIST_FOREACH(routers, routerinfo_t *, r,
  1302.     {
  1303.       base16_encode(buf,sizeof(buf),r->cache_info.identity_digest,DIGEST_LEN);
  1304.       smartlist_add(identities, tor_strdup(buf));
  1305.     });
  1306.   }
  1307.   if (EVENT_IS_INTERESTING1S(EVENT_NEW_DESC)) {
  1308.     char *ids = smartlist_join_strings(identities, " ", 0, &len);
  1309.     size_t ids_len = strlen(ids)+32;
  1310.     msg = tor_malloc(ids_len);
  1311.     tor_snprintf(msg, ids_len, "650 NEWDESC %srn", ids);
  1312.     send_control_event_string(EVENT_NEW_DESC, SHORT_NAMES|ALL_FORMATS, msg);
  1313.     tor_free(ids);
  1314.     tor_free(msg);
  1315.   }
  1316.   if (EVENT_IS_INTERESTING1L(EVENT_NEW_DESC)) {
  1317.     smartlist_t *names = smartlist_create();
  1318.     char *ids;
  1319.     size_t names_len;
  1320.     SMARTLIST_FOREACH(routers, routerinfo_t *, ri, {
  1321.         char *b = tor_malloc(MAX_VERBOSE_NICKNAME_LEN+1);
  1322.         router_get_verbose_nickname(b, ri);
  1323.         smartlist_add(names, b);
  1324.       });
  1325.     ids = smartlist_join_strings(names, " ", 0, &names_len);
  1326.     names_len = strlen(ids)+32;
  1327.     msg = tor_malloc(names_len);
  1328.     tor_snprintf(msg, names_len, "650 NEWDESC %srn", ids);
  1329.     send_control_event_string(EVENT_NEW_DESC, LONG_NAMES|ALL_FORMATS, msg);
  1330.     tor_free(ids);
  1331.     tor_free(msg);
  1332.     SMARTLIST_FOREACH(names, char *, cp, tor_free(cp));
  1333.     smartlist_free(names);
  1334.   }
  1335.   if (identities) {
  1336.     SMARTLIST_FOREACH(identities, char *, cp, tor_free(cp));
  1337.     smartlist_free(identities);
  1338.   }
  1339.   return 0;
  1340. }
  1341. /** Called when an address mapping on <b>from</b> from changes to <b>to</b>.
  1342.  * <b>expires</b> values less than 3 are special; see connection_edge.c.  If
  1343.  * <b>error</b> is non-NULL, it is an error code describing the failure
  1344.  * mode of the mapping.
  1345.  */
  1346. int
  1347. control_event_address_mapped(const char *from, const char *to, time_t expires,
  1348.                              const char *error)
  1349. {
  1350.   if (!EVENT_IS_INTERESTING(EVENT_ADDRMAP))
  1351.     return 0;
  1352.   if (expires < 3 || expires == TIME_MAX)
  1353.     send_control_event_extended(EVENT_ADDRMAP, ALL_NAMES,
  1354.                                 "650 ADDRMAP %s %s NEVER@%srn", from, to,
  1355.                                 error?error:"");
  1356.   else {
  1357.     char buf[ISO_TIME_LEN+1];
  1358.     char buf2[ISO_TIME_LEN+1];
  1359.     format_local_iso_time(buf,expires);
  1360.     format_iso_time(buf2,expires);
  1361.     send_control_event_extended(EVENT_ADDRMAP, ALL_NAMES,
  1362.                                 "650 ADDRMAP %s %s "%s""
  1363.                                 "@%s%sEXPIRES="%s"rn",
  1364.                                 from, to, buf,
  1365.                                 error?error:"", error?" ":"",
  1366.                                 buf2);
  1367.   }
  1368.   return 0;
  1369. }
  1370. /** The authoritative dirserver has received a new descriptor that
  1371.  * has passed basic syntax checks and is properly self-signed.
  1372.  *
  1373.  * Notify any interested party of the new descriptor and what has
  1374.  * been done with it, and also optionally give an explanation/reason. */
  1375. int
  1376. control_event_or_authdir_new_descriptor(const char *action,
  1377.                                         const char *desc, size_t desclen,
  1378.                                         const char *msg)
  1379. {
  1380.   char firstline[1024];
  1381.   char *buf;
  1382.   size_t totallen;
  1383.   char *esc = NULL;
  1384.   size_t esclen;
  1385.   if (!EVENT_IS_INTERESTING(EVENT_AUTHDIR_NEWDESCS))
  1386.     return 0;
  1387.   tor_snprintf(firstline, sizeof(firstline),
  1388.                "650+AUTHDIR_NEWDESC=rn%srn%srn",
  1389.                action,
  1390.                msg ? msg : "");
  1391.   /* Escape the server descriptor properly */
  1392.   esclen = write_escaped_data(desc, desclen, &esc);
  1393.   totallen = strlen(firstline) + esclen + 1;
  1394.   buf = tor_malloc(totallen);
  1395.   strlcpy(buf, firstline, totallen);
  1396.   strlcpy(buf+strlen(firstline), esc, totallen);
  1397.   send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_NAMES|ALL_FORMATS,
  1398.                             buf);
  1399.   send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_NAMES|ALL_FORMATS,
  1400.                             "650 OKrn");
  1401.   tor_free(esc);
  1402.   tor_free(buf);
  1403.   return 0;
  1404. }
  1405. /** Helper function for NS-style events. Constructs and sends an event
  1406.  * of type <b>event</b> with string <b>event_string</b> out of the set of
  1407.  * networkstatuses <b>statuses</b>. Currently it is used for NS events
  1408.  * and NEWCONSENSUS events. */
  1409. static int
  1410. control_event_networkstatus_changed_helper(smartlist_t *statuses,
  1411.                                            uint16_t event,
  1412.                                            const char *event_string)
  1413. {
  1414.   smartlist_t *strs;
  1415.   char *s, *esc = NULL;
  1416.   if (!EVENT_IS_INTERESTING(event) || !smartlist_len(statuses))
  1417.     return 0;
  1418.   strs = smartlist_create();
  1419.   smartlist_add(strs, tor_strdup("650+"));
  1420.   smartlist_add(strs, tor_strdup(event_string));
  1421.   smartlist_add(strs, tor_strdup("rn"));
  1422.   SMARTLIST_FOREACH(statuses, routerstatus_t *, rs,
  1423.     {
  1424.       s = networkstatus_getinfo_helper_single(rs);
  1425.       if (!s) continue;
  1426.       smartlist_add(strs, s);
  1427.     });
  1428.   s = smartlist_join_strings(strs, "", 0, NULL);
  1429.   write_escaped_data(s, strlen(s), &esc);
  1430.   SMARTLIST_FOREACH(strs, char *, cp, tor_free(cp));
  1431.   smartlist_free(strs);
  1432.   tor_free(s);
  1433.   send_control_event_string(event, ALL_NAMES|ALL_FORMATS, esc);
  1434.   send_control_event_string(event, ALL_NAMES|ALL_FORMATS,
  1435.                             "650 OKrn");
  1436.   tor_free(esc);
  1437.   return 0;
  1438. }
  1439. /** Called when the routerstatus_ts <b>statuses</b> have changed: sends
  1440.  * an NS event to any controller that cares. */
  1441. int
  1442. control_event_networkstatus_changed(smartlist_t *statuses)
  1443. {
  1444.   return control_event_networkstatus_changed_helper(statuses, EVENT_NS, "NS");
  1445. }
  1446. /** Called when we get a new consensus networkstatus. Sends a NEWCONSENSUS
  1447.  * event consisting of an NS-style line for each relay in the consensus. */
  1448. int
  1449. control_event_newconsensus(const networkstatus_t *consensus)
  1450. {
  1451.   if (!control_event_is_interesting(EVENT_NEWCONSENSUS))
  1452.     return 0;
  1453.   return control_event_networkstatus_changed_helper(
  1454.            consensus->routerstatus_list, EVENT_NEWCONSENSUS, "NEWCONSENSUS");
  1455. }
  1456. /** Called when a single local_routerstatus_t has changed: Sends an NS event
  1457.  * to any controller that cares. */
  1458. int
  1459. control_event_networkstatus_changed_single(routerstatus_t *rs)
  1460. {
  1461.   smartlist_t *statuses;
  1462.   int r;
  1463.   if (!EVENT_IS_INTERESTING(EVENT_NS))
  1464.     return 0;
  1465.   statuses = smartlist_create();
  1466.   smartlist_add(statuses, rs);
  1467.   r = control_event_networkstatus_changed(statuses);
  1468.   smartlist_free(statuses);
  1469.   return r;
  1470. }
  1471. /** Our own router descriptor has changed; tell any controllers that care.
  1472.  */
  1473. int
  1474. control_event_my_descriptor_changed(void)
  1475. {
  1476.   send_control_event(EVENT_DESCCHANGED, ALL_NAMES, "650 DESCCHANGEDrn");
  1477.   return 0;
  1478. }
  1479. /** Helper: sends a status event where <b>type</b> is one of
  1480.  * EVENT_STATUS_{GENERAL,CLIENT,SERVER}, where <b>severity</b> is one of
  1481.  * LOG_{NOTICE,WARN,ERR}, and where <b>format</b> is a printf-style format
  1482.  * string corresponding to <b>args</b>. */
  1483. static int
  1484. control_event_status(int type, int severity, const char *format, va_list args)
  1485. {
  1486.   char format_buf[160];
  1487.   const char *status, *sev;
  1488.   switch (type) {
  1489.     case EVENT_STATUS_GENERAL:
  1490.       status = "STATUS_GENERAL";
  1491.       break;
  1492.     case EVENT_STATUS_CLIENT:
  1493.       status = "STATUS_CLIENT";
  1494.       break;
  1495.     case EVENT_STATUS_SERVER:
  1496.       status = "STATUS_SERVER";
  1497.       break;
  1498.     default:
  1499.       log_warn(LD_BUG, "Unrecognized status type %d", type);
  1500.       return -1;
  1501.   }
  1502.   switch (severity) {
  1503.     case LOG_NOTICE:
  1504.       sev = "NOTICE";
  1505.       break;
  1506.     case LOG_WARN:
  1507.       sev = "WARN";
  1508.       break;
  1509.     case LOG_ERR:
  1510.       sev = "ERR";
  1511.       break;
  1512.     default:
  1513.       log_warn(LD_BUG, "Unrecognized status severity %d", severity);
  1514.       return -1;
  1515.   }
  1516.   if (tor_snprintf(format_buf, sizeof(format_buf), "650 %s %s %srn",
  1517.                    status, sev, format)<0) {
  1518.     log_warn(LD_BUG, "Format string too long.");
  1519.     return -1;
  1520.   }
  1521.   send_control_event_impl(type, ALL_NAMES|ALL_FORMATS, 0, format_buf, args);
  1522.   return 0;
  1523. }
  1524. /** Format and send an EVENT_STATUS_GENERAL event whose main text is obtained
  1525.  * by formatting the arguments using the printf-style <b>format</b>. */
  1526. int
  1527. control_event_general_status(int severity, const char *format, ...)
  1528. {
  1529.   va_list ap;
  1530.   int r;
  1531.   if (!EVENT_IS_INTERESTING(EVENT_STATUS_GENERAL))
  1532.     return 0;
  1533.   va_start(ap, format);
  1534.   r = control_event_status(EVENT_STATUS_GENERAL, severity, format, ap);
  1535.   va_end(ap);
  1536.   return r;
  1537. }
  1538. /** Format and send an EVENT_STATUS_CLIENT event whose main text is obtained
  1539.  * by formatting the arguments using the printf-style <b>format</b>. */
  1540. int
  1541. control_event_client_status(int severity, const char *format, ...)
  1542. {
  1543.   va_list ap;
  1544.   int r;
  1545.   if (!EVENT_IS_INTERESTING(EVENT_STATUS_CLIENT))
  1546.     return 0;
  1547.   va_start(ap, format);
  1548.   r = control_event_status(EVENT_STATUS_CLIENT, severity, format, ap);
  1549.   va_end(ap);
  1550.   return r;
  1551. }
  1552. /** Format and send an EVENT_STATUS_SERVER event whose main text is obtained
  1553.  * by formatting the arguments using the printf-style <b>format</b>. */
  1554. int
  1555. control_event_server_status(int severity, const char *format, ...)
  1556. {
  1557.   va_list ap;
  1558.   int r;
  1559.   if (!EVENT_IS_INTERESTING(EVENT_STATUS_SERVER))
  1560.     return 0;
  1561.   va_start(ap, format);
  1562.   r = control_event_status(EVENT_STATUS_SERVER, severity, format, ap);
  1563.   va_end(ap);
  1564.   return r;
  1565. }
  1566. /** Called when the status of an entry guard with the given <b>nickname</b>
  1567.  * and identity <b>digest</b> has changed to <b>status</b>: tells any
  1568.  * controllers that care. */
  1569. int
  1570. control_event_guard(const char *nickname, const char *digest,
  1571.                     const char *status)
  1572. {
  1573.   char hbuf[HEX_DIGEST_LEN+1];
  1574.   base16_encode(hbuf, sizeof(hbuf), digest, DIGEST_LEN);
  1575.   if (!EVENT_IS_INTERESTING(EVENT_GUARD))
  1576.     return 0;
  1577.   if (EVENT_IS_INTERESTING1L(EVENT_GUARD)) {
  1578.     char buf[MAX_VERBOSE_NICKNAME_LEN+1];
  1579.     routerinfo_t *ri = router_get_by_digest(digest);
  1580.     if (ri) {
  1581.       router_get_verbose_nickname(buf, ri);
  1582.     } else {
  1583.       tor_snprintf(buf, sizeof(buf), "$%s~%s", hbuf, nickname);
  1584.     }
  1585.     send_control_event(EVENT_GUARD, LONG_NAMES,
  1586.                        "650 GUARD ENTRY %s %srn", buf, status);
  1587.   }
  1588.   if (EVENT_IS_INTERESTING1S(EVENT_GUARD)) {
  1589.     send_control_event(EVENT_GUARD, SHORT_NAMES,
  1590.                        "650 GUARD ENTRY $%s %srn", hbuf, status);
  1591.   }
  1592.   return 0;
  1593. }
  1594. /** Helper: Return a newly allocated string containing a path to the
  1595.  * file where we store our authentication cookie. */
  1596. static char *
  1597. get_cookie_file(void)
  1598. {
  1599.   or_options_t *options = get_options();
  1600.   if (options->CookieAuthFile && strlen(options->CookieAuthFile)) {
  1601.     return tor_strdup(options->CookieAuthFile);
  1602.   } else {
  1603.     return get_datadir_fname("control_auth_cookie");
  1604.   }
  1605. }
  1606. /** Choose a random authentication cookie and write it to disk.
  1607.  * Anybody who can read the cookie from disk will be considered
  1608.  * authorized to use the control connection. Return -1 if we can't
  1609.  * write the file, or 0 on success. */
  1610. int
  1611. init_cookie_authentication(int enabled)
  1612. {
  1613.   char *fname;
  1614.   if (!enabled) {
  1615.     authentication_cookie_is_set = 0;
  1616.     return 0;
  1617.   }
  1618.   /* We don't want to generate a new cookie every time we call
  1619.    * options_act(). One should be enough. */
  1620.   if (authentication_cookie_is_set)
  1621.     return 0; /* all set */
  1622.   fname = get_cookie_file();
  1623.   crypto_rand(authentication_cookie, AUTHENTICATION_COOKIE_LEN);
  1624.   authentication_cookie_is_set = 1;
  1625.   if (write_bytes_to_file(fname, authentication_cookie,
  1626.                           AUTHENTICATION_COOKIE_LEN, 1)) {
  1627.     log_warn(LD_FS,"Error writing authentication cookie to %s.",
  1628.              escaped(fname));
  1629.     tor_free(fname);
  1630.     return -1;
  1631.   }
  1632. #ifndef MS_WINDOWS
  1633.   if (get_options()->CookieAuthFileGroupReadable) {
  1634.     if (chmod(fname, 0640)) {
  1635.       log_warn(LD_FS,"Unable to make %s group-readable.", escaped(fname));
  1636.     }
  1637.   }
  1638. #endif
  1639.   tor_free(fname);
  1640.   return 0;
  1641. }
  1642. /** Convert the name of a bootstrapping phase <b>s</b> into strings
  1643.  * <b>tag</b> and <b>summary</b> suitable for display by the controller. */
  1644. static int
  1645. bootstrap_status_to_string(bootstrap_status_t s, const char **tag,
  1646.                            const char **summary)
  1647. {
  1648.   switch (s) {
  1649.     case BOOTSTRAP_STATUS_UNDEF:
  1650.       *tag = "undef";
  1651.       *summary = "Undefined";
  1652.       break;
  1653.     case BOOTSTRAP_STATUS_STARTING:
  1654.       *tag = "starting";
  1655.       *summary = "Starting";
  1656.       break;
  1657.     case BOOTSTRAP_STATUS_CONN_DIR:
  1658.       *tag = "conn_dir";
  1659.       *summary = "Connecting to directory server";
  1660.       break;
  1661.     case BOOTSTRAP_STATUS_HANDSHAKE:
  1662.       *tag = "status_handshake";
  1663.       *summary = "Finishing handshake";
  1664.       break;
  1665.     case BOOTSTRAP_STATUS_HANDSHAKE_DIR:
  1666.       *tag = "handshake_dir";
  1667.       *summary = "Finishing handshake with directory server";
  1668.       break;
  1669.     case BOOTSTRAP_STATUS_ONEHOP_CREATE:
  1670.       *tag = "onehop_create";
  1671.       *summary = "Establishing an encrypted directory connection";
  1672.       break;
  1673.     case BOOTSTRAP_STATUS_REQUESTING_STATUS:
  1674.       *tag = "requesting_status";
  1675.       *summary = "Asking for networkstatus consensus";
  1676.       break;
  1677.     case BOOTSTRAP_STATUS_LOADING_STATUS:
  1678.       *tag = "loading_status";
  1679.       *summary = "Loading networkstatus consensus";
  1680.       break;
  1681.     case BOOTSTRAP_STATUS_LOADING_KEYS:
  1682.       *tag = "loading_keys";
  1683.       *summary = "Loading authority key certs";
  1684.       break;
  1685.     case BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS:
  1686.       *tag = "requesting_descriptors";
  1687.       *summary = "Asking for relay descriptors";
  1688.       break;
  1689.     case BOOTSTRAP_STATUS_LOADING_DESCRIPTORS:
  1690.       *tag = "loading_descriptors";
  1691.       *summary = "Loading relay descriptors";
  1692.       break;
  1693.     case BOOTSTRAP_STATUS_CONN_OR:
  1694.       *tag = "conn_or";
  1695.       *summary = "Connecting to the Tor network";
  1696.       break;
  1697.     case BOOTSTRAP_STATUS_HANDSHAKE_OR:
  1698.       *tag = "handshake_or";
  1699.       *summary = "Finishing handshake with first hop";
  1700.       break;
  1701.     case BOOTSTRAP_STATUS_CIRCUIT_CREATE:
  1702.       *tag = "circuit_create";
  1703.       *summary = "Establishing a Tor circuit";
  1704.       break;
  1705.     case BOOTSTRAP_STATUS_DONE:
  1706.       *tag = "done";
  1707.       *summary = "Done";
  1708.       break;
  1709.     default:
  1710. //      log_warn(LD_BUG, "Unrecognized bootstrap status code %d", s);
  1711.       *tag = *summary = "unknown";
  1712.       return -1;
  1713.   }
  1714.   return 0;
  1715. }
  1716. /** What percentage through the bootstrap process are we? We remember
  1717.  * this so we can avoid sending redundant bootstrap status events, and
  1718.  * so we can guess context for the bootstrap messages which are
  1719.  * ambiguous. It starts at 'undef', but gets set to 'starting' while
  1720.  * Tor initializes. */
  1721. static int bootstrap_percent = BOOTSTRAP_STATUS_UNDEF;
  1722. /** How many problems have we had getting to the next bootstrapping phase?
  1723.  * These include failure to establish a connection to a Tor relay,
  1724.  * failures to finish the TLS handshake, failures to validate the
  1725.  * consensus document, etc. */
  1726. static int bootstrap_problems = 0;
  1727. /* We only tell the controller once we've hit a threshold of problems
  1728.  * for the current phase. */
  1729. #define BOOTSTRAP_PROBLEM_THRESHOLD 10
  1730. /** Called when Tor has made progress at bootstrapping its directory
  1731.  * information and initial circuits.
  1732.  *
  1733.  * <b>status</b> is the new status, that is, what task we will be doing
  1734.  * next. <b>percent</b> is zero if we just started this task, else it
  1735.  * represents progress on the task. */
  1736. void
  1737. control_event_bootstrap(bootstrap_status_t status, int progress)
  1738. {
  1739.   const char *tag, *summary;
  1740.   char buf[BOOTSTRAP_MSG_LEN];
  1741.   if (bootstrap_percent == BOOTSTRAP_STATUS_DONE)
  1742.     return; /* already bootstrapped; nothing to be done here. */
  1743.   /* special case for handshaking status, since our TLS handshaking code
  1744.    * can't distinguish what the connection is going to be for. */
  1745.   if (status == BOOTSTRAP_STATUS_HANDSHAKE) {
  1746.     if (bootstrap_percent < BOOTSTRAP_STATUS_CONN_OR) {
  1747.       status =  BOOTSTRAP_STATUS_HANDSHAKE_DIR;
  1748.     } else {
  1749.       status = BOOTSTRAP_STATUS_HANDSHAKE_OR;
  1750.     }
  1751.   }
  1752.   if (status > bootstrap_percent ||
  1753.       (progress && progress > bootstrap_percent)) {
  1754.     bootstrap_status_to_string(status, &tag, &summary);
  1755.     log(status ? LOG_NOTICE : LOG_INFO, LD_CONTROL,
  1756.         "Bootstrapped %d%%: %s.", progress ? progress : status, summary);
  1757.     tor_snprintf(buf, sizeof(buf),
  1758.         "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY="%s"",
  1759.         progress ? progress : status, tag, summary);
  1760.     tor_snprintf(last_sent_bootstrap_message,
  1761.                  sizeof(last_sent_bootstrap_message),
  1762.                  "NOTICE %s", buf);
  1763.     control_event_client_status(LOG_NOTICE, "%s", buf);
  1764.     if (status > bootstrap_percent) {
  1765.       bootstrap_percent = status; /* new milestone reached */
  1766.     }
  1767.     if (progress > bootstrap_percent) {
  1768.       /* incremental progress within a milestone */
  1769.       bootstrap_percent = progress;
  1770.       bootstrap_problems = 0; /* Progress! Reset our problem counter. */
  1771.     }
  1772.   }
  1773. }
  1774. /** Called when Tor has failed to make bootstrapping progress in a way
  1775.  * that indicates a problem. <b>warn</b> gives a hint as to why, and
  1776.  * <b>reason</b> provides an "or_conn_end_reason" tag.
  1777.  */
  1778. void
  1779. control_event_bootstrap_problem(const char *warn, int reason)
  1780. {
  1781.   int status = bootstrap_percent;
  1782.   const char *tag, *summary;
  1783.   char buf[BOOTSTRAP_MSG_LEN];
  1784.   const char *recommendation = "ignore";
  1785.   if (bootstrap_percent == 100)
  1786.     return; /* already bootstrapped; nothing to be done here. */
  1787.   bootstrap_problems++;
  1788.   if (bootstrap_problems >= BOOTSTRAP_PROBLEM_THRESHOLD)
  1789.     recommendation = "warn";
  1790.   if (reason == END_OR_CONN_REASON_NO_ROUTE)
  1791.     recommendation = "warn";
  1792.   if (get_options()->UseBridges &&
  1793.       !any_bridge_descriptors_known() &&
  1794.       !any_pending_bridge_descriptor_fetches())
  1795.     recommendation = "warn";
  1796.   while (status>=0 && bootstrap_status_to_string(status, &tag, &summary) < 0)
  1797.     status--; /* find a recognized status string based on current progress */
  1798.   status = bootstrap_percent; /* set status back to the actual number */
  1799.   log_fn(!strcmp(recommendation, "warn") ? LOG_WARN : LOG_INFO,
  1800.          LD_CONTROL, "Problem bootstrapping. Stuck at %d%%: %s. (%s; %s; "
  1801.          "count %d; recommendation %s)",
  1802.          status, summary, warn,
  1803.          orconn_end_reason_to_control_string(reason),
  1804.          bootstrap_problems, recommendation);
  1805.   tor_snprintf(buf, sizeof(buf),
  1806.       "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY="%s" WARNING="%s" REASON=%s "
  1807.       "COUNT=%d RECOMMENDATION=%s",
  1808.       bootstrap_percent, tag, summary, warn,
  1809.       orconn_end_reason_to_control_string(reason), bootstrap_problems,
  1810.       recommendation);
  1811.   tor_snprintf(last_sent_bootstrap_message,
  1812.                sizeof(last_sent_bootstrap_message),
  1813.                "WARN %s", buf);
  1814.   control_event_client_status(LOG_WARN, "%s", buf);
  1815. }
  1816. /** We just generated a new summary of which countries we've seen clients
  1817.  * from recently. Send a copy to the controller in case it wants to
  1818.  * display it for the user. */
  1819. void
  1820. control_event_clients_seen(const char *timestarted, const char *countries)
  1821. {
  1822.   send_control_event(EVENT_CLIENTS_SEEN, 0,
  1823.     "650 CLIENTS_SEEN TimeStarted="%s" CountrySummary=%srn",
  1824.     timestarted, countries);
  1825. }