X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/161f040940ad8422dfc03fadcb3a07ccd60201df..4d12e65469c877f8028d5ac40a39457ec96b2f40:/modules/m_trace.c diff --git a/modules/m_trace.c b/modules/m_trace.c index 603922e6..ae9a0057 100644 --- a/modules/m_trace.c +++ b/modules/m_trace.c @@ -20,8 +20,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA - * - * $Id: m_trace.c 3183 2007-02-01 01:07:42Z jilles $ */ #include "stdinc.h" @@ -29,7 +27,6 @@ #include "hook.h" #include "client.h" #include "hash.h" -#include "common.h" #include "hash.h" #include "match.h" #include "ircd.h" @@ -42,23 +39,28 @@ #include "parse.h" #include "modules.h" -static int m_trace(struct Client *, struct Client *, int, const char **); +static const char trace_desc[] = + "Provides the TRACE command to trace the route to a client or server"; + +static void m_trace(struct MsgBuf *, struct Client *, struct Client *, int, const char **); static void trace_spy(struct Client *, struct Client *); struct Message trace_msgtab = { - "TRACE", 0, 0, 0, MFLG_SLOW, + "TRACE", 0, 0, 0, 0, {mg_unreg, {m_trace, 0}, {m_trace, 0}, mg_ignore, mg_ignore, {m_trace, 0}} }; int doing_trace_hook; +int doing_trace_show_idle_hook; mapi_clist_av1 trace_clist[] = { &trace_msgtab, NULL }; mapi_hlist_av1 trace_hlist[] = { { "doing_trace", &doing_trace_hook }, + { "doing_trace_show_idle", &doing_trace_show_idle_hook }, { NULL, NULL } }; -DECLARE_MODULE_AV1(trace, NULL, NULL, trace_clist, trace_hlist, NULL, "$Revision: 3183 $"); +DECLARE_MODULE_AV2(trace, NULL, NULL, trace_clist, trace_hlist, NULL, NULL, NULL, trace_desc); static void count_downlinks(struct Client *server_p, int *pservcount, int *pusercount); static int report_this_status(struct Client *source_p, struct Client *target_p); @@ -69,14 +71,14 @@ static const char *empty_sockhost = "255.255.255.255"; * m_trace * parv[1] = servername */ -static int -m_trace(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +static void +m_trace(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { struct Client *target_p = NULL; struct Class *cltmp; const char *tname; - int doall = 0; - int cnt = 0, wilds, dow; + bool doall = false, wilds, dow; + int cnt = 0; rb_dlink_node *ptr; if(parc > 1) @@ -87,7 +89,7 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * { if(hunt_server(client_p, source_p, ":%s TRACE %s :%s", 2, parc, parv) != HUNTED_ISME) - return 0; + return; } } else @@ -111,7 +113,7 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * if(ac2ptr == NULL) { - RB_DLINK_FOREACH(ptr, global_client_list.head) + RB_DLINK_FOREACH(ptr, global_serv_list.head) { ac2ptr = ptr->data; @@ -125,35 +127,35 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * /* giving this out with flattened links defeats the * object --fl */ - if(IsOper(source_p) || IsExemptShide(source_p) || + if(IsOperGeneral(source_p) || IsExemptShide(source_p) || !ConfigServerHide.flatten_links) - sendto_one_numeric(source_p, RPL_TRACELINK, + sendto_one_numeric(source_p, RPL_TRACELINK, form_str(RPL_TRACELINK), - ircd_version, + ircd_version, ac2ptr ? ac2ptr->name : tname, ac2ptr ? ac2ptr->from->name : "EEK!"); - return 0; + return; } case HUNTED_ISME: break; default: - return 0; + return; } } if(match(tname, me.name)) { - doall = 1; + doall = true; } /* if theyre tracing our SID, we need to move tname to our name so * we dont give the sid in ENDOFTRACE */ else if(!MyClient(source_p) && !strcmp(tname, me.id)) { - doall = 1; + doall = true; tname = me.name; } @@ -161,7 +163,7 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * dow = wilds || doall; /* specific trace */ - if(dow == 0) + if(!dow) { if(MyClient(source_p) || parc > 2) target_p = find_named_person(tname); @@ -179,14 +181,14 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * trace_spy(source_p, target_p); - sendto_one_numeric(source_p, RPL_ENDOFTRACE, + sendto_one_numeric(source_p, RPL_ENDOFTRACE, form_str(RPL_ENDOFTRACE), tname); - return 0; + return; } trace_spy(source_p, NULL); - /* give non-opers a limited trace output of themselves (if local), + /* give non-opers a limited trace output of themselves (if local), * opers and servers (if no shide) --fl */ if(!IsOper(source_p)) @@ -204,6 +206,9 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * if(!doall && wilds && (match(tname, target_p->name) == 0)) continue; + if(!SeesOper(target_p, source_p)) + continue; + report_this_status(source_p, target_p); } @@ -220,9 +225,9 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * } } - sendto_one_numeric(source_p, RPL_ENDOFTRACE, + sendto_one_numeric(source_p, RPL_ENDOFTRACE, form_str(RPL_ENDOFTRACE), tname); - return 0; + return; } /* source_p is opered */ @@ -233,14 +238,14 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * 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; @@ -278,9 +283,9 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * /* let the user have some idea that its at the end of the * trace */ - sendto_one_numeric(source_p, RPL_ENDOFTRACE, + sendto_one_numeric(source_p, RPL_ENDOFTRACE, form_str(RPL_ENDOFTRACE), tname); - return 0; + return; } if(doall) @@ -291,14 +296,12 @@ m_trace(struct Client *client_p, struct Client *source_p, int parc, const char * if(CurrUsers(cltmp) > 0) sendto_one_numeric(source_p, RPL_TRACECLASS, - form_str(RPL_TRACECLASS), + form_str(RPL_TRACECLASS), ClassName(cltmp), CurrUsers(cltmp)); } } sendto_one_numeric(source_p, RPL_ENDOFTRACE, form_str(RPL_ENDOFTRACE), tname); - - return 0; } /* @@ -374,20 +377,28 @@ report_this_status(struct Client *source_p, struct Client *target_p) sendto_one_numeric(source_p, RPL_TRACEUNKNOWN, form_str(RPL_TRACEUNKNOWN), class_name, name, ip, - rb_current_time() - target_p->localClient->firsttime); + (unsigned long)(rb_current_time() - target_p->localClient->firsttime)); cnt++; break; case STAT_CLIENT: { - int tnumeric; + /* fire the doing_trace_show_idle hook to allow modules to tell us whether to show the idle time */ + hook_data_client_approval hdata_showidle; + + hdata_showidle.client = source_p; + hdata_showidle.target = target_p; + hdata_showidle.approved = WHOIS_IDLE_SHOW; + + call_hook(doing_trace_show_idle_hook, &hdata_showidle); - tnumeric = IsOper(target_p) ? RPL_TRACEOPERATOR : RPL_TRACEUSER; - sendto_one_numeric(source_p, tnumeric, form_str(tnumeric), + sendto_one_numeric(source_p, + 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, - rb_current_time() - target_p->localClient->lasttime, - rb_current_time() - target_p->localClient->last); + hdata_showidle.approved ? (unsigned long)(rb_current_time() - target_p->localClient->lasttime) : 0, + hdata_showidle.approved ? (unsigned long)(rb_current_time() - target_p->localClient->last) : 0); cnt++; } @@ -403,16 +414,16 @@ report_this_status(struct Client *source_p, struct Client *target_p) sendto_one_numeric(source_p, RPL_TRACESERVER, form_str(RPL_TRACESERVER), class_name, servcount, usercount, name, *(target_p->serv->by) ? target_p->serv->by : "*", "*", - me.name, rb_current_time() - target_p->localClient->lasttime); + me.name, + (unsigned long)(rb_current_time() - target_p->localClient->lasttime)); cnt++; } break; default: /* ...we actually shouldn't come here... --msa */ - sendto_one_numeric(source_p, RPL_TRACENEWTYPE, - form_str(RPL_TRACENEWTYPE), - me.name, source_p->name, name); + sendto_one_numeric(source_p, RPL_TRACENEWTYPE, + form_str(RPL_TRACENEWTYPE), name); cnt++; break; }