#define CMD_SERVSET "SERVSET"
#define CMD_SET "SET"
#define CMD_SETTIME "SETTIME"
+#define CMD_SGLINE "SGLINE"
#define CMD_SHUN "SHUN"
#define CMD_SILENCE "SILENCE"
+#define CMD_SMO "SMO"
+#define CMD_SNO "SNO"
+#define CMD_SSHUN "SSHUN"
#define CMD_SQUERY "SQUERY"
#define CMD_SQUIT "SQUIT"
#define CMD_STATS "STATS"
#define CMD_SVSJOIN "SVSJOIN"
#define CMD_SVSNICK "SVSNICK"
#define CMD_SVSPART "SVSPART"
+#define CMD_SVSQUIT "SVSQUIT"
#define CMD_SWHOIS "SWHOIS"
#define CMD_TIME "TIME"
#define CMD_TOPIC "TOPIC"
#define TOK_SERVSET "SERVSET"
#define TOK_SET "SET"
#define TOK_SETTIME "SE"
+#define TOK_SGLINE "SGL"
#define TOK_SHUN "SU"
#define TOK_SILENCE "U"
+#define TOK_SMO "SMO"
+#define TOK_SNO "SNO"
+#define TOK_SSHUN "SSU"
#define TOK_SQUERY "SQUERY"
#define TOK_SQUIT "SQ"
#define TOK_STATS "R"
#define TOK_SVSJOIN "SJ"
#define TOK_SVSNICK "SN"
#define TOK_SVSPART "SP"
+#define TOK_SVSQUIT "SX"
#define TOK_SWHOIS "SW"
#define TOK_TIME "TI"
#define TOK_TOPIC "T"
#define P10_SERVSET TYPE(SERVSET)
#define P10_SET TYPE(SET)
#define P10_SETTIME TYPE(SETTIME)
+#define P10_SGLINE TYPE(SGLINE)
#define P10_SHUN TYPE(SHUN)
#define P10_SILENCE TYPE(SILENCE)
+#define P10_SMO TYPE(SMO)
+#define P10_SNO TYPE(SNO)
+#define P10_SSHUN TYPE(SSHUN)
#define P10_SQUERY TYPE(SQUERY)
#define P10_SQUIT TYPE(SQUIT)
#define P10_STATS TYPE(STATS)
#define P10_SVSJOIN TYPE(SVSJOIN)
#define P10_SVSNICK TYPE(SVSNICK)
#define P10_SVSPART TYPE(SVSPART)
+#define P10_SVSQUIT TYPE(SVSQUIT)
#define P10_SWHOIS TYPE(SWHOIS)
#define P10_TIME TYPE(TIME)
#define P10_TOPIC TYPE(TOPIC)
inttobase64(extranum, srv->num_mask, (srv->numeric[1] || (srv->num_mask >= 64*64)) ? 3 : 2);
if (srv == self) {
- putsock(P10_SERVER " %s %d %li %li J10 %s%s +s6 :%s",
+ putsock(P10_SERVER " %s %d " FMT_TIME_T " " FMT_TIME_T " J10 %s%s +s6 :%s",
srv->name, srv->hops+1, srv->boot, srv->link, srv->numeric, extranum, srv->description);
} else {
- putsock("%s " P10_SERVER " %s %d %li %li %c10 %s%s +s6 :%s",
+ putsock("%s " P10_SERVER " %s %d " FMT_TIME_T " " FMT_TIME_T " %c10 %s%s +s6 :%s",
self->numeric, srv->name, srv->hops+1, srv->boot, srv->link, (srv->self_burst ? 'J' : 'P'), srv->numeric, extranum, srv->description);
}
}
-static void
+void
irc_p10_pton(irc_in_addr_t *ip, const char *input)
{
if (strlen(input) == 6) {
}
}
-static void
+void
irc_p10_ntop(char *output, const irc_in_addr_t *ip)
{
if (!irc_in_addr_is_valid(*ip)) {
modes[modelen++] = 'f';
if (IsHiddenHost(user))
modes[modelen++] = 'x';
+ if (IsBotM(user))
+ modes[modelen++] = 'B';
+ if (IsHideChans(user))
+ modes[modelen++] = 'n';
+ if (IsHideIdle(user))
+ modes[modelen++] = 'I';
+ if (IsXtraOp(user))
+ modes[modelen++] = 'X';
+
modes[modelen] = 0;
/* we don't need to put the + in modes because it's in the format string. */
- putsock("%s " P10_NICK " %s %d %li %s %s +%s %s %s :%s",
+ putsock("%s " P10_NICK " %s %d " FMT_TIME_T " %s %s +%s %s %s :%s",
user->uplink->numeric, user->nick, user->uplink->hops+1, user->timestamp, user->ident, user->hostname, modes, b64ip, user->numeric, user->info);
} else {
- putsock("%s " P10_NICK " %s %d %li %s %s %s %s :%s",
+ putsock("%s " P10_NICK " %s %d " FMT_TIME_T " %s %s %s %s :%s",
user->uplink->numeric, user->nick, user->uplink->hops+1, user->timestamp, user->ident, user->hostname, b64ip, user->numeric, user->info);
}
}
irc_account(struct userNode *user, const char *stamp, time_t timestamp)
{
if(extended_accounts)
- putsock("%s " P10_ACCOUNT " %s R %s %lu", self->numeric, user->numeric, stamp, timestamp);
+ putsock("%s " P10_ACCOUNT " %s R %s "FMT_TIME_T, self->numeric, user->numeric, stamp, timestamp);
else
- putsock("%s " P10_ACCOUNT " %s %s %lu", self->numeric, user->numeric, stamp, timestamp);
+ putsock("%s " P10_ACCOUNT " %s %s "FMT_TIME_T, self->numeric, user->numeric, stamp, timestamp);
}
void
void
irc_gline(struct server *srv, struct gline *gline, int silent)
{
- putsock("%s " P10_GLINE " %s +%s %ld :%s<%s> %s",
- self->numeric, (srv ? srv->numeric : "*"), gline->target, gline->expires-now, silent ? "AUTO " : "", gline->issuer, gline->reason);
+ putsock("%s " P10_GLINE " %s +%s " FMT_TIME_T " " FMT_TIME_T " :%s<%s> %s",
+ self->numeric, (srv ? srv->numeric : "*"), gline->target, gline->expires-now, now, silent ? "AUTO " : "", gline->issuer, gline->reason);
}
void
irc_shun(struct server *srv, struct shun *shun)
{
- putsock("%s " P10_SHUN " %s +%s %ld :<%s> %s",
+ putsock("%s " P10_SHUN " %s +%s " FMT_TIME_T " :<%s> %s",
self->numeric, (srv ? srv->numeric : "*"), shun->target, shun->expires-now, shun->issuer, shun->reason);
}
irc_join(struct userNode *who, struct chanNode *what)
{
if (what->members.used == 1) {
- putsock("%s " P10_CREATE " %s %lu",
+ putsock("%s " P10_CREATE " %s "FMT_TIME_T,
who->numeric, what->name, what->timestamp);
} else {
- putsock("%s " P10_JOIN " %s %lu", who->numeric, what->name, what->timestamp);
+ putsock("%s " P10_JOIN " %s "FMT_TIME_T, who->numeric, what->name, what->timestamp);
}
}
putsock("%s " P10_SVSPART " %s %s", from->uplink->numeric, who->numeric, to->name);
}
+void
+irc_svsquit(struct userNode *from, struct userNode *who, char *reason)
+{
+ putsock("%s " P10_SVSQUIT " %s :%s", from->uplink->numeric, who->numeric, reason);
+}
+
void
irc_kick(struct userNode *who, struct userNode *target, struct chanNode *channel, const char *msg)
{
struct server *dest;
if (!(dest = GetServerN(argv[1])))
- return 0;
+ return 1; /* if its a jupe or something, return 1 so its silently ignored */
if (dest == self)
irc_rpong(argv[2], argv[3], argv[4], argv[5]);
if(!strcmp(argv[2],"C"))
{
- if((hi = loc_auth(argv[4], argv[5])))
+ if((hi = loc_auth(argv[4], argv[5], NULL)))
+ {
+ /* Return a AC A */
+ putsock("%s " P10_ACCOUNT " %s A %s "FMT_TIME_T, self->numeric, server->numeric , argv[3], hi->registered);
+
+ }
+ else
+ {
+ /* Return a AC D */
+ putsock("%s " P10_ACCOUNT " %s D %s", self->numeric, server->numeric , argv[3]);
+ }
+ return 1;
+ }
+ else if(!strcmp(argv[2],"H")) /* New enhanced (host) version of C */
+ {
+ if((hi = loc_auth(argv[5], argv[6], argv[4] )))
{
/* Return a AC A */
- putsock("%s " P10_ACCOUNT " %s A %s %lu", self->numeric, server->numeric , argv[3], hi->registered);
+ putsock("%s " P10_ACCOUNT " %s A %s "FMT_TIME_T, self->numeric, server->numeric , argv[3], hi->registered);
}
else
P(BADCHAN), P(LOCAL_BADCHAN), P(SEE_CHAN), P(PROPAGATE),
P(DISPLAY), P(SEE_OPERS), P(WIDE_GLINE), P(FORCE_OPMODE),
P(FORCE_LOCAL_OPMODE), P(REMOTEREHASH), P(CHECK), P(SEE_SECRET_CHAN),
- P(SHUN), P(LOCAL_SHUN), P(WIDE_SHUN),
+ P(SHUN), P(LOCAL_SHUN), P(WIDE_SHUN), P(ZLINE),
+ P(LOCAL_ZLINE), P(WIDE_ZLINE), P(LIST_CHAN), P(WHOIS_NOTICE),
+ P(HIDE_IDLE), P(XTRAOP), P(HIDE_CHANNELS),
#undef P
{ 0, 0 }
};
static char exemptlist[MAXLEN], banlist[MAXLEN];
unsigned int next = 3, res = 1;
int ctype = 0, echeck = 0, bcheck = 0;
+ struct chanData *cData;
struct chanNode *cNode;
struct userNode *un;
struct modeNode *mNode;
irc_burst(cNode);
}
cNode = AddChannel(argv[1], in_timestamp, modes, banlist, exemptlist);
+ cData = cNode->channel_info;
+
+ if (!cData) {
+ if (cNode->modes & MODE_REGISTERED) {
+ irc_join(opserv, cNode);
+ irc_mode(opserv, cNode, "-z");
+ irc_part(opserv, cNode, "");
+ }
+ }
/* Burst channel members in now. */
for (user = members, sep = *members, mode = 0; sep; user = end) {
/* 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]);
+ log_module(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose dnsbl mark is changing.", argv[1]);
return 0;
}
target->mark = strdup(argv[3]);
return 1;
}
+ else if(!strcasecmp(argv[2], "CVERSION")) {
+ /* DNSBL_DATA name */
+ target = GetUserH(argv[1]);
+ if(!target) {
+ log_module(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose version mark is changing.", argv[1]);
+ return 0;
+ }
+
+ char *version = unsplit_string(argv + 3, argc - 3, NULL);
+ if(!version)
+ version = "";
+
+ target->version_reply = strdup(version);
+
+ if(match_ircglob(version, "WebTV;*"))
+ target->no_notice = true; /* webbies cant see notices */
+
+ return 1;
+ }
/* unknown type of mark */
return 1;
}
static CMD_FUNC(cmd_num_gline)
{
- if (argc < 6)
- return 0;
- gline_add(origin, argv[3], atoi(argv[4])-now, argv[5], now, 0, 0);
+ if (argc < 7) {
+ if (argc < 6)
+ return 0;
+ else
+ gline_add(origin, argv[3], atoi(argv[4])-now, argv[5], now, 0, 0);
+ } else {
+ if (!strcmp(argv[5], "+"))
+ gline_add(origin, argv[3], atoi(argv[4])-now, argv[6], now, 0, 0);
+ }
return 1;
}
static CMD_FUNC(cmd_num_shun)
{
- if (argc < 6)
- return 0;
- shun_add(origin, argv[3], atoi(argv[4])-now, argv[5], now, 0);
+ if (argc < 7) {
+ if (argc < 6)
+ return 0;
+ else
+ shun_add(origin, argv[3], atoi(argv[4])-now, argv[5], now, 0);
+ } else {
+ if (!strcmp(argv[5], "+"))
+ shun_add(origin, argv[3], atoi(argv[4])-now, argv[6], now, 0);
+ }
return 1;
}
return 0;
}
+static CMD_FUNC(cmd_sgline)
+{
+ struct server *sender;
+
+ if (argc < 4)
+ return 0;
+
+ if (!(sender = GetServerH(origin)))
+ return 0;
+
+ gline_add(origin, argv[1], strtoul(argv[2], NULL, 0), argv[argc-1], now, 1, 0);
+ return 1;
+}
+
+static CMD_FUNC(cmd_sshun)
+{
+ struct server *sender;
+
+ if (argc < 4)
+ return 0;
+
+ if (!(sender = GetServerH(origin)))
+ return 0;
+
+ shun_add(origin, argv[1], strtoul(argv[2], NULL, 0), argv[argc-1], now, 1);
+ return 1;
+}
+
static CMD_FUNC(cmd_shun)
{
if (argc < 3)
dict_insert(irc_func_dict, TOK_WHOIS, cmd_whois);
dict_insert(irc_func_dict, CMD_GLINE, cmd_gline);
dict_insert(irc_func_dict, TOK_GLINE, cmd_gline);
+ dict_insert(irc_func_dict, CMD_SGLINE, cmd_sgline);
+ dict_insert(irc_func_dict, TOK_SGLINE, cmd_sgline);
dict_insert(irc_func_dict, CMD_SHUN, cmd_shun);
dict_insert(irc_func_dict, TOK_SHUN, cmd_shun);
+ dict_insert(irc_func_dict, CMD_SSHUN, cmd_sshun);
+ dict_insert(irc_func_dict, TOK_SSHUN, cmd_sshun);
dict_insert(irc_func_dict, CMD_OPMODE, cmd_opmode);
dict_insert(irc_func_dict, TOK_OPMODE, cmd_opmode);
dict_insert(irc_func_dict, CMD_CLEARMODE, cmd_clearmode);
dict_insert(irc_func_dict, TOK_VERSION, cmd_version);
dict_insert(irc_func_dict, CMD_ADMIN, cmd_admin);
dict_insert(irc_func_dict, TOK_ADMIN, cmd_admin);
+ dict_insert(irc_func_dict, CMD_SMO, cmd_dummy);
+ dict_insert(irc_func_dict, TOK_SMO, cmd_dummy);
+ dict_insert(irc_func_dict, CMD_SNO, cmd_dummy);
+ dict_insert(irc_func_dict, TOK_SNO, cmd_dummy);
dict_insert(irc_func_dict, CMD_RPING, cmd_rping);
dict_insert(irc_func_dict, TOK_RPING, cmd_rping);
/* ignore /trace and /motd commands targetted at us */
dict_insert(irc_func_dict, TOK_TRACE, cmd_dummy);
dict_insert(irc_func_dict, TOK_MOTD, cmd_dummy);
+ dict_insert(irc_func_dict, TOK_UPING, cmd_dummy);
/* handle topics */
dict_insert(irc_func_dict, "331", cmd_num_topic);
{
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);
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)
case 'd': do_user_mode(FLAGS_DEAF); break;
case 'k': do_user_mode(FLAGS_SERVICE); break;
case 'g': do_user_mode(FLAGS_GLOBAL); break;
+ case 'B': do_user_mode(FLAGS_BOT); break;
+ case 'n': do_user_mode(FLAGS_HIDECHANS); break;
+ case 'I': do_user_mode(FLAGS_HIDEIDLE); break;
+ case 'X': do_user_mode(FLAGS_XTRAOP); break;
+ 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;
// sethost - reed/apples
// case 'h': do_user_mode(FLAGS_HELPER); break;
// I check if there's an 'h' in the first part, and if there,
case 'Q': do_chan_mode(MODE_NOQUITMSGS); break;
case 'T': do_chan_mode(MODE_NOAMSG); break;
case 'O': do_chan_mode(MODE_OPERSONLY); break;
+ case 'a': do_chan_mode(MODE_ADMINSONLY); break;
case 'Z': do_chan_mode(MODE_SSLONLY); break;
case 'L': do_chan_mode(MODE_HIDEMODE); break;
case 'z':
case 'Q': remove |= MODE_NOQUITMSGS; break;
case 'T': remove |= MODE_NOAMSG; break;
case 'O': remove |= MODE_OPERSONLY; break;
+ case 'a': remove |= MODE_ADMINSONLY; break;
case 'z': remove |= MODE_REGISTERED; break;
case 'Z': remove |= MODE_SSLONLY; break;
case 'L': remove |= MODE_HIDEMODE; break;