mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 14:23:30 +01:00
If a single client connects with multiple transports, note all transports.
This commit is contained in:
parent
cb54e44587
commit
6ad535e6dc
@ -492,6 +492,19 @@ clientmap_entry_hash(const clientmap_entry_t *a)
|
|||||||
static INLINE int
|
static INLINE int
|
||||||
clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b)
|
clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b)
|
||||||
{
|
{
|
||||||
|
/* If one entry contains a transport and the other doesn't, then
|
||||||
|
they are not equal. */
|
||||||
|
if (a->transport_name && !b->transport_name)
|
||||||
|
return 0;
|
||||||
|
if (!a->transport_name && b->transport_name)
|
||||||
|
return 0;
|
||||||
|
/* If entries contain different transports, they they are not
|
||||||
|
equal. */
|
||||||
|
if (a->transport_name &&
|
||||||
|
b->transport_name &&
|
||||||
|
strcmp(a->transport_name, b->transport_name))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return !tor_addr_compare(&a->addr, &b->addr, CMP_EXACT) &&
|
return !tor_addr_compare(&a->addr, &b->addr, CMP_EXACT) &&
|
||||||
a->action == b->action;
|
a->action == b->action;
|
||||||
}
|
}
|
||||||
@ -529,6 +542,8 @@ geoip_note_client_seen(geoip_client_action_t action,
|
|||||||
{
|
{
|
||||||
const or_options_t *options = get_options();
|
const or_options_t *options = get_options();
|
||||||
clientmap_entry_t lookup, *ent;
|
clientmap_entry_t lookup, *ent;
|
||||||
|
memset(&lookup, 0, sizeof(clientmap_entry_t));
|
||||||
|
|
||||||
if (action == GEOIP_CLIENT_CONNECT) {
|
if (action == GEOIP_CLIENT_CONNECT) {
|
||||||
/* Only remember statistics as entry guard or as bridge. */
|
/* Only remember statistics as entry guard or as bridge. */
|
||||||
if (!options->EntryStatistics &&
|
if (!options->EntryStatistics &&
|
||||||
@ -546,7 +561,11 @@ geoip_note_client_seen(geoip_client_action_t action,
|
|||||||
|
|
||||||
tor_addr_copy(&lookup.addr, addr);
|
tor_addr_copy(&lookup.addr, addr);
|
||||||
lookup.action = (int)action;
|
lookup.action = (int)action;
|
||||||
|
if (transport_name)
|
||||||
|
lookup.transport_name = tor_strdup(transport_name);
|
||||||
ent = HT_FIND(clientmap, &client_history, &lookup);
|
ent = HT_FIND(clientmap, &client_history, &lookup);
|
||||||
|
tor_free(lookup.transport_name);
|
||||||
|
|
||||||
if (! ent) {
|
if (! ent) {
|
||||||
ent = tor_malloc_zero(sizeof(clientmap_entry_t));
|
ent = tor_malloc_zero(sizeof(clientmap_entry_t));
|
||||||
tor_addr_copy(&ent->addr, addr);
|
tor_addr_copy(&ent->addr, addr);
|
||||||
|
@ -1944,10 +1944,15 @@ test_geoip_with_pt(void)
|
|||||||
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "entropy", now-7200);
|
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "entropy", now-7200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 2 connections from the same IP with two different transports. */
|
||||||
|
SET_TEST_ADDRESS(++i);
|
||||||
|
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "fire", now-7200);
|
||||||
|
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "google", now-7200);
|
||||||
|
|
||||||
/* Test the transport history string. */
|
/* Test the transport history string. */
|
||||||
s = geoip_get_transport_history();
|
s = geoip_get_transport_history();
|
||||||
tor_assert(s);
|
tor_assert(s);
|
||||||
test_streq(s, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,entropy=8");
|
test_streq(s, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,entropy=8,fire=8,google=8");
|
||||||
|
|
||||||
/* Stop collecting entry statistics. */
|
/* Stop collecting entry statistics. */
|
||||||
geoip_entry_stats_term();
|
geoip_entry_stats_term();
|
||||||
|
Loading…
Reference in New Issue
Block a user