case 'x':
case 'X':
bitsel |= WHOSELECT_EXTRA;
- if (IsAnOper(sptr))
+ if (HasPriv(sptr, PRIV_WHOX))
log_write(LS_WHO, L_INFO, LOG_NOSNOTICE, "%#C WHO %s %s", sptr,
(BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]);
continue;
for (member = chptr->members; member; member = member->next_member)
{
acptr = member->user;
- if ((bitsel & WHOSELECT_OPER) && !(IsAnOper(acptr)))
+ if ((bitsel & WHOSELECT_OPER) &&
+ !(IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS))))
continue;
if ((acptr != sptr) && (member->status & CHFL_ZOMBIE))
continue;
else
{
if ((acptr = FindUser(nick)) &&
- ((!(bitsel & WHOSELECT_OPER)) || IsAnOper(acptr)) &&
+ ((!(bitsel & WHOSELECT_OPER)) ||
+ (IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS)))) &&
Process(acptr) && SHOW_MORE(sptr, counter))
{
do_who(sptr, acptr, 0, fields, qrt);
if (!(IsUser(acptr) && Process(acptr)))
continue; /* Now Process() is at the beginning, if we fail
we'll never have to show this acptr in this query */
- if ((bitsel & WHOSELECT_OPER) && !IsAnOper(acptr))
- continue;
+ if ((bitsel & WHOSELECT_OPER) &&
+ !(IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS))))
+ continue;
if ((mask) &&
((!(matchsel & WHO_FIELD_NIC))
|| matchexec(cli_name(acptr), mymask, minlen))
{
if (!(IsUser(acptr) && Process(acptr)))
continue;
- if ((bitsel & WHOSELECT_OPER) && !IsAnOper(acptr))
- continue;
+ if ((bitsel & WHOSELECT_OPER) &&
+ !(IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS))))
+ continue;
if (!(SEE_USER(sptr, acptr, bitsel)))
continue;
if ((mask) &&