int certfp_method;
int hide_opers_in_whois;
+ int hide_opers;
};
struct config_channel_entry
#define IsOperRemoteBan(x) (HasPrivilege((x), "oper:remoteban"))
#define IsOperMassNotice(x) (HasPrivilege((x), "oper:mass_notice"))
+#define SeesOper(target, source) (IsOper((target)) && (!ConfigFileEntry.hide_opers && !HasPrivilege((target), "oper:hidden") || IsOper((source))))
+
extern struct oper_conf *make_oper_conf(void);
extern void free_oper_conf(struct oper_conf *);
extern void clear_oper_conf(void);
{ "max_ratelimit_tokens", CF_INT, NULL, 0, &ConfigFileEntry.max_ratelimit_tokens },
{ "away_interval", CF_INT, NULL, 0, &ConfigFileEntry.away_interval },
{ "hide_opers_in_whois", CF_YESNO, NULL, 0, &ConfigFileEntry.hide_opers_in_whois },
+ { "hide_opers", CF_YESNO, NULL, 0, &ConfigFileEntry.hide_opers },
{ "certfp_method", CF_STRING, conf_set_general_certfp_method, 0, NULL },
{ "\0", 0, NULL, 0, NULL }
};
ConfigFileEntry.nicklen = NICKLEN;
ConfigFileEntry.certfp_method = RB_SSL_CERTFP_METH_CERT_SHA1;
ConfigFileEntry.hide_opers_in_whois = 0;
+ ConfigFileEntry.hide_opers = 0;
if (!alias_dict)
alias_dict = rb_dictionary_create("alias", rb_strcasecmp);
sendto_one(source_p, form_str(RPL_ETRACE),
me.name, source_p->name,
- IsOper(target_p) ? "Oper" : "User",
+ SeesOper(target_p, source_p) ? "Oper" : "User",
get_client_class(target_p),
target_p->name, target_p->username, target_p->host,
show_ip(source_p, target_p) ? target_p->sockhost : "255.255.255.255",
if(!show_ip(source_p, target_p))
sendto_one(source_p, form_str(RPL_ETRACEFULL),
me.name, source_p->name,
- IsOper(target_p) ? "Oper" : "User",
+ SeesOper(target_p, source_p) ? "Oper" : "User",
get_client_class(target_p),
target_p->name, target_p->username, target_p->host,
"255.255.255.255", "<hidden> <hidden>", target_p->info);
else
sendto_one(source_p, form_str(RPL_ETRACEFULL),
me.name, source_p->name,
- IsOper(target_p) ? "Oper" : "User",
+ SeesOper(target_p, source_p) ? "Oper" : "User",
get_client_class(target_p),
target_p->name, target_p->username,
target_p->host, target_p->sockhost,
sendto_one(source_p, form_str(RPL_ETRACE),
me.name, source_p->name,
- IsOper(target_p) ? "Oper" : "User",
+ SeesOper(target_p, source_p) ? "Oper" : "User",
/* class field -- pretend its server.. */
target_p->servptr->name,
target_p->name, target_p->username, target_p->host,
sendto_one(source_p, form_str(RPL_ETRACE),
me.name, source_p->name,
- IsOper(target_p) ? "Oper" : "User",
+ SeesOper(target_p, source_p) ? "Oper" : "User",
/* class field -- pretend its server.. */
target_p->servptr->name,
target_p->name, target_p->username, target_p->host,
{
target_p = oper_ptr->data;
- if(IsOperInvis(target_p) && !IsOper(source_p))
+ if(!SeesOper(target_p, source_p))
continue;
if(target_p->user->away)
if(!doall && wilds && (match(tname, target_p->name) == 0))
continue;
+ if(!SeesOper(target_p, source_p))
+ continue;
+
report_this_status(source_p, target_p);
}
target_p = ptr->data;
/* dont show invisible users to remote opers */
- if(IsInvisible(target_p) && dow && !MyConnect(source_p) && !IsOper(target_p))
+ if(IsInvisible(target_p) && dow && !MyConnect(source_p) && !SeesOper(target_p, source_p))
continue;
if(!doall && wilds && !match(tname, target_p->name))
continue;
/* remote opers may not see invisible normal users */
- if(dow && !MyConnect(source_p) && !IsOper(target_p) &&
+ if(dow && !MyConnect(source_p) && !SeesOper(target_p, source_p) &&
IsInvisible(target_p))
continue;
case STAT_CLIENT:
{
sendto_one_numeric(source_p,
- IsOper(target_p) ? RPL_TRACEOPERATOR : RPL_TRACEUSER,
- IsOper(target_p) ? form_str(RPL_TRACEOPERATOR) : form_str(RPL_TRACEUSER),
+ SeesOper(target_p, source_p) ? RPL_TRACEOPERATOR : RPL_TRACEUSER,
+ SeesOper(target_p, source_p) ? form_str(RPL_TRACEOPERATOR) : form_str(RPL_TRACEUSER),
class_name, name,
show_ip(source_p, target_p) ? ip : empty_sockhost,
(unsigned long)(rb_current_time() - target_p->localClient->lasttime),
#include "parse.h"
#include "modules.h"
#include "s_conf.h"
+#include "s_newconf.h"
static const char userhost_desc[] =
"Provides the USERHOST command to show a user's host";
{
rl = sprintf(response, "%s%s=%c%s@%s ",
target_p->name,
- IsOper(target_p) ? "*" : "",
+ SeesOper(target_p, source_p) ? "*" : "",
(target_p->user->away) ? '-' : '+',
target_p->username,
target_p->sockhost);
{
rl = sprintf(response, "%s%s=%c%s@%s ",
target_p->name,
- IsOper(target_p) ? "*" : "",
+ SeesOper(target_p, source_p) ? "*" : "",
(target_p->user->away) ? '-' : '+',
target_p->username, target_p->host);
}
/* '/who nick' */
if(((target_p = find_named_person(mask)) != NULL) &&
- (!server_oper || IsOper(target_p)))
+ (!server_oper || SeesOper(target_p, source_p)))
{
int isinvis = 0;
if(!IsInvisible(target_p) || IsMarked(target_p))
continue;
- if(server_oper && !IsOper(target_p))
+ if(server_oper && !SeesOper(target_p, source_p))
continue;
SetMark(target_p);
continue;
}
- if(server_oper && !IsOper(target_p))
+ if(server_oper && !SeesOper(target_p, source_p))
continue;
if(maxmatches > 0)
msptr = ptr->data;
target_p = msptr->client_p;
- if(server_oper && !IsOper(target_p))
+ if(server_oper && !SeesOper(target_p, source_p))
continue;
if(member || !IsInvisible(target_p))
const char *q;
sprintf(status, "%c%s%s",
- target_p->user->away ? 'G' : 'H', IsOper(target_p) ? "*" : "", msptr ? find_channel_status(msptr, fmt->fields || IsCapable(source_p, CLICAP_MULTI_PREFIX)) : "");
+ target_p->user->away ? 'G' : 'H', SeesOper(target_p, source_p) ? "*" : "", msptr ? find_channel_status(msptr, fmt->fields || IsCapable(source_p, CLICAP_MULTI_PREFIX)) : "");
if (fmt->fields == 0)
sendto_one(source_p, form_str(RPL_WHOREPLY), me.name,
sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY),
target_p->name, target_p->user->away);
- if(IsOper(target_p) && (!ConfigFileEntry.hide_opers_in_whois || IsOper(source_p)))
+ if((!ConfigFileEntry.hide_opers_in_whois || IsOper(source_p)) && SeesOper(target_p, source_p))
{
sendto_one_numeric(source_p, RPL_WHOISOPERATOR, form_str(RPL_WHOISOPERATOR),
target_p->name,