X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/7d4287591f9abc80a268f89a0f964e4ea05d959d..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/core/m_server.c diff --git a/modules/core/m_server.c b/modules/core/m_server.c index d2c40a93..b9ae59c0 100644 --- a/modules/core/m_server.c +++ b/modules/core/m_server.c @@ -64,7 +64,6 @@ static int set_server_gecos(struct Client *, const char *); /* * mr_server - SERVER message handler - * parv[0] = sender prefix * parv[1] = servername * parv[2] = serverinfo/hopcount * parv[3] = serverinfo @@ -76,6 +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; + unsigned int required_mask; + const char *missing; name = parv[1]; hop = atoi(parv[2]); @@ -119,7 +120,7 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char sendto_realops_snomask(SNO_GENERAL, L_ALL, "Unauthorised server connection attempt from %s: " "No entry for servername %s", - client_p->name, name); + "[@255.255.255.255]", name); ilog(L_SERVER, "Access denied, no connect block for server %s%s", EmptyString(client_p->name) ? name : "", @@ -134,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", - client_p->name, name); + "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; @@ -150,7 +151,7 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char sendto_realops_snomask(SNO_GENERAL, L_ALL, "Unauthorised server connection attempt from %s: " "Invalid host for server %s", - client_p->name, name); + "[@255.255.255.255]", name); ilog(L_SERVER, "Access denied, invalid host for server %s%s", EmptyString(client_p->name) ? name : "", @@ -165,7 +166,7 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char case -4: sendto_realops_snomask(SNO_GENERAL, L_ALL, "Invalid servername %s from %s", - name, client_p->name); + name, "[@255.255.255.255]"); ilog(L_SERVER, "Access denied, invalid servername from %s", log_client_name(client_p, SHOW_IP)); @@ -193,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))) { /* @@ -206,13 +229,24 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char * Definitely don't do that here. This is from an unregistered * connect - A1kmm. */ - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "Attempt to re-introduce server %s from %s", - name, client_p->name); - ilog(L_SERVER, "Attempt to re-introduce server %s from %s", - name, log_client_name(client_p, SHOW_IP)); + if (target_p->servptr->flags & FLAGS_SERVICE) + { + /* Assume any servers introduced by services + * are jupes. + * -- jilles + */ + sendto_one(client_p, "ERROR :Server juped."); + } + else + { + sendto_realops_snomask(SNO_GENERAL, L_ALL, + "Attempt to re-introduce server %s from %s", + name, "[@255.255.255.255]"); + ilog(L_SERVER, "Attempt to re-introduce server %s from %s", + name, log_client_name(client_p, SHOW_IP)); - sendto_one(client_p, "ERROR :Server already exists."); + sendto_one(client_p, "ERROR :Server already exists."); + } exit_client(client_p, client_p, client_p, "Server Exists"); return 0; } @@ -250,7 +284,6 @@ mr_server(struct Client *client_p, struct Client *source_p, int parc, const char /* * ms_server - SERVER message handler - * parv[0] = sender prefix * parv[1] = servername * parv[2] = serverinfo/hopcount * parv[3] = serverinfo @@ -297,7 +330,7 @@ ms_server(struct Client *client_p, struct Client *source_p, int parc, const char ilog(L_SERVER, "Link %s cancelled, server %s already exists", client_p->name, name); - snprintf(squitreason, sizeof squitreason, + rb_snprintf(squitreason, sizeof squitreason, "Server %s already exists", name); exit_client(client_p, client_p, &me, squitreason); @@ -332,11 +365,6 @@ ms_server(struct Client *client_p, struct Client *source_p, int parc, const char * add it to list and propagate word to my other * server links... */ - if(parc == 1 || EmptyString(info)) - { - sendto_one(client_p, "ERROR :No server info specified for %s", name); - return 0; - } /* * See if the newly found server is behind a guaranteed @@ -379,7 +407,7 @@ ms_server(struct Client *client_p, struct Client *source_p, int parc, const char * .edu's */ - /* Ok, check client_p can hub the new server, and make sure it's not a LL */ + /* Ok, check client_p can hub the new server */ if(!hlined) { /* OOOPs nope can't HUB */ @@ -388,7 +416,10 @@ ms_server(struct Client *client_p, struct Client *source_p, int parc, const char ilog(L_SERVER, "Non-Hub link %s introduced %s.", client_p->name, name); - exit_client(NULL, client_p, &me, "No matching hub_mask."); + rb_snprintf(squitreason, sizeof squitreason, + "No matching hub_mask for %s", + name); + exit_client(NULL, client_p, &me, squitreason); return 0; } @@ -402,7 +433,10 @@ ms_server(struct Client *client_p, struct Client *source_p, int parc, const char ilog(L_SERVER, "Link %s introduced leafed server %s.", client_p->name, name); - exit_client(NULL, client_p, &me, "Leafed Server."); + rb_snprintf(squitreason, sizeof squitreason, + "Matching leaf_mask for %s", + name); + exit_client(NULL, client_p, &me, squitreason); return 0; } @@ -464,20 +498,17 @@ 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) { ilog(L_SERVER, "Link %s cancelled, server %s already exists", client_p->name, parv[1]); - snprintf(squitreason, sizeof squitreason, + rb_snprintf(squitreason, sizeof squitreason, "Server %s already exists", parv[1]); exit_client(NULL, client_p, &me, squitreason); @@ -496,7 +527,7 @@ ms_sid(struct Client *client_p, struct Client *source_p, int parc, const char *p ilog(L_SERVER, "Link %s cancelled, SID %s for server %s already in use by %s", client_p->name, parv[3], parv[1], target_p->name); - snprintf(squitreason, sizeof squitreason, + rb_snprintf(squitreason, sizeof squitreason, "SID %s for %s already in use by %s", parv[3], parv[1], target_p->name); exit_client(NULL, client_p, &me, squitreason); @@ -550,26 +581,32 @@ ms_sid(struct Client *client_p, struct Client *source_p, int parc, const char *p /* no matching hub_mask */ if(!hlined) { - sendto_one(client_p, "ERROR :No matching hub_mask"); sendto_realops_snomask(SNO_GENERAL, L_ALL, "Non-Hub link %s introduced %s.", client_p->name, parv[1]); ilog(L_SERVER, "Non-Hub link %s introduced %s.", client_p->name, parv[1]); - exit_client(NULL, client_p, &me, "No matching hub_mask."); + + rb_snprintf(squitreason, sizeof squitreason, + "No matching hub_mask for %s", + parv[1]); + exit_client(NULL, client_p, &me, squitreason); return 0; } /* matching leaf_mask */ if(llined) { - sendto_one(client_p, "ERROR :Matching leaf_mask"); sendto_realops_snomask(SNO_GENERAL, L_ALL, "Link %s introduced leafed server %s.", client_p->name, parv[1]); ilog(L_SERVER, "Link %s introduced leafed server %s.", client_p->name, parv[1]); - exit_client(NULL, client_p, &me, "Leafed Server."); + + rb_snprintf(squitreason, sizeof squitreason, + "Matching leaf_mask for %s", + parv[1]); + exit_client(NULL, client_p, &me, squitreason); return 0; } @@ -626,7 +663,6 @@ set_server_gecos(struct Client *client_p, const char *info) { char *p; char *s; - char *t; s = LOCAL_COPY(info); @@ -635,7 +671,7 @@ set_server_gecos(struct Client *client_p, const char *info) *p = '\0'; /* check for a ] which would symbolise an [IP] */ - if((t = strchr(s, ']'))) + if(strchr(s, ']')) { /* set s to after the first space */ if(p)