Skip to content

Commit

Permalink
doveadm who: Don't aggregate empty usernames with different IPs
Browse files Browse the repository at this point in the history
We'll assume that in that case anvil is used to track IP addresses rather
than usernames. (Dovecot core doesn't currently use this.)
  • Loading branch information
sirainen committed Apr 10, 2017
1 parent ab8b02a commit 86306a3
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion src/doveadm/doveadm-who.c
Expand Up @@ -22,9 +22,28 @@ struct who_user {
unsigned int connection_count;
};

static void who_user_ip(const struct who_user *user, struct ip_addr *ip_r)
{
if (array_count(&user->ips) == 0)
i_zero(ip_r);
else {
const struct ip_addr *ip = array_idx(&user->ips, 0);
*ip_r = *ip;
}
}

static unsigned int who_user_hash(const struct who_user *user)
{
return str_hash(user->username) + str_hash(user->service);
struct ip_addr ip;
unsigned int hash = str_hash(user->service);

if (user->username[0] != '\0')
hash += str_hash(user->username);
else {
who_user_ip(user, &ip);
hash += net_ip_hash(&ip);
}
return hash;
}

static int who_user_cmp(const struct who_user *user1,
Expand All @@ -34,6 +53,15 @@ static int who_user_cmp(const struct who_user *user1,
return 1;
if (strcmp(user1->service, user2->service) != 0)
return 1;

if (user1->username[0] == '\0') {
/* tracking only IP addresses, not usernames */
struct ip_addr ip1, ip2;

who_user_ip(user1, &ip1);
who_user_ip(user2, &ip2);
return net_ip_cmp(&ip1, &ip2);
}
return 0;
}

Expand Down

0 comments on commit 86306a3

Please sign in to comment.