whowas: Use the normal rules for IP visibility.

Add the flags (auth{} spoof, dynamic spoof) to struct Whowas and add a
show_ip_whowas().

Normal users now see IPs of unspoofed users, and remote opers can see IPs
behind dynamic spoofs. Also, general::hide_spoof_ips is now applied when
the IP is shown, not when the client exits.
This commit is contained in:
Jilles Tjoelker 2013-09-14 12:26:32 +02:00
parent 2635cc8089
commit 364e59f82a
6 changed files with 24 additions and 7 deletions

View file

@ -940,8 +940,6 @@ general {
* If disabled, local opers can see them. * If disabled, local opers can see them.
* Dynamic spoofs (e.g. set by services) are unaffected by this; * Dynamic spoofs (e.g. set by services) are unaffected by this;
* any oper (local and remote) can see the real ip. * any oper (local and remote) can see the real ip.
* Warning: for whowas, this is checked when the client exits,
* not when the IP is shown.
*/ */
hide_spoof_ips = yes; hide_spoof_ips = yes;

View file

@ -597,6 +597,7 @@ extern void del_all_accepts(struct Client *client_p);
extern void dead_link(struct Client *client_p, int sendqex); extern void dead_link(struct Client *client_p, int sendqex);
extern int show_ip(struct Client *source_p, struct Client *target_p); extern int show_ip(struct Client *source_p, struct Client *target_p);
extern int show_ip_conf(struct ConfItem *aconf, struct Client *source_p); extern int show_ip_conf(struct ConfItem *aconf, struct Client *source_p);
extern int show_ip_whowas(struct Whowas *whowas, struct Client *source_p);
extern void initUser(void); extern void initUser(void);
extern void free_user(struct User *, struct Client *); extern void free_user(struct User *, struct Client *);

View file

@ -55,6 +55,7 @@ struct Whowas
char sockhost[HOSTIPLEN + 1]; char sockhost[HOSTIPLEN + 1];
char realname[REALLEN + 1]; char realname[REALLEN + 1];
char suser[NICKLEN + 1]; char suser[NICKLEN + 1];
unsigned char flags;
const char *servername; const char *servername;
time_t logoff; time_t logoff;
struct Client *online; /* Pointer to new nickname for chasing or NULL */ struct Client *online; /* Pointer to new nickname for chasing or NULL */
@ -64,6 +65,10 @@ struct Whowas
struct Whowas *cprev; /* for client struct linked list */ struct Whowas *cprev; /* for client struct linked list */
}; };
/* Flags */
#define WHOWAS_IP_SPOOFING 0x1
#define WHOWAS_DYNSPOOF 0x2
/* /*
** initwhowas ** initwhowas
*/ */

View file

@ -117,7 +117,9 @@ m_whowas(struct Client *client_p, struct Client *source_p, int parc, const char
sendto_one(source_p, form_str(RPL_WHOWASUSER), sendto_one(source_p, form_str(RPL_WHOWASUSER),
me.name, source_p->name, temp->name, me.name, source_p->name, temp->name,
temp->username, temp->hostname, temp->realname); temp->username, temp->hostname, temp->realname);
if (MyOper(source_p) && !EmptyString(temp->sockhost)) if (!EmptyString(temp->sockhost) &&
strcmp(temp->sockhost, "0") &&
show_ip_whowas(temp, source_p))
#if 0 #if 0
sendto_one(source_p, form_str(RPL_WHOWASREAL), sendto_one(source_p, form_str(RPL_WHOWASREAL),
me.name, source_p->name, temp->name, me.name, source_p->name, temp->name,

View file

@ -1690,6 +1690,18 @@ show_ip_conf(struct ConfItem *aconf, struct Client *source_p)
return 1; return 1;
} }
int
show_ip_whowas(struct Whowas *whowas, struct Client *source_p)
{
if(whowas->flags & WHOWAS_IP_SPOOFING)
if(ConfigFileEntry.hide_spoof_ips || !MyOper(source_p))
return 0;
if(whowas->flags & WHOWAS_DYNSPOOF)
if(!IsOper(source_p))
return 0;
return 1;
}
/* /*
* make_user * make_user
* *

View file

@ -83,10 +83,9 @@ void add_history(struct Client *client_p, int online)
strcpy(who->hostname, client_p->host); strcpy(who->hostname, client_p->host);
strcpy(who->realname, client_p->info); strcpy(who->realname, client_p->info);
strcpy(who->suser, client_p->user->suser); strcpy(who->suser, client_p->user->suser);
if (!EmptyString(client_p->sockhost) && strcmp(client_p->sockhost, "0") && show_ip(NULL, client_p))
strcpy(who->sockhost, client_p->sockhost); strcpy(who->sockhost, client_p->sockhost);
else who->flags = (IsIPSpoof(client_p) ? WHOWAS_IP_SPOOFING : 0) |
who->sockhost[0] = '\0'; (IsDynSpoof(client_p) ? WHOWAS_DYNSPOOF : 0);
who->servername = scache_get_name(client_p->servptr->serv->nameinfo); who->servername = scache_get_name(client_p->servptr->serv->nameinfo);