/* proto-p10.c - IRC protocol output
* Copyright 2000-2004 srvx Development Team
*
- * This file is part of srvx.
+ * This file is part of x3.
*
* srvx is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
+#include "chanserv.h"
#include "proto-common.c"
/* Full commands. */
#define CMD_LIST "LIST"
#define CMD_LUSERS "LUSERS"
#define CMD_MAP "MAP"
+#define CMD_MARK "MARK"
#define CMD_MODE "MODE"
#define CMD_MOTD "MOTD"
#define CMD_NAMES "NAMES"
#define TOK_EOB "EB"
#define TOK_EOB_ACK "EA"
#define TOK_ERROR "Y"
+#define TOK_EXEMPT "EX"
#define TOK_FAKEHOST "FA"
#define TOK_GET "GET"
#define TOK_GLINE "GL"
#define TOK_LIST "LIST"
#define TOK_LUSERS "LU"
#define TOK_MAP "MAP"
+#define TOK_MARK "MK"
#define TOK_MODE "M"
#define TOK_MOTD "MO"
#define TOK_NAMES "E"
#define P10_LIST TYPE(LIST)
#define P10_LUSERS TYPE(LUSERS)
#define P10_MAP TYPE(MAP)
+#define P10_MARK TYPE(MARK)
#define P10_MODE TYPE(MODE)
#define P10_MOTD TYPE(MOTD)
#define P10_NAMES TYPE(NAMES)
#define P10_WHO TYPE(WHO)
#define P10_WHOIS TYPE(WHOIS)
#define P10_WHOWAS TYPE(WHOWAS)
+#define P10_EXEMPT TYPE(EXEMPT)
/* Servers claiming to have a boot or link time before PREHISTORY
* trigger errors to the log. We hope no server has been running
}
void
-irc_account(struct userNode *user, const char *stamp)
+irc_account(struct userNode *user, const char *stamp, time_t timestamp)
{
- putsock("%s " P10_ACCOUNT " %s %s", self->numeric, user->numeric, stamp);
+ putsock("%s " P10_ACCOUNT " %s R %s %lu", self->numeric, user->numeric, stamp, timestamp);
}
void
target->name, modes, target->timestamp);
}
+/* Added to allow services to mode users
+ 2005 - 8 - 10 by Life4Christ
+*/
+void
+irc_umode(struct userNode *target, const char *modes)
+{
+ putsock("%s " P10_MODE " %s %s ",self->numeric,target->nick, modes);
+}
+
+
void
irc_invite(struct userNode *from, struct userNode *who, struct chanNode *to)
{
static CMD_FUNC(cmd_account)
{
struct userNode *user;
+ struct server *server;
+ struct handle_info *hi;
- if ((argc < 3) || !origin || !GetServerH(origin))
+ if ((argc < 3) || !origin || !(server = GetServerH(origin)))
return 0; /* Origin must be server. */
+
+ /* This next line appears to tremple origin.. why? */
user = GetUserN(argv[1]);
if (!user)
return 1; /* A QUIT probably passed the ACCOUNT. */
- call_account_func(user, argv[2]);
+
+ if(!strcmp(argv[2],"C"))
+ {
+ if((hi = loc_auth(argv[4], argv[5])))
+ {
+ /* Return a AC A */
+ putsock("%s " P10_ACCOUNT " %s A %s %lu", 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],"R"))
+ call_account_func(user, argv[3]);
+ else
+ call_account_func(user, argv[2]); /* For backward compatability */
return 1;
}
if (ctype == 1) {
if (bcheck == 0) {
/* strip % char off start of very first ban */
- strncat(banlist, strtok(parm, "%"), sizeof(banlist) - 1 - strlen(banlist));
- strncat(banlist, " ", sizeof(banlist) - 1 - strlen(banlist));
+ if (strlen(parm) > 1) {
+ strncat(banlist, strtok(parm, "%"), sizeof(banlist) - 1 - strlen(banlist));
+ strncat(banlist, " ", sizeof(banlist) - 1 - strlen(banlist));
+ }
bcheck = 1;
} else {
strncat(banlist, parm, sizeof(banlist) - 1 - strlen(banlist));
mode |= MODE_HALFOP;
else if (sep == 'v')
mode |= MODE_VOICE;
- else
+ else if (isdigit(sep)) {
+ mode |= MODE_CHANOP;
+ while (isdigit(*end)) end++;
+ } else
break;
}
if (rel_age < 0)
dict_insert(irc_func_dict, TOK_WALLOPS, cmd_dummy);
dict_insert(irc_func_dict, CMD_WALLHOPS, cmd_dummy);
dict_insert(irc_func_dict, TOK_WALLHOPS, cmd_dummy);
+ dict_insert(irc_func_dict, TOK_WALLUSERS, cmd_dummy);
+ /* Ignore dnsbl exemptions */
+ dict_insert(irc_func_dict, TOK_EXEMPT, cmd_dummy);
+ dict_insert(irc_func_dict, TOK_MARK, cmd_dummy);
+ /* Ignore privs */
+ dict_insert(irc_func_dict, TOK_PRIVS, cmd_dummy);
/* We have reliable clock! Always! Wraaa! */
dict_insert(irc_func_dict, CMD_SETTIME, cmd_dummy);
dict_insert(irc_func_dict, TOK_SETTIME, cmd_dummy);
dict_insert(irc_func_dict, "401", cmd_dummy); /* target left network */
dict_insert(irc_func_dict, "403", cmd_dummy); /* no such channel */
dict_insert(irc_func_dict, "404", cmd_dummy); /* cannot send to channel */
+ dict_insert(irc_func_dict, "439", cmd_dummy); /* target change too fast */
dict_insert(irc_func_dict, "441", cmd_dummy); /* target isn't on that channel */
dict_insert(irc_func_dict, "442", cmd_dummy); /* you aren't on that channel */
dict_insert(irc_func_dict, "443", cmd_dummy); /* is already on channel (after invite?) */
if (!hostname)
hostname = self->name;
make_numeric(self, local_num, numeric);
+ /* TODO: Make these modes part of the conf file */
return AddUser(self, nick, nick, hostname, modes ? modes : "+oik", numeric, desc, now, "AAAAAA");
}
int
is_valid_nick(const char *nick) {
+ unsigned int ii;
/* IRC has some of The Most Fucked-Up ideas about character sets
* in the world.. */
if (!isalpha(*nick) && !strchr("{|}~[\\]^_`", *nick))
return 0;
- for (++nick; *nick; ++nick)
- if (!isalnum(*nick) && !strchr("{|}~[\\]^-_`", *nick))
+ for (ii = 0; nick[ii]; ++ii)
+ if (!isalnum(nick[ii]) && !strchr("{|}~[\\]^-_`", nick[ii]))
return 0;
if (strlen(nick) > nicklen)
return 0;
{
unsigned int n;
+ verify(user);
+
/* mark them as dead, in case anybody cares */
user->dead = 1;
+ /* remove pending adduser commands */
+ wipe_adduser_pending(NULL, user);
+
/* remove user from all channels */
while (user->channels.used > 0)
DelChannelUser(user, user->channels.list[user->channels.used-1]->channel, false, 0);
case '+': add = 1; break;
case '-': add = 0; break;
case 'o':
- do_user_mode(FLAGS_OPER);
if (add) {
- userList_append(&curr_opers, user);
- call_oper_funcs(user);
+ if(!IsOper(user)) { /* Dont re-oper an oper */
+ userList_append(&curr_opers, user);
+ call_oper_funcs(user);
+ }
} else {
userList_remove(&curr_opers, user);
}
+ do_user_mode(FLAGS_OPER);
break;
case 'O': do_user_mode(FLAGS_LOCOP); break;
case 'i': do_user_mode(FLAGS_INVISIBLE);
case 'Q': do_chan_mode(MODE_NOQUITMSGS); break;
case 'T': do_chan_mode(MODE_NOAMSG); break;
case 'O': do_chan_mode(MODE_OPERSONLY); break;
-// uncomment this when ssl is enabled on the network.
-// case 'z': do_chan_mode(MODE_SSLONLY); break;
+ case 'Z': do_chan_mode(MODE_SSLONLY); break;
+ case 'L': do_chan_mode(MODE_HIDEMODE); break;
+ case 'z':
+ if (!(flags & MCP_REGISTERED)) {
+ do_chan_mode(MODE_REGISTERED);
+ } else {
+ mod_chanmode_free(change);
+ return NULL;
+ }
+ break;
#undef do_chan_mode
case 'l':
if (add) {
DO_MODE_CHAR(NOQUITMSGS, 'Q');
DO_MODE_CHAR(NOAMSG, 'T');
DO_MODE_CHAR(OPERSONLY, 'O');
- // uncomment this for ssl support
- //DO_MODE_CHAR(SSLONLY, 'z');
+ DO_MODE_CHAR(REGISTERED, 'z');
+ DO_MODE_CHAR(SSLONLY, 'Z');
+ DO_MODE_CHAR(HIDEMODE, 'L');
#undef DO_MODE_CHAR
if (change->modes_clear & channel->modes & MODE_KEY)
mod_chanmode_append(&chbuf, 'k', channel->key);
DO_MODE_CHAR(NOQUITMSGS, 'Q');
DO_MODE_CHAR(NOAMSG, 'T');
DO_MODE_CHAR(OPERSONLY, 'O');
- // uncomment this for ssl support
- //DO_MODE_CHAR(SSLONLY, 'z');
+ DO_MODE_CHAR(REGISTERED, 'z');
+ DO_MODE_CHAR(SSLONLY, 'Z');
+ DO_MODE_CHAR(HIDEMODE, 'L');
#undef DO_MODE_CHAR
if(change->modes_set & MODE_KEY)
mod_chanmode_append(&chbuf, 'k', change->new_key);
DO_MODE_CHAR(NOQUITMSGS, 'Q');
DO_MODE_CHAR(NOAMSG, 'T');
DO_MODE_CHAR(OPERSONLY, 'O');
- // uncomment this for ssl support
- //DO_MODE_CHAR(SSLONLY, 'z');
+ DO_MODE_CHAR(REGISTERED, 'z');
+ DO_MODE_CHAR(SSLONLY, 'Z');
+ DO_MODE_CHAR(HIDEMODE, 'L');
#undef DO_MODE_CHAR
}
if (change->modes_set) {
DO_MODE_CHAR(NOQUITMSGS, 'Q');
DO_MODE_CHAR(NOAMSG, 'T');
DO_MODE_CHAR(OPERSONLY, 'O');
- // uncomment this for ssl support
- //DO_MODE_CHAR(SSLONLY, 'z');
+ 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)) {
case MODE_KEY|MODE_LIMIT:
case 'e': remove |= MODE_EXEMPT; break;
case 'D': remove |= MODE_DELAYJOINS; break;
case 'r': remove |= MODE_REGONLY; break;
- case 'c': remove |= MODE_NOCOLORS;
+ case 'c': remove |= MODE_NOCOLORS; break;
case 'C': remove |= MODE_NOCTCPS; break;
case 'S': remove |= MODE_STRIPCOLOR; break;
case 'M': remove |= MODE_MODUNREG; break;
case 'Q': remove |= MODE_NOQUITMSGS; break;
case 'T': remove |= MODE_NOAMSG; break;
case 'O': remove |= MODE_OPERSONLY; break;
+ case 'z': remove |= MODE_REGISTERED; break;
+ case 'Z': remove |= MODE_SSLONLY; break;
+ case 'L': remove |= MODE_HIDEMODE; break;
}
}