X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/f0c778d7011617d07f5c565e631a75de11b32034..29c92cf95f9b9e669b08e90d13c8a8ba12369d58:/src/s_serv.c diff --git a/src/s_serv.c b/src/s_serv.c index 2470964d..cf0dd391 100644 --- a/src/s_serv.c +++ b/src/s_serv.c @@ -55,6 +55,7 @@ #include "reject.h" #include "sslproc.h" #include "capability.h" +#include "s_assert.h" #ifndef INADDR_NONE #define INADDR_NONE ((unsigned int) 0xffffffff) @@ -102,6 +103,10 @@ init_builtin_capabs(void) { serv_capindex = capability_index_create("server capabilities"); + /* These two are not set via CAPAB/GCAP keywords. */ + CAP_CAP = capability_put_anonymous(serv_capindex); + CAP_TS6 = capability_put_anonymous(serv_capindex); + CAP_QS = capability_put(serv_capindex, "QS"); CAP_EX = capability_put(serv_capindex, "EX"); CAP_CHW = capability_put(serv_capindex, "CHW"); @@ -120,6 +125,11 @@ init_builtin_capabs(void) CAP_EOPMOD = capability_put(serv_capindex, "EOPMOD"); CAP_BAN = capability_put(serv_capindex, "BAN"); CAP_MLOCK = capability_put(serv_capindex, "MLOCK"); + + capability_require(serv_capindex, "QS"); + capability_require(serv_capindex, "EX"); + capability_require(serv_capindex, "IE"); + capability_require(serv_capindex, "ENCAP"); } static CNCB serv_connect_callback; @@ -319,6 +329,7 @@ check_server(const char *name, struct Client *client_p) struct server_conf *tmp_p; rb_dlink_node *ptr; int error = -1; + const char *encr; s_assert(NULL != client_p); if(client_p == NULL) @@ -353,8 +364,9 @@ check_server(const char *name, struct Client *client_p) { if(ServerConfEncrypted(tmp_p)) { - if(!strcmp(tmp_p->passwd, rb_crypt(client_p->localClient->passwd, - tmp_p->passwd))) + encr = rb_crypt(client_p->localClient->passwd, + tmp_p->passwd); + if(encr != NULL && !strcmp(tmp_p->passwd, encr)) { server_p = tmp_p; break; @@ -482,7 +494,7 @@ burst_ban(struct Client *client_p) * side effects - client is sent a list of +b, +e, or +I modes */ static void -burst_modes_TS6(struct Client *client_p, struct Channel *chptr, +burst_modes_TS6(struct Client *client_p, struct Channel *chptr, rb_dlink_list *list, char flag) { rb_dlink_node *ptr; @@ -536,7 +548,7 @@ burst_modes_TS6(struct Client *client_p, struct Channel *chptr, /* * burst_TS6 - * + * * inputs - client (server) to send nick towards * - client to send nick for * output - NONE @@ -545,7 +557,7 @@ burst_modes_TS6(struct Client *client_p, struct Channel *chptr, static void burst_TS6(struct Client *client_p) { - static char ubuf[12]; + char ubuf[BUFSIZE]; struct Client *target_p; struct Channel *chptr; struct membership *msptr; @@ -566,7 +578,7 @@ burst_TS6(struct Client *client_p) if(!IsPerson(target_p)) continue; - send_umode(NULL, target_p, 0, 0, ubuf); + send_umode(NULL, target_p, 0, ubuf); if(!*ubuf) { ubuf[0] = '+'; @@ -576,7 +588,7 @@ burst_TS6(struct Client *client_p) if(IsCapable(client_p, CAP_EUID)) sendto_one(client_p, ":%s EUID %s %d %ld %s %s %s %s %s %s %s :%s", target_p->servptr->id, target_p->name, - target_p->hopcount + 1, + target_p->hopcount + 1, (long) target_p->tsinfo, ubuf, target_p->username, target_p->host, IsIPSpoof(target_p) ? "0" : target_p->sockhost, @@ -587,7 +599,7 @@ burst_TS6(struct Client *client_p) else sendto_one(client_p, ":%s UID %s %d %ld %s %s %s %s %s :%s", target_p->servptr->id, target_p->name, - target_p->hopcount + 1, + target_p->hopcount + 1, (long) target_p->tsinfo, ubuf, target_p->username, target_p->host, IsIPSpoof(target_p) ? "0" : target_p->sockhost, @@ -647,7 +659,7 @@ burst_TS6(struct Client *client_p) t = buf + mlen; } - rb_sprintf(t, "%s%s ", find_channel_status(msptr, 1), + rb_sprintf(t, "%s%s ", find_channel_status(msptr, 1), use_id(msptr->client_p)); cur_len += tlen; @@ -784,7 +796,7 @@ server_estab(struct Client *client_p) if(IsUnknown(client_p)) { /* the server may be linking based on certificate fingerprint now. --nenolod */ - sendto_one(client_p, "PASS %s TS %d :%s", + sendto_one(client_p, "PASS %s TS %d :%s", EmptyString(server_p->spasswd) ? "*" : server_p->spasswd, TS_CURRENT, me.id); /* pass info to new server */ @@ -841,7 +853,7 @@ server_estab(struct Client *client_p) if((rb_dlink_list_length(&lclient_list) + rb_dlink_list_length(&serv_list)) > (unsigned long)MaxConnectionCount) - MaxConnectionCount = rb_dlink_list_length(&lclient_list) + + MaxConnectionCount = rb_dlink_list_length(&lclient_list) + rb_dlink_list_length(&serv_list); /* Show the real host/IP to admins */ @@ -878,8 +890,7 @@ server_estab(struct Client *client_p) me.id, client_p->name, client_p->id, IsHidden(client_p) ? "(H) " : "", client_p->info); - if(IsCapable(target_p, CAP_ENCAP) && - !EmptyString(client_p->serv->fullcaps)) + if(!EmptyString(client_p->serv->fullcaps)) sendto_one(target_p, ":%s ENCAP * GCAP :%s", client_p->id, client_p->serv->fullcaps); } @@ -889,8 +900,7 @@ server_estab(struct Client *client_p) me.name, client_p->name, IsHidden(client_p) ? "(H) " : "", client_p->info); - if(IsCapable(target_p, CAP_ENCAP) && - !EmptyString(client_p->serv->fullcaps)) + if(!EmptyString(client_p->serv->fullcaps)) sendto_one(target_p, ":%s ENCAP * GCAP :%s", client_p->name, client_p->serv->fullcaps); } @@ -904,7 +914,7 @@ server_estab(struct Client *client_p) ** there are no NICK's to be cancelled...). Of course, ** if cancellation occurs, all this info is sent anyway, ** and I guess the link dies when a read is attempted...? --msa - ** + ** ** Note: Link cancellation to occur at this point means ** that at least two servers from my fragment are building ** up connection this other fragment at the same time, it's @@ -934,8 +944,7 @@ server_estab(struct Client *client_p) target_p->name, target_p->hopcount + 1, IsHidden(target_p) ? "(H) " : "", target_p->info); - if(IsCapable(client_p, CAP_ENCAP) && - !EmptyString(target_p->serv->fullcaps)) + if(!EmptyString(target_p->serv->fullcaps)) sendto_one(client_p, ":%s ENCAP * GCAP :%s", get_id(target_p, client_p), target_p->serv->fullcaps); @@ -987,23 +996,23 @@ serv_connect_resolved(struct Client *client_p) if(ServerConfVhosted(server_p)) { - memcpy(&myipnum, &server_p->my_ipnum, sizeof(myipnum)); + memcpy(&myipnum, &server_p->my_ipnum, sizeof(server_p->my_ipnum)); ((struct sockaddr_in *)&myipnum)->sin_port = 0; myipnum.ss_family = server_p->aftype; - + } else if(server_p->aftype == AF_INET && ServerInfo.specific_ipv4_vhost) { - memcpy(&myipnum, &ServerInfo.ip, sizeof(myipnum)); + memcpy(&myipnum, &ServerInfo.ip, sizeof(ServerInfo.ip)); ((struct sockaddr_in *)&myipnum)->sin_port = 0; myipnum.ss_family = AF_INET; SET_SS_LEN(&myipnum, sizeof(struct sockaddr_in)); } - + #ifdef RB_IPV6 else if((server_p->aftype == AF_INET6) && ServerInfo.specific_ipv6_vhost) { - memcpy(&myipnum, &ServerInfo.ip6, sizeof(myipnum)); + memcpy(&myipnum, &ServerInfo.ip6, sizeof(ServerInfo.ip6)); ((struct sockaddr_in6 *)&myipnum)->sin6_port = 0; myipnum.ss_family = AF_INET6; SET_SS_LEN(&myipnum, sizeof(struct sockaddr_in6)); @@ -1021,12 +1030,12 @@ serv_connect_resolved(struct Client *client_p) if(ServerConfSSL(server_p)) { rb_connect_tcp(client_p->localClient->F, (struct sockaddr *)&client_p->localClient->ip, - NULL, 0, serv_connect_ssl_callback, + NULL, 0, serv_connect_ssl_callback, client_p, ConfigFileEntry.connect_timeout); } else rb_connect_tcp(client_p->localClient->F, (struct sockaddr *)&client_p->localClient->ip, - NULL, 0, serv_connect_callback, + NULL, 0, serv_connect_callback, client_p, ConfigFileEntry.connect_timeout); return 1; } @@ -1094,7 +1103,7 @@ serv_connect_dns_callback(void *vptr, struct DNSReply *reply) /* * serv_connect() - initiate a server connection * - * inputs - pointer to conf + * inputs - pointer to conf * - pointer to client doing the connet * output - * side effects - @@ -1184,7 +1193,8 @@ serv_connect(struct server_conf *server_p, struct Client *by) make_server(client_p); if(by && IsPerson(by)) { - strcpy(client_p->serv->by, by->name); + rb_strlcpy(client_p->serv->by, by->name, + sizeof client_p->serv->by); if(client_p->serv->user) free_user(client_p->serv->user, NULL); client_p->serv->user = by->user; @@ -1192,7 +1202,8 @@ serv_connect(struct server_conf *server_p, struct Client *by) } else { - strcpy(client_p->serv->by, "AutoConn."); + rb_strlcpy(client_p->serv->by, "AutoConn.", + sizeof client_p->serv->by); if(client_p->serv->user) free_user(client_p->serv->user, NULL); client_p->serv->user = NULL; @@ -1250,7 +1261,7 @@ serv_connect_ssl_callback(rb_fde_t *F, int status, void *data) ilog_error("rb_socketpair failed for server"); serv_connect_callback(F, RB_ERROR, data); return; - + } del_from_cli_fd_hash(client_p); client_p->localClient->F = xF[0]; @@ -1263,7 +1274,7 @@ serv_connect_ssl_callback(rb_fde_t *F, int status, void *data) /* * serv_connect_callback() - complete a server connection. - * + * * This routine is called after the server connection attempt has * completed. If unsucessful, an error is sent to ops and the client * is closed. If sucessful, it goes through the initialisation/check @@ -1306,7 +1317,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) { sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, "Error connecting to %s[%s]: %s", - client_p->name, + client_p->name, "255.255.255.255", rb_errstr(status)); ilog(L_SERVER, "Error connecting to %s[%s]: %s", @@ -1344,7 +1355,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) SetHandshake(client_p); /* the server may be linking based on certificate fingerprint now. --nenolod */ - sendto_one(client_p, "PASS %s TS %d :%s", + sendto_one(client_p, "PASS %s TS %d :%s", EmptyString(server_p->spasswd) ? "*" : server_p->spasswd, TS_CURRENT, me.id); /* pass my info to the new server */ @@ -1356,7 +1367,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) me.name, ConfigServerHide.hidden ? "(H) " : "", me.info); - /* + /* * If we've been marked dead because a send failed, just exit * here now and save everyone the trouble of us ever existing. */