X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/6003ce763cd7a7116c975174ff25805e26d4cd4c..9dd98618d044c63ba4d30c79350f4b6a4a2c3453:/ircd/s_serv.c diff --git a/ircd/s_serv.c b/ircd/s_serv.c index 928688a9..98caf93a 100644 --- a/ircd/s_serv.c +++ b/ircd/s_serv.c @@ -57,7 +57,7 @@ int MaxConnectionCount = 1; int MaxClientCount = 1; int refresh_user_links = 0; -static char buf[EXT_BUFSIZE]; +static char buf[BUFSIZE]; /* * list of recognized server capabilities. "TS" is not on the list @@ -73,7 +73,6 @@ unsigned int CAP_EX; unsigned int CAP_CHW; unsigned int CAP_IE; unsigned int CAP_KLN; -unsigned int CAP_ZIP; unsigned int CAP_KNOCK; unsigned int CAP_TB; unsigned int CAP_UNKLN; @@ -103,6 +102,7 @@ unsigned int CLICAP_ECHO_MESSAGE; void init_builtin_capabs(void) { + static struct ClientCapability high_priority = {.flags = CLICAP_FLAGS_PRIORITY}; serv_capindex = capability_index_create("server capabilities"); /* These two are not set via CAPAB/GCAP keywords. */ @@ -115,7 +115,6 @@ init_builtin_capabs(void) CAP_IE = capability_put(serv_capindex, "IE", NULL); CAP_KLN = capability_put(serv_capindex, "KLN", NULL); CAP_KNOCK = capability_put(serv_capindex, "KNOCK", NULL); - CAP_ZIP = capability_put(serv_capindex, "ZIP", NULL); CAP_TB = capability_put(serv_capindex, "TB", NULL); CAP_UNKLN = capability_put(serv_capindex, "UNKLN", NULL); CAP_CLUSTER = capability_put(serv_capindex, "CLUSTER", NULL); @@ -135,13 +134,13 @@ init_builtin_capabs(void) cli_capindex = capability_index_create("client capabilities"); - CLICAP_MULTI_PREFIX = capability_put(cli_capindex, "multi-prefix", NULL); - CLICAP_ACCOUNT_NOTIFY = capability_put(cli_capindex, "account-notify", NULL); - CLICAP_EXTENDED_JOIN = capability_put(cli_capindex, "extended-join", NULL); - CLICAP_AWAY_NOTIFY = capability_put(cli_capindex, "away-notify", NULL); - CLICAP_USERHOST_IN_NAMES = capability_put(cli_capindex, "userhost-in-names", NULL); + CLICAP_MULTI_PREFIX = capability_put(cli_capindex, "multi-prefix", &high_priority); + CLICAP_ACCOUNT_NOTIFY = capability_put(cli_capindex, "account-notify", &high_priority); + CLICAP_EXTENDED_JOIN = capability_put(cli_capindex, "extended-join", &high_priority); + CLICAP_AWAY_NOTIFY = capability_put(cli_capindex, "away-notify", &high_priority); + CLICAP_USERHOST_IN_NAMES = capability_put(cli_capindex, "userhost-in-names", &high_priority); CLICAP_CAP_NOTIFY = capability_put(cli_capindex, "cap-notify", NULL); - CLICAP_CHGHOST = capability_put(cli_capindex, "chghost", NULL); + CLICAP_CHGHOST = capability_put(cli_capindex, "chghost", &high_priority); CLICAP_ECHO_MESSAGE = capability_put(cli_capindex, "echo-message", NULL); } @@ -297,7 +296,7 @@ try_connections(void *unused) */ client_p = find_server(NULL, tmp_p->name); - if(!client_p && (CurrUsers(cltmp) < MaxUsers(cltmp)) && !connecting) + if(!client_p && (CurrUsers(cltmp) < MaxAutoconn(cltmp)) && !connecting) { server_p = tmp_p; @@ -329,7 +328,7 @@ try_connections(void *unused) * error afterwards if it fails. * -- adrian */ - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Connection to %s activated", server_p->name); @@ -372,7 +371,7 @@ check_server(const char *name, struct Client *client_p) name_matched = true; - if(rb_inet_pton_sock(client_p->sockhost, (struct sockaddr *)&client_addr) <= 0) + if(rb_inet_pton_sock(client_p->sockhost, &client_addr) <= 0) SET_SS_FAMILY(&client_addr, AF_UNSPEC); if((tmp_p->connect_host && match(tmp_p->connect_host, client_p->host)) @@ -442,12 +441,7 @@ check_server(const char *name, struct Client *client_p) } attach_server_conf(client_p, server_p); - /* clear ZIP/TB if they support but we dont want them */ -#ifdef HAVE_LIBZ - if(!ServerConfCompressed(server_p)) -#endif - ClearCap(client_p, CAP_ZIP); - + /* clear TB if they support but we dont want it */ if(!ServerConfTb(server_p)) ClearCap(client_p, CAP_TB); @@ -471,19 +465,12 @@ send_capabilities(struct Client *client_p, unsigned int cap_can_send) static void burst_ban(struct Client *client_p) { - rb_dlink_node *ptr; struct ConfItem *aconf; - const char *type, *oper; - /* +5 for !,@,{,} and null */ - char operbuf[NICKLEN + USERLEN + HOSTLEN + HOSTLEN + 5]; - char *p; - size_t melen; - - melen = strlen(me.name); - RB_DLINK_FOREACH(ptr, prop_bans.head) - { - aconf = ptr->data; + const char *type; + rb_dictionary_iter state; + RB_DICTIONARY_FOREACH(aconf, &state, prop_bans_dict) + { /* Skip expired stuff. */ if(aconf->lifetime < rb_current_time()) continue; @@ -497,24 +484,6 @@ burst_ban(struct Client *client_p) default: continue; } - oper = aconf->info.oper; - if(aconf->flags & CONF_FLAGS_MYOPER) - { - /* Our operator{} names may not be meaningful - * to other servers, so rewrite to our server - * name. - */ - rb_strlcpy(operbuf, aconf->info.oper, sizeof buf); - p = strrchr(operbuf, '{'); - if (p != NULL && - operbuf + sizeof operbuf - p > (ptrdiff_t)(melen + 2)) - { - memcpy(p + 1, me.name, melen); - p[melen + 1] = '}'; - p[melen + 2] = '\0'; - oper = operbuf; - } - } sendto_one(client_p, ":%s BAN %s %s %s %lu %d %d %s :%s%s%s", me.id, type, @@ -522,7 +491,7 @@ burst_ban(struct Client *client_p) (unsigned long)aconf->created, (int)(aconf->hold - aconf->created), (int)(aconf->lifetime - aconf->created), - oper, + aconf->info.oper, aconf->passwd, aconf->spasswd ? "|" : "", aconf->spasswd ? aconf->spasswd : ""); @@ -541,51 +510,26 @@ burst_modes_TS6(struct Client *client_p, struct Channel *chptr, { rb_dlink_node *ptr; struct Ban *banptr; - char *t; - int tlen; - int mlen; - int cur_len; - cur_len = mlen = sprintf(buf, ":%s BMASK %ld %s %c :", - me.id, (long) chptr->channelts, chptr->chname, flag); - t = buf + mlen; + send_multiline_init(client_p, " ", ":%s BMASK %ld %s %c :", + me.id, + (long)chptr->channelts, + chptr->chname, + flag); - RB_DLINK_FOREACH(ptr, list->head) + RB_DLINK_FOREACH_PREV(ptr, list->tail) { banptr = ptr->data; - tlen = strlen(banptr->banstr) + (banptr->forward ? strlen(banptr->forward) + 1 : 0) + 1; - - /* uh oh */ - if(cur_len + tlen > EXT_BUFSIZE - 3) - { - /* the one we're trying to send doesnt fit at all! */ - if(cur_len == mlen) - { - s_assert(0); - continue; - } - - /* chop off trailing space and send.. */ - *(t-1) = '\0'; - sendto_one(client_p, "%s", buf); - cur_len = mlen; - t = buf + mlen; - } - if (banptr->forward) - sprintf(t, "%s$%s ", banptr->banstr, banptr->forward); + send_multiline_item(client_p, "%s$%s", + banptr->banstr, + banptr->forward); else - sprintf(t, "%s ", banptr->banstr); - t += tlen; - cur_len += tlen; + send_multiline_item(client_p, "%s", banptr->banstr); } - /* cant ever exit the loop above without having modified buf, - * chop off trailing space and send. - */ - *(t-1) = '\0'; - sendto_one(client_p, "%s", buf); + send_multiline_fini(client_p, NULL); } /* @@ -599,7 +543,7 @@ burst_modes_TS6(struct Client *client_p, struct Channel *chptr, static void burst_TS6(struct Client *client_p) { - char ubuf[EXT_BUFSIZE]; + char ubuf[BUFSIZE]; struct Client *target_p; struct Channel *chptr; struct membership *msptr; @@ -669,6 +613,19 @@ burst_TS6(struct Client *client_p) use_id(target_p), target_p->user->away); + if (IsOper(target_p) && target_p->user && target_p->user->opername) + { + if (target_p->user->privset) + sendto_one(client_p, ":%s OPER %s %s", + use_id(target_p), + target_p->user->opername, + target_p->user->privset->name); + else + sendto_one(client_p, ":%s OPER %s", + use_id(target_p), + target_p->user->opername); + } + hclientinfo.target = target_p; call_hook(h_burst_client, &hclientinfo); } @@ -696,7 +653,7 @@ burst_TS6(struct Client *client_p) if(is_voiced(msptr)) tlen++; - if(cur_len + tlen >= EXT_BUFSIZE - 3) + if(cur_len + tlen >= BUFSIZE - 3) { *(t-1) = '\0'; sendto_one(client_p, "%s", buf); @@ -762,7 +719,7 @@ burst_TS6(struct Client *client_p) const char * show_capabilities(struct Client *target_p) { - static char msgbuf[EXT_BUFSIZE]; + static char msgbuf[BUFSIZE]; *msgbuf = '\0'; @@ -807,7 +764,7 @@ server_estab(struct Client *client_p) if((server_p = client_p->localClient->att_sconf) == NULL) { /* This shouldn't happen, better tell the ops... -A1kmm */ - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Warning: Lost connect{} block for server %s!", host); return exit_client(client_p, client_p, client_p, "Lost connect{} block!"); } @@ -833,7 +790,6 @@ server_estab(struct Client *client_p) /* pass info to new server */ send_capabilities(client_p, default_server_capabs | CAP_MASK - | (ServerConfCompressed(server_p) ? CAP_ZIP_SUPPORTED : 0) | (ServerConfTb(server_p) ? CAP_TB : 0)); sendto_one(client_p, "SERVER %s 1 :%s%s", @@ -845,12 +801,6 @@ server_estab(struct Client *client_p) if(!rb_set_buffers(client_p->localClient->F, READBUF_SIZE)) ilog_error("rb_set_buffers failed for server"); - /* Enable compression now */ - if(IsCapable(client_p, CAP_ZIP)) - { - start_zlib_session(client_p); - } - client_p->servptr = &me; if(IsAnyDead(client_p)) @@ -1099,7 +1049,7 @@ serv_connect(struct server_conf *server_p, struct Client *by) */ if((client_p = find_server(NULL, server_p->name))) { - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Server %s already present from %s", server_p->name, client_p->name); if(by && IsPerson(by) && !MyClient(by)) @@ -1109,7 +1059,7 @@ serv_connect(struct server_conf *server_p, struct Client *by) } if (CurrUsers(server_p->class) >= MaxUsers(server_p->class)) { - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "No more connections allowed in class \"%s\" for server %s", server_p->class->class_name, server_p->name); if(by && IsPerson(by) && !MyClient(by)) @@ -1295,7 +1245,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) */ if(status == RB_ERR_TIMEOUT || status == RB_ERROR_SSL) { - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Error connecting to %s[%s]: %s", client_p->name, "255.255.255.255", @@ -1307,7 +1257,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) else { errstr = strerror(rb_get_sockerr(F)); - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Error connecting to %s[%s]: %s (%s)", client_p->name, "255.255.255.255", @@ -1325,7 +1275,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) /* Get the C/N lines */ if((server_p = client_p->localClient->att_sconf) == NULL) { - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, "Lost connect{} block for %s", + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Lost connect{} block for %s", client_p->name); exit_client(client_p, client_p, &me, "Lost connect{} block"); return; @@ -1333,7 +1283,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) if(server_p->certfp && (!client_p->certfp || rb_strcasecmp(server_p->certfp, client_p->certfp) != 0)) { - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Connection to %s has invalid certificate fingerprint %s", client_p->name, client_p->certfp); ilog(L_SERVER, "Access denied, invalid certificate fingerprint %s from %s", @@ -1352,7 +1302,6 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) /* pass my info to the new server */ send_capabilities(client_p, default_server_capabs | CAP_MASK - | (ServerConfCompressed(server_p) ? CAP_ZIP_SUPPORTED : 0) | (ServerConfTb(server_p) ? CAP_TB : 0)); sendto_one(client_p, "SERVER %s 1 :%s%s", @@ -1365,7 +1314,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) */ if(IsAnyDead(client_p)) { - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s went dead during handshake", client_p->name); exit_client(client_p, client_p, &me, "Went dead during handshake"); return;