/* * servmsg.c -- part of server.mod * */ #include char cursrvname[120] = ""; char curnetwork[120] = ""; static time_t last_ctcp = (time_t) 0L; static int count_ctcp = 0; static char altnick_char = 0; static unsigned int rolls = 0; #define ALTCHARS "-_\\`^[]" #define ROLL_RIGHT #undef ROLL_LEFT static int gotfake433(char *from) { size_t len = strlen(botname); int use_chr = 1; /* First run? */ if (altnick_char == 0 && !rolls) { altnick_char = ALTCHARS[0]; /* the nick is already as long as it can be. */ if (len == (unsigned) nick_len) { /* make the last char the current altnick_char */ botname[len - 1] = altnick_char; } else { /* tack it on to the end */ botname[len] = altnick_char; botname[len + 1] = 0; } } else { char *p = NULL; if ((p = strchr(ALTCHARS, altnick_char))) p++; /* if we haven't been rolling, use the ALTCHARS */ if (!rolls && p && *p) { altnick_char = *p; /* if we've already rolled, just keep rolling until we've rolled completely * after that, just generate random chars */ } else if (rolls < len) { /* fun BX style rolling, WEEEE */ char tmp = 0; size_t i = 0; altnick_char = 0; use_chr = 0; if (rolls == 0) { strcpy(botname, origbotname); len = strlen(botname); } #ifdef ROLL_RIGHT tmp = botname[len - 1]; #endif /* ROLL_RIGHT */ #ifdef ROLL_LEFT tmp = botname[0]; #endif /* ROLL_LEFT */ if (strchr(BADHANDCHARS, tmp)) tmp = '_'; rolls++; #ifdef ROLL_RIGHT for (i = (len - 1); i > 0; i--) botname[i] = botname[i - 1]; botname[0] = tmp; #endif /* ROLL_RIGHT */ #ifdef ROLL_LEFT for (i = 0; i < (len - 1); i++) botname[i] = botname[i + 1]; botname[len - 1] = tmp; #endif /* ROLL_LEFT */ botname[len] = 0; } else { /* we've tried ALTCHARS, and rolled the nick, just use random chars now */ altnick_char = 'a' + randint(26); } if (use_chr && altnick_char) { botname[len - 1] = altnick_char; botname[len] = 0; } } putlog(LOG_SERV, "*", "NICK IN USE: Trying '%s'", botname); dprintf(DP_SERVER, "NICK %s\n", botname); return 0; } /* Check for tcl-bound msg command, return 1 if found * * msg: proc-name */ static void check_bind_msg(const char *cmd, char *nick, char *uhost, struct userrec *u, char *args) { struct flag_record fr = {FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0 }; int x; get_user_flagrec(u, &fr, NULL); x = check_bind(BT_msg, cmd, &fr, nick, uhost, u, args); if (x & BIND_RET_LOG) putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %s", nick, uhost, u ? u->handle : "*" , cmd, args); else if (x == 0) putlog(LOG_MSGS, "*", "[%s!%s] %s %s", nick, uhost, cmd, args); } /* Return 1 if processed. */ static int check_bind_raw(char *from, char *code, char *msg) { char *p1 = NULL, *p2 = NULL, *myfrom = NULL, *mymsg = NULL; int ret = 0; myfrom = p1 = strdup(from); mymsg = p2 = strdup(msg); ret = check_bind(BT_raw, code, NULL, myfrom, mymsg); free(p1); free(p2); return ret; } int check_bind_ctcpr(char *nick, char *uhost, struct userrec *u, char *dest, char *keyword, char *args, bind_table_t *table) { struct flag_record fr = {FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0 }; get_user_flagrec(u, &fr, NULL); return check_bind(table, keyword, &fr, nick, uhost, u, dest, keyword, args); } bool match_my_nick(char *nick) { return (!rfc_casecmp(nick, botname)); } void rehash_server(const char *servname, const char *nick) { server_online = now; altnick_char = 0; strlcpy(cursrvname, servname, sizeof(cursrvname)); if (servidx >= 0) curservport = dcc[servidx].port; if (nick && nick[0]) { strlcpy(botname, nick, NICKLEN); dprintf(DP_SERVER, "WHOIS %s\n", botname); /* get user@host */ dprintf(DP_SERVER, "USERHOST %s\n", botname); /* get user@ip */ dprintf(DP_SERVER, "MODE %s +iws\n", botname); } } void join_chans() { for (register struct chanset_t *chan = chanset; chan; chan = chan->next) { chan->status &= ~(CHAN_ACTIVE | CHAN_PEND | CHAN_JOINING); if (shouldjoin(chan)) { dprintf(DP_SERVER, "JOIN %s %s\n", (chan->name[0]) ? chan->name : chan->dname, chan->channel.key[0] ? chan->channel.key : chan->key_prot); chan->status |= CHAN_JOINING; } } } /* 001: welcome to IRC (use it to fix the server name) */ static int got001(char *from, char *msg) { fixcolon(msg); rehash_server(from, msg); /* Ok...param #1 of 001 = what server thinks my nick is */ join_chans(); #ifdef no if (egg_strcasecmp(from, dcc[servidx].host)) { struct server_list *x = serverlist; if (x == NULL) return 0; /* Uh, no server list */ putlog(LOG_MISC, "*", "(%s claims to be %s; updating server list)", dcc[servidx].host, from); for (int i = curserv; i > 0 && x != NULL; i--) x = x->next; if (x == NULL) { putlog(LOG_MISC, "*", "Invalid server list!"); return 0; } } #endif return 0; } /* 005