X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/32a7faa10461d0ce2f50124a8d7f886fefa9a8de..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/core/m_server.c diff --git a/modules/core/m_server.c b/modules/core/m_server.c index fc9a453e..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)) @@ -151,14 +135,14 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char case -2: sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, "Unauthorised server connection attempt from %s: " - "Bad password for server %s", + "Bad credentials for server %s", "[@255.255.255.255]", name); - ilog(L_SERVER, "Access denied, invalid password for server %s%s", + ilog(L_SERVER, "Access denied, invalid credentials for server %s%s", EmptyString(client_p->name) ? name : "", log_client_name(client_p, SHOW_IP)); - exit_client(client_p, client_p, client_p, "Invalid password."); + exit_client(client_p, client_p, client_p, "Invalid credentials."); return 0; /* NOT REACHED */ break; @@ -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) {