X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/5e8328711f934157766e6daa7d836c79e29902fa..c0601d1e22c5c3749ea94c1c4359f9223b732fe4:/src/proto-p10.c diff --git a/src/proto-p10.c b/src/proto-p10.c index 55bd415..b71eef3 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -175,7 +175,7 @@ #define TOK_PONG "Z" #define TOK_POST "POST" #define TOK_PRIVMSG "P" -#define TOK_PRIVS "PR" +#define TOK_PRIVS "PRIVS" #define TOK_PROTO "PROTO" #define TOK_QUIT "Q" #define TOK_REHASH "REHASH" @@ -496,10 +496,10 @@ irc_server(struct server *srv) inttobase64(extranum, srv->num_mask, (srv->numeric[1] || (srv->num_mask >= 64*64)) ? 3 : 2); if (srv == self) { - putsock(P10_SERVER " %s %d " FMT_TIME_T " " FMT_TIME_T " J10 %s%s +s6 :%s", + putsock(P10_SERVER " %s %d " FMT_TIME_T " " FMT_TIME_T " J10 %s%s +s6o :%s", srv->name, srv->hops+1, srv->boot, srv->link_time, srv->numeric, extranum, srv->description); } else { - putsock("%s " P10_SERVER " %s %d " FMT_TIME_T " " FMT_TIME_T " %c10 %s%s +s6 :%s", + putsock("%s " P10_SERVER " %s %d " FMT_TIME_T " " FMT_TIME_T " %c10 %s%s +s6o :%s", self->numeric, srv->name, srv->hops+1, srv->boot, srv->link_time, (srv->self_burst ? 'J' : 'P'), srv->numeric, extranum, srv->description); } } @@ -1094,23 +1094,27 @@ void irc_topic(struct userNode *service, struct userNode *who, struct chanNode *what, const char *topic) { - int type = 4, host_in_topic = 0, hasident = 0; - const char *hstr, *tstr; + int type = 4, host_in_topic = 0, hasident = 0, hhtype = 0; + const char *hstr, *tstr, *hhstr, *htstr; char *host, *hostmask; char shost[MAXLEN]; char sident[MAXLEN]; tstr = conf_get_data("server/type", RECDB_QSTRING); hstr = conf_get_data("server/host_in_topic", RECDB_QSTRING); + hhstr = conf_get_data("server/hidden_host", RECDB_QSTRING); + htstr = conf_get_data("server/hidden_host_type", RECDB_QSTRING); if(tstr) type = atoi(tstr); else type = 4;/* default to 040 style topics */ + if (htstr) + hhtype = atoi(htstr); if (hstr) { - if (IsFakeHost(who)) + if (IsHiddenHost(who) && IsFakeHost(who)) safestrncpy(shost, who->fakehost, sizeof(shost)); - else if (IsSetHost(who)) { + else if (IsHiddenHost(who) && IsSetHost(who)) { hostmask = strdup(who->sethost); if ((host = (strrchr(hostmask, '@')))) { hasident = 1; @@ -1124,6 +1128,10 @@ irc_topic(struct userNode *service, struct userNode *who, struct chanNode *what, safestrncpy(sident, who->ident, sizeof(shost)); safestrncpy(shost, host, sizeof(shost)); + } else if (IsHiddenHost(who) && (hhtype == 1) && who->handle_info && hhstr) { + snprintf(shost, sizeof(shost), "%s.%s", who->handle_info->handle, hhstr); + } else if (IsHiddenHost(who) && (hhtype == 2) && who->crypthost[0]) { + safestrncpy(shost, who->crypthost, sizeof(shost)); } else safestrncpy(shost, who->hostname, sizeof(shost)); @@ -1835,24 +1843,14 @@ static CMD_FUNC(cmd_burst) break; } case '%': { + ctype = 1; for(parm = mysep(&argv[next], " "); /* parm = first param */ parm; /* While param is not null */ parm = mysep(&argv[next], " ") /* parm = next param */ ) { - switch (parm[0]) { - case '%': { - ctype = 1; - break; - } - case '~': { - ctype = 2; - break; - } - default: { - break; - } - } + if (0 == strcmp("~", parm)) + ctype = 2; if (ctype == 1) { if (bcheck == 0) { /* strip % char off start of very first ban */ @@ -2241,9 +2239,11 @@ static CMD_FUNC(cmd_kill) * Ghost response to a KILL we sent out earlier. So we only * whine if the target is local. */ - if (!strncmp(argv[1], self->numeric, strlen(self->numeric))) + if (!strncmp(argv[1], self->numeric, strlen(self->numeric))) { log_module(MAIN_LOG, LOG_ERROR, "Unable to find kill victim %s", argv[1]); - return 0; + return 0; + } + return 1; } if (IsLocal(user) && IsService(user)) { @@ -3458,7 +3458,8 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un case 'A': if (add) { if ((in_arg >= argc) - || keyncpy(change->new_upass, modes[in_arg++], sizeof(change->new_upass))) + || keyncpy(change->new_apass, modes[in_arg++], sizeof(change->new_apass))) + goto error; change->modes_set |= MODE_APASS; } else { change->modes_clear |= MODE_APASS; @@ -3797,59 +3798,19 @@ mod_chanmode_format(struct mod_chanmode *change, char *outbuff) DO_MODE_CHAR(REGISTERED, 'z'); DO_MODE_CHAR(SSLONLY, 'Z'); DO_MODE_CHAR(HIDEMODE, 'L'); -#undef DO_MODE_CHAR - switch (change->modes_set & (MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS)) { - /* Doing this implementation has been a pain in the arse, I hope I didn't forget a possible combination */ - case MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS: - used += sprintf(outbuff+used, "lkAU %d %s %s %s", change->new_limit, change->new_key,change->new_apass, change->new_upass); - break; - - case MODE_KEY|MODE_LIMIT|MODE_APASS: - used += sprintf(outbuff+used, "lkA %d %s %s", change->new_limit, change->new_key, change->new_apass); - break; - case MODE_KEY|MODE_LIMIT|MODE_UPASS: - used += sprintf(outbuff+used, "lkU %d %s %s", change->new_limit, change->new_key, change->new_upass); - break; - case MODE_KEY|MODE_APASS|MODE_UPASS: - used += sprintf(outbuff+used, "kAU %s %s %s", change->new_key, change->new_apass, change->new_upass); - break; - - case MODE_KEY|MODE_APASS: - used += sprintf(outbuff+used, "kA %s %s", change->new_key, change->new_apass); - break; - case MODE_KEY|MODE_UPASS: - used += sprintf(outbuff+used, "kU %s %s", change->new_key, change->new_upass); - break; - case MODE_KEY|MODE_LIMIT: - used += sprintf(outbuff+used, "lk %d %s", change->new_limit, change->new_key); - break; - - case MODE_LIMIT|MODE_UPASS: - used += sprintf(outbuff+used, "lU %d %s", change->new_limit, change->new_upass); - break; - case MODE_LIMIT|MODE_APASS: - used += sprintf(outbuff+used, "lA %d %s", change->new_limit, change->new_apass); - break; - case MODE_APASS|MODE_UPASS: - used += sprintf(outbuff+used, "AU %s %s", change->new_apass, change->new_upass); - case MODE_LIMIT|MODE_APASS|MODE_UPASS: - used += sprintf(outbuff+used, "lAU %d %s %s", change->new_limit, change->new_apass, change->new_upass); - break; + DO_MODE_CHAR(KEY, 'k'); + DO_MODE_CHAR(LIMIT, 'l'); + DO_MODE_CHAR(APASS, 'A'); + DO_MODE_CHAR(UPASS, 'U'); +#undef DO_MODE_CHAR - case MODE_APASS: - used += sprintf(outbuff+used, "A %s", change->new_apass); - break; - case MODE_UPASS: - used += sprintf(outbuff+used, "U %s", change->new_upass); - break; - case MODE_KEY: - used += sprintf(outbuff+used, "k %s", change->new_key); - break; - case MODE_LIMIT: - used += sprintf(outbuff+used, "l %d", change->new_limit); - break; - } +#define DO_MODE_PARM(BIT, PARM) if (change->modes_set & MODE_##BIT) used += sprintf(outbuff+used, " %s", PARM); + DO_MODE_PARM(KEY, change->new_key); + if (change->modes_set & MODE_LIMIT) used += sprintf(outbuff+used, " %d", change->new_limit); + DO_MODE_PARM(APASS, change->new_apass); + DO_MODE_PARM(UPASS, change->new_upass); +#undef DO_MODE_PARM } outbuff[used] = 0; return outbuff;