X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/ff0cc1e6169abf707ffc286c24714c285318552c..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/core/m_server.c?ds=sidebyside diff --git a/modules/core/m_server.c b/modules/core/m_server.c index 839757f7..b9ae59c0 100644 --- a/modules/core/m_server.c +++ b/modules/core/m_server.c @@ -75,7 +75,8 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char const char *name; struct Client *target_p; int hop; - struct Capability *cap; + unsigned int required_mask; + const char *missing; name = parv[1]; hop = atoi(parv[2]); @@ -109,23 +110,6 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char return 0; } - /* check to ensure any "required" caps are set. --nenolod */ - for (cap = captab; cap->name; cap++) - { - if (!cap->required) - continue; - - if (!(client_p->localClient->caps & cap->cap)) - { - char exitbuf[BUFSIZE]; - - rb_snprintf(exitbuf, BUFSIZE, "Missing required CAPAB [%s]", cap->name); - exit_client(client_p, client_p, client_p, exitbuf); - - return 0; - } - } - /* Now we just have to call check_server and everything should be * check for us... -A1kmm. */ switch (check_server(name, client_p)) @@ -210,6 +194,28 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char return 0; } + /* check to ensure any "required" caps are set. --nenolod */ + 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 [%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), 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; + } + if((target_p = find_server(NULL, name))) { /* @@ -492,13 +498,10 @@ ms_sid(struct Client *client_p, struct Client *source_p, int parc, const char *p struct remote_conf *hub_p; hook_data_client hdata; rb_dlink_node *ptr; - int hop; int hlined = 0; int llined = 0; char squitreason[160]; - hop = atoi(parv[2]); - /* collision on the name? */ if((target_p = find_server(NULL, parv[1])) != NULL) {