X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/c99dcaf6a0f9c7798580fc9f315d7b368c9f972c..412b1e16431d0eafbe1bacb0d7e610971144035c:/src/proto-p10.c diff --git a/src/proto-p10.c b/src/proto-p10.c index ed2242e..aa44db5 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -5,7 +5,7 @@ * * x3 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -29,6 +29,7 @@ /* Full commands. */ #define CMD_ACCOUNT "ACCOUNT" #define CMD_ADMIN "ADMIN" +#define CMD_ALIST "ALIST" #define CMD_ASLL "ASLL" #define CMD_AWAY "AWAY" #define CMD_BURST "BURST" @@ -118,6 +119,7 @@ /* Tokenized commands. */ #define TOK_ACCOUNT "AC" #define TOK_ADMIN "AD" +#define TOK_ALIST "AL" #define TOK_ASLL "LL" #define TOK_AWAY "A" #define TOK_BURST "B" @@ -744,6 +746,12 @@ irc_eob_ack(void) } } +void +irc_rpong(const char *from1, const char *from2, const char *pingtime, const char *clientinfo) +{ + putsock("%s " P10_RPONG " %s %s %s :%s", self->numeric, from1, from2, pingtime, clientinfo); +} + void irc_ping(const char *payload) { @@ -1116,6 +1124,11 @@ void irc_mark(struct userNode *user, char *mark) { char *host = user->hostname; + + /* TODO: Allow mark overwrite. If they are marked, and their fakehost is oldmark.hostname, update it to newmark.hostname so mark can be called multiple times. Probably requires ircd modification also */ + if(user->mark) + return; + /* if the mark will put us over the host length, clip some off the left hand side * to make room... */ @@ -1123,23 +1136,28 @@ irc_mark(struct userNode *user, char *mark) host += 1 + ( (strlen(host) + 1 + strlen(mark)) - HOSTLEN ); putsock("%s " CMD_MARK " %s DNSBL +m %s.%s", self->numeric, user->nick, mark, host); putsock("%s " CMD_MARK " %s DNSBL_DATA %s", self->numeric, user->nick, mark); + + /* Save it in the user */ + user->mark = strdup(mark); + /* If they are not otherwise marked, mark their host with fakehost */ - if(!IsFakeHost(user) && !IsSetHost(user) && !IsHiddenHost(user)) + if(!IsFakeHost(user) && !IsSetHost(user) && !(IsHiddenHost(user) && user->handle_info) ) { struct modeNode *mn = NULL; char fakehost[HOSTLEN]; unsigned int count = 0; unsigned int n = 0; - putsock("%s " CMD_MODE " %s +x", self->numeric, user->nick); putsock("%s " CMD_FAKEHOST " %s %s.%s", self->numeric, user->numeric, mark, host); + putsock("%s " CMD_MODE " %s +x", self->numeric, user->nick); snprintf(fakehost, sizeof(fakehost), "%s.%s", mark, host); safestrncpy(user->fakehost, fakehost, sizeof(user->fakehost)); for (n=count=0; nchannels.used; n++) { mn = user->channels.list[n]; - check_bans(user, mn->channel->name); + if (strlen(mn->channel->name) >= 1) /* Sanity */ + check_bans(user, mn->channel->name); } } } @@ -1294,6 +1312,19 @@ static CMD_FUNC(cmd_eob_ack) return 1; } +static CMD_FUNC(cmd_rping) +{ + struct server *dest; + + if (!(dest = GetServerN(argv[1]))) + return 0; + + if (dest == self) + irc_rpong(argv[2], argv[3], argv[4], argv[5]); + + return 1; +} + static CMD_FUNC(cmd_ping) { struct server *srv; @@ -1741,17 +1772,18 @@ static CMD_FUNC(cmd_mark) if(argc < 4) return 0; - target = GetUserH(argv[1]); - if(!target) { - log_module(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose mark is changing.", argv[1]); - return 0; - } if(!strcasecmp(argv[2], "DNSBL")) { /* DNSBL */ return 1; } else if(!strcasecmp(argv[2], "DNSBL_DATA")) { /* DNSBL_DATA name */ + target = GetUserH(argv[1]); + if(!target) { + log_module(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose mark is changing.", argv[1]); + return 0; + } + target->mark = strdup(argv[3]); return 1; } @@ -2015,7 +2047,7 @@ static CMD_FUNC(cmd_svspart) if (argc < 3) return 0; - user = GetUserH(argv[1]); + user = GetUserN(argv[1]); if (!user) return 0; parse_foreach(argv[2], part_helper, NULL, NULL, NULL, user); @@ -2388,6 +2420,11 @@ init_parse(void) dict_insert(irc_func_dict, CMD_ADMIN, cmd_admin); dict_insert(irc_func_dict, TOK_ADMIN, cmd_admin); + dict_insert(irc_func_dict, CMD_RPING, cmd_rping); + dict_insert(irc_func_dict, TOK_RPING, cmd_rping); + dict_insert(irc_func_dict, CMD_RPONG, cmd_dummy); + dict_insert(irc_func_dict, TOK_RPONG, cmd_dummy); + /* In P10, DESTRUCT doesn't do anything except be broadcast to servers. * Apparently to obliterate channels from any servers that think they * exist? @@ -2417,6 +2454,9 @@ init_parse(void) dict_insert(irc_func_dict, TOK_EXEMPT, cmd_dummy); dict_insert(irc_func_dict, CMD_PRIVS, cmd_privs); dict_insert(irc_func_dict, TOK_PRIVS, cmd_privs); + /* ignore ALIST for now */ + dict_insert(irc_func_dict, TOK_ALIST, cmd_dummy); + dict_insert(irc_func_dict, CMD_ALIST, cmd_dummy); /* Ignore remote luser */ dict_insert(irc_func_dict, TOK_LUSERS, cmd_dummy); /* We have reliable clock! Always! Wraaa! */ @@ -2734,6 +2774,8 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char * { struct userNode *oldUser, *uNode; unsigned int n, ignore_user; + char *tstr; + int type; if ((strlen(numeric) < 3) || (strlen(numeric) > 5)) { log_module(MAIN_LOG, LOG_WARNING, "AddUser(%p, %s, ...): numeric %s wrong length!", uplink, nick, numeric); @@ -2782,11 +2824,15 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char * safestrncpy(uNode->numeric, numeric, sizeof(uNode->numeric)); irc_p10_pton(&uNode->ip, realip); - if (irc_in_addr_is_ipv4(uNode->ip)) { - make_virtip((char*)irc_ntoa(&uNode->ip), (char*)irc_ntoa(&uNode->ip), uNode->cryptip); - make_virthost((char*)irc_ntoa(&uNode->ip), uNode->hostname, uNode->crypthost); - } else if (irc_in_addr_is_ipv6(uNode->ip)) { - make_ipv6virthost((char*)irc_ntoa(&uNode->ip), uNode->hostname, uNode->crypthost); + tstr = conf_get_data("server/type", RECDB_QSTRING); + type = atoi(tstr); + if (type > 6) { + if (irc_in_addr_is_ipv4(uNode->ip)) { + make_virtip((char*)irc_ntoa(&uNode->ip), (char*)irc_ntoa(&uNode->ip), uNode->cryptip); + make_virthost((char*)irc_ntoa(&uNode->ip), uNode->hostname, uNode->crypthost); + } else if (irc_in_addr_is_ipv6(uNode->ip)) { + make_ipv6virthost((char*)irc_ntoa(&uNode->ip), uNode->hostname, uNode->crypthost); + } } if (!uNode->crypthost && uNode->cryptip) @@ -2873,6 +2919,12 @@ DelUser(struct userNode* user, struct userNode *killer, int announce, const char user->version_reply = NULL; } + /* clean up mark */ + if(user->mark) { + free(user->mark); + user->mark = NULL; + } + /* clean up geoip data if any */ if(user->country_code) free(user->country_code); if(user->city) free(user->city); @@ -2935,6 +2987,30 @@ void mod_usermode(struct userNode *user, const char *mode_change) { // case 'h': do_user_mode(FLAGS_HELPER); break; // I check if there's an 'h' in the first part, and if there, // then everything after the space becomes their new host. + case 'C': do_user_mode(FLAGS_CLOAKHOST); + if (*word) { + char cloakhost[MAXLEN]; + unsigned int ii; + for (ii=0; (*word != ' ') && (*word != '\0'); ) + cloakhost[ii++] = *word++; + cloakhost[ii] = 0; + while (*word == ' ') + word++; + safestrncpy(user->crypthost, cloakhost, sizeof(user->crypthost)); + } + break; + case 'c': do_user_mode(FLAGS_CLOAKIP); + if (*word) { + char cloakip[MAXLEN]; + unsigned int ii; + for (ii=0; (*word != ' ') && (*word != '\0'); ) + cloakip[ii++] = *word++; + cloakip[ii] = 0; + while (*word == ' ') + word++; + safestrncpy(user->cryptip, cloakip, sizeof(user->cryptip)); + } + break; case 'h': do_user_mode(FLAGS_SETHOST); if (*word) { char sethost[MAXLEN];