|
@@ -2505,16 +2505,28 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
|
|
|
tor_free(address);
|
|
|
return 0;
|
|
|
}
|
|
|
- if (or_circ && or_circ->is_first_hop &&
|
|
|
- !get_options()->AllowSingleHopExits) {
|
|
|
+ if (or_circ && or_circ->p_conn && !get_options()->AllowSingleHopExits &&
|
|
|
+ (or_circ->is_first_hop ||
|
|
|
+ (!connection_or_digest_is_known_relay(
|
|
|
+ or_circ->p_conn->identity_digest) &&
|
|
|
+
|
|
|
+
|
|
|
+ get_options()->RefuseUnknownExits))) {
|
|
|
|
|
|
- * has explicitly allowed that in the config. It attracts attackers
|
|
|
+ * has explicitly allowed that in the config. It attracts attackers
|
|
|
* and users who'd be better off with, well, single-hop proxies.
|
|
|
*/
|
|
|
- log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
|
|
|
- "Attempt to open a stream on first hop of circuit. Closing.");
|
|
|
+
|
|
|
+ log_notice(LD_PROTOCOL,
|
|
|
+ "Attempt by %s to open a stream %s. Closing.",
|
|
|
+ safe_str(or_circ->p_conn->_base.address),
|
|
|
+ or_circ->is_first_hop ? "on first hop of circuit" :
|
|
|
+ "from unknown relay");
|
|
|
relay_send_end_cell_from_edge(rh.stream_id, circ,
|
|
|
- END_STREAM_REASON_TORPROTOCOL, NULL);
|
|
|
+ or_circ->is_first_hop ?
|
|
|
+ END_STREAM_REASON_TORPROTOCOL :
|
|
|
+ END_STREAM_REASON_MISC,
|
|
|
+ NULL);
|
|
|
tor_free(address);
|
|
|
return 0;
|
|
|
}
|