}
if (conn->_base.purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
+ int r;
if (status_code != 200) {
int severity = (status_code == 304) ? LOG_INFO : LOG_WARN;
log(severity, LD_DIR,
}
log_info(LD_DIR,"Received consensus directory (size %d) from server "
"'%s:%d'",(int) body_len, conn->_base.address, conn->_base.port);
- if (networkstatus_set_current_consensus(body, 0, 0)<0) {
- log_warn(LD_DIR, "Unable to load consensus directory dowloaded from "
- "server '%s:%d'", conn->_base.address, conn->_base.port);
+ if ((r=networkstatus_set_current_consensus(body, 0, 0))<0) {
+ log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR,
+ "Unable to load consensus directory downloaded from "
+ "server '%s:%d'", conn->_base.address, conn->_base.port);
tor_free(body); tor_free(headers); tor_free(reason);
networkstatus_consensus_download_failed(0);
return -1;
* <b>consensus</b>. If we don't have enough certificates to validate it,
* store it in consensus_waiting_for_certs and launch a certificate fetch.
*
- * Return 0 on success, -1 on failure. On -1, caller should increment
+ * Return 0 on success, <0 on failure. On failure, caller should increment
* the failure count as appropriate.
+ *
+ * We return -1 for mild failures that don't need to be reported to the
+ * user, and -2 for more serious problems.
*/
int
networkstatus_set_current_consensus(const char *consensus, int from_cache,
int was_waiting_for_certs)
{
networkstatus_vote_t *c;
- int r, result=-1;
+ int r, result = -1;
time_t now = time(NULL);
char *unverified_fname = NULL, *consensus_fname = NULL;
c = networkstatus_parse_vote_from_string(consensus, NULL, 0);
if (!c) {
log_warn(LD_DIR, "Unable to parse networkstatus consensus");
+ result = -2;
goto done;
}
if ((r=networkstatus_check_consensus_signature(c, 1))<0) {
if (r == -1 && !was_waiting_for_certs) {
/* Okay, so it _might_ be signed enough if we get more certificates. */
- if (!was_waiting_for_certs)
+ if (!was_waiting_for_certs) {
+ /* XXX020 eventually downgrade this log severity, or make it so
+ * users know why they're being told. */
log_notice(LD_DIR, "Not enough certificates to check networkstatus "
"consensus");
+ }
if (!current_consensus ||
c->valid_after > current_consensus->valid_after) {
if (consensus_waiting_for_certs)
unlink(unverified_fname);
}
goto done;
- } else {
+ } else {
/* This can never be signed enough: Kill it. */
- if (!was_waiting_for_certs)
+ if (!was_waiting_for_certs) {
log_warn(LD_DIR, "Not enough good signatures on networkstatus "
"consensus");
+ result = -2;
+ }
if (was_waiting_for_certs && (r < -1) && from_cache)
unlink(unverified_fname);
goto done;
* valid numbers. -KL */
/* As above, increased version numbers are for
* non-backward-compatible changes. This code doesn't know how to
- * parse a v3 descriptor, because a v3 descriptor is by definitition not
+ * parse a v3 descriptor, because a v3 descriptor is by definition not
* compatible with this code. */
version = atoi(smartlist_get(versions, i));
result->protocols |= 1 << version;