diff --git a/modules/core/m_server.c b/modules/core/m_server.c index a86ac573f..b9ae59c03 100644 --- a/modules/core/m_server.c +++ b/modules/core/m_server.c @@ -76,6 +76,7 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char struct Client *target_p; int hop; unsigned int required_mask; + const char *missing; name = parv[1]; hop = atoi(parv[2]); @@ -194,15 +195,22 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char } /* check to ensure any "required" caps are set. --nenolod */ - /* XXX: show required CAPABs. */ required_mask = capability_index_get_required(serv_capindex); if (!IsCapable(client_p, required_mask)) { + missing = capability_index_list(serv_capindex, required_mask & + ~client_p->localClient->caps); sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, - "Link %s dropped, required CAPABs are missing", name); - ilog(L_SERVER, "Link %s%s dropped, required CAPABs are missing", + "Link %s dropped, required CAPABs [%s] are missing", + name, missing); + ilog(L_SERVER, "Link %s%s dropped, required CAPABs [%s] are missing", EmptyString(client_p->name) ? name : "", - log_client_name(client_p, SHOW_IP)); + log_client_name(client_p, SHOW_IP), missing); + /* Do not use '[' in the below message because it would cause + * it to be considered potentially unsafe (might disclose IP + * addresses) + */ + sendto_one(client_p, "ERROR :Missing required CAPABs (%s)", missing); exit_client(client_p, client_p, client_p, "Missing required CAPABs"); return 0;