diff options
author | Adam <Adam@anope.org> | 2011-02-25 21:40:43 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2011-02-25 21:40:43 -0500 |
commit | ee387569821b45581063f6bc349cccc643f9a293 (patch) | |
tree | 9f8a83e5e9a36304d06c75f2bdf351729ca9bb65 | |
parent | eea7d2eb7715f875096641bae18250122078bd00 (diff) |
Fixed a lot of small problems
-rw-r--r-- | include/bots.h | 8 | ||||
-rw-r--r-- | include/config.h | 2 | ||||
-rw-r--r-- | include/extern.h | 2 | ||||
-rw-r--r-- | include/modules.h | 4 | ||||
-rw-r--r-- | include/services.h | 5 | ||||
-rw-r--r-- | modules/core/db_plain.cpp | 12 | ||||
-rw-r--r-- | modules/protocol/bahamut.cpp | 126 | ||||
-rw-r--r-- | modules/protocol/inspircd-ts6.h | 32 | ||||
-rw-r--r-- | modules/protocol/inspircd11.cpp | 71 | ||||
-rw-r--r-- | modules/protocol/inspircd12.cpp | 54 | ||||
-rw-r--r-- | modules/protocol/inspircd20.cpp | 29 | ||||
-rw-r--r-- | modules/protocol/ngircd.cpp | 141 | ||||
-rw-r--r-- | modules/protocol/plexus.cpp | 214 | ||||
-rw-r--r-- | modules/protocol/ratbox.cpp | 193 | ||||
-rw-r--r-- | modules/protocol/unreal32.cpp | 111 | ||||
-rw-r--r-- | src/bots.cpp | 32 | ||||
-rw-r--r-- | src/channels.cpp | 22 | ||||
-rw-r--r-- | src/chanserv.cpp | 3 | ||||
-rw-r--r-- | src/commands.cpp | 10 | ||||
-rw-r--r-- | src/config.cpp | 5 | ||||
-rw-r--r-- | src/init.cpp | 4 | ||||
-rw-r--r-- | src/logger.cpp | 8 | ||||
-rw-r--r-- | src/modes.cpp | 29 | ||||
-rw-r--r-- | src/protocol.cpp | 5 | ||||
-rw-r--r-- | src/regchannel.cpp | 10 | ||||
-rw-r--r-- | src/users.cpp | 2 |
26 files changed, 479 insertions, 655 deletions
diff --git a/include/bots.h b/include/bots.h index 7cdf417f1..2ae6fdbc0 100644 --- a/include/bots.h +++ b/include/bots.h @@ -77,15 +77,15 @@ class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END> /** Join this bot to a channel * @param c The channel - * @param update_ts Assume we're updating the TS for this channel + * @param status The status the bot should have on the channel */ - void Join(Channel *c, bool update_ts = false); + void Join(Channel *c, ChannelStatus *status = NULL); /** Join this bot to a channel * @param chname The channel name - * @param update_ts Assume we're updating the TS for this channel + * @param status The status the bot should have on the channel */ - void Join(const Anope::string &chname, bool update_ts = false); + void Join(const Anope::string &chname, ChannelStatus *status = NULL); /** Part this bot from a channel * @param c The channel diff --git a/include/config.h b/include/config.h index cbe36d4f7..ef71933ec 100644 --- a/include/config.h +++ b/include/config.h @@ -549,7 +549,7 @@ class CoreExport ServerConfig /* Default botmodes on channels, defaults to ao */ Anope::string BotModes; /* THe actual modes */ - std::vector<ChannelModeStatus *> BotModeList; + ChannelStatus BotModeList; /* How many times to try and reconnect to the uplink before giving up */ unsigned MaxRetries; /* How long to wait between connection attempts */ diff --git a/include/extern.h b/include/extern.h index d37fc10ee..1e88fbbc7 100644 --- a/include/extern.h +++ b/include/extern.h @@ -339,7 +339,7 @@ E User *finduser(const Anope::string &nick); E User *do_nick(const Anope::string &source, const Anope::string &nick, const Anope::string &username, const Anope::string &host, const Anope::string &server, const Anope::string &realname, time_t ts, const Anope::string &ip, const Anope::string &vhost, const Anope::string &uid, const Anope::string &modes); -E void do_umode(const Anope::string &, const Anope::string &user, const Anope::string &modes); +E void do_umode(const Anope::string &user, const Anope::string &modes); E void do_kill(User *user, const Anope::string &reason); E bool matches_list(Channel *c, User *user, ChannelModeName mode); diff --git a/include/modules.h b/include/modules.h index c407e2c21..4253b3799 100644 --- a/include/modules.h +++ b/include/modules.h @@ -423,10 +423,10 @@ class CoreExport Module : public Extensible virtual void OnBotNoFantasyAccess(const Anope::string &command, User *u, ChannelInfo *ci, const Anope::string ¶ms) { } /** Called after a bot joins a channel - * @param ci The channael + * @param c The channel * @param bi The bot */ - virtual void OnBotJoin(ChannelInfo *ci, BotInfo *bi) { } + virtual void OnBotJoin(Channel *c, BotInfo *bi) { } /** Called when a bot places a ban * @param u User being banned diff --git a/include/services.h b/include/services.h index 82d491cc4..646dbfbfe 100644 --- a/include/services.h +++ b/include/services.h @@ -991,8 +991,7 @@ class CoreExport IRCDProto virtual void SendQuit(const User *u, const char *fmt, ...); virtual void SendPing(const Anope::string &servname, const Anope::string &who); virtual void SendPong(const Anope::string &servname, const Anope::string &who); - virtual void SendJoin(const BotInfo *, const Anope::string &, time_t) = 0; - virtual void SendJoin(BotInfo *, const ChannelContainer *); + virtual void SendJoin(BotInfo *, Channel *, const ChannelStatus *) = 0; virtual void SendSQLineDel(const XLine *x) = 0; virtual void SendInvite(const BotInfo *bi, const Anope::string &chan, const Anope::string &nick); virtual void SendPart(const BotInfo *bi, const Channel *chan, const char *fmt, ...); @@ -1041,7 +1040,7 @@ class CoreExport IRCDProto /** Send a channel creation message to the uplink. * On most TS6 IRCds this is a SJOIN with no nick */ - virtual void SendChannel(Channel *c, const Anope::string &modes) { } + virtual void SendChannel(Channel *c) { } }; class CoreExport IRCdMessage diff --git a/modules/core/db_plain.cpp b/modules/core/db_plain.cpp index 5d6bd3142..f47f3156a 100644 --- a/modules/core/db_plain.cpp +++ b/modules/core/db_plain.cpp @@ -877,9 +877,10 @@ class DBPlain : public Module } db_buffer << "MD MLOCK_ON"; { - Anope::string oldmodes; + std::vector<Anope::string> oldmodes; if ((!Me || !Me->IsSynced()) && ci->GetExtRegular("db_mlock_modes_on", oldmodes)) - db_buffer << " " << oldmodes; + for (unsigned i = 0; i < oldmodes.size(); ++i) + db_buffer << " " << oldmodes[i]; else { for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) @@ -898,11 +899,10 @@ class DBPlain : public Module db_buffer << endl; db_buffer << "MD MLOCK_OFF"; { - Anope::string oldmodes; + std::vector<Anope::string> oldmodes; if ((!Me || !Me->IsSynced()) && ci->GetExtRegular("db_mlock_modes_off", oldmodes)) - { - db_buffer << " " << oldmodes; - } + for (unsigned i = 0; i < oldmodes.size(); ++i) + db_buffer << " " << oldmodes[i]; else { for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp index a8cdef155..5da7c4785 100644 --- a/modules/protocol/bahamut.cpp +++ b/modules/protocol/bahamut.cpp @@ -75,18 +75,14 @@ class BahamutIRCdProto : public IRCDProto { void SendModeInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf) { - if (buf.empty()) - return; if (Capab.HasFlag(CAPAB_TSMODE)) - send_cmd(source->nick, "MODE %s 0 %s", dest->name.c_str(), buf.c_str()); + send_cmd(source->nick, "MODE %s %ld %s", dest->name.c_str(), static_cast<long>(dest->creation_time), buf.c_str()); else send_cmd(source->nick, "MODE %s %s", dest->name.c_str(), buf.c_str()); } void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(bi ? bi->nick : Config->ServerName, "SVSMODE %s %ld %s", u->nick.c_str(), static_cast<long>(u->timestamp), buf.c_str()); } @@ -163,22 +159,13 @@ class BahamutIRCdProto : public IRCDProto } /* JOIN - SJOIN */ - void SendJoin(const BotInfo *user, const Anope::string &channel, time_t chantime) + void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status) { - send_cmd(user->nick, "SJOIN %ld %s", static_cast<long>(chantime), channel.c_str()); - } - - void SendJoin(BotInfo *user, const ChannelContainer *cc) - { - SendJoin(user, cc->chan->name, cc->chan->creation_time); - for (std::map<char, ChannelMode *>::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) - { - if (cc->Status->HasFlag(it->second->Name)) - { - cc->chan->SetMode(user, it->second, user->nick); - } - } - cc->chan->SetModes(user, false, "%s", cc->chan->GetModes(true, true).c_str()); + send_cmd(user->nick, "SJOIN %ld %s", static_cast<long>(c->creation_time), c->name.c_str()); + if (status) + for (size_t i = CMODE_BEGIN + 1; i != CMODE_END; ++i) + if (status->HasFlag(static_cast<ChannelModeName>(i))) + c->SetMode(user, static_cast<ChannelModeName>(i), user->nick, false); } void SendAkill(const XLine *x) @@ -210,8 +197,6 @@ class BahamutIRCdProto : public IRCDProto void SendNoticeChanopsInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd("", "NOTICE @%s :%s", dest->name.c_str(), buf.c_str()); } @@ -259,9 +244,9 @@ class BahamutIRCdProto : public IRCDProto ircdproto->SendMode(NickServ, u, "+d %d", u->timestamp); } - void SendChannel(Channel *c, const Anope::string &modes) + void SendChannel(Channel *c) { - send_cmd("", "SJOIN %ld %s %s :", static_cast<long>(c->creation_time), c->name.c_str(), modes.c_str()); + send_cmd("", "SJOIN %ld %s %s :", static_cast<long>(c->creation_time), c->name.c_str(), get_mlock_modes(c->ci, true).c_str()); } }; @@ -270,13 +255,10 @@ class BahamutIRCdMessage : public IRCdMessage public: bool OnMode(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - if (params.size() < 3) - return true; - - if (params[0][0] == '#' || params[0][0] == '&') + if (params.size() > 2 && (params[0][0] == '#' || params[0][0] == '&')) do_cmode(source, params[0], params[2], params[1]); - else - do_umode(source, params[0], params[1]); + else if (params.size() > 1) + do_umode(params[0], params[1]); return true; } @@ -303,7 +285,11 @@ class BahamutIRCdMessage : public IRCdMessage { if (params.size() != 2) { - User *user = do_nick(source, params[0], params[4], params[5], params[6], params[9], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, params[8], "", "", params[3]); + /* Currently bahamut has no ipv6 support */ + sockaddrs ip; + ip.ntop(AF_INET, params[8].c_str()); + + User *user = do_nick(source, params[0], params[4], params[5], params[6], params[9], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, ip.addr(), "", "", params[3]); if (user) { NickAlias *na; @@ -554,43 +540,6 @@ bool ChannelModeFlood::IsValid(const Anope::string &value) const return false; } -static void AddModes() -{ - /* Add user modes */ - ModeManager::AddUserMode(new UserMode(UMODE_SERV_ADMIN, "UMODE_SERV_ADMIN", 'A')); - ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R')); - ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); - ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); - ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); - ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); - ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); - ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); - ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd')); - - /* b/e/I */ - ModeManager::AddChannelMode(new ChannelModeBan('b')); - - /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); - - /* Add channel modes */ - ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); - ModeManager::AddChannelMode(new ChannelModeFlood('f')); - ModeManager::AddChannelMode(new ChannelModeKey('k')); - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p')); - ModeManager::AddChannelMode(new ChannelModeRegistered('r')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M')); - ModeManager::AddChannelMode(new ChannelModeOper('O')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R')); -} - class ProtoBahamut : public Module { Message message_svsmode, message_cs, message_hs, message_ms, message_ns, message_os, message_burst; @@ -598,6 +547,43 @@ class ProtoBahamut : public Module BahamutIRCdProto ircd_proto; BahamutIRCdMessage ircd_message; + void AddModes() + { + /* Add user modes */ + ModeManager::AddUserMode(new UserMode(UMODE_SERV_ADMIN, "UMODE_SERV_ADMIN", 'A')); + ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R')); + ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); + ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); + ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); + ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); + ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); + ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); + ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd')); + + /* b/e/I */ + ModeManager::AddChannelMode(new ChannelModeBan('b')); + + /* v/h/o/a/q */ + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); + + /* Add channel modes */ + ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); + ModeManager::AddChannelMode(new ChannelModeFlood('f')); + ModeManager::AddChannelMode(new ChannelModeKey('k')); + ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p')); + ModeManager::AddChannelMode(new ChannelModeRegistered('r')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M')); + ModeManager::AddChannelMode(new ChannelModeOper('O')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R')); + } + public: ProtoBahamut(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), message_svsmode("SVSMODE", OnMode), message_cs("CS", event_cs), message_hs("HS", event_hs), @@ -607,12 +593,12 @@ class ProtoBahamut : public Module this->SetAuthor("Anope"); this->SetType(PROTOCOL); - AddModes(); - pmodule_ircd_var(myIrcd); pmodule_ircd_proto(&this->ircd_proto); pmodule_ircd_message(&this->ircd_message); + this->AddModes(); + ModuleManager::Attach(I_OnUserNickChange, this); } diff --git a/modules/protocol/inspircd-ts6.h b/modules/protocol/inspircd-ts6.h index 1dff475b8..3642a75f4 100644 --- a/modules/protocol/inspircd-ts6.h +++ b/modules/protocol/inspircd-ts6.h @@ -77,8 +77,6 @@ class InspIRCdTS6Proto : public IRCDProto void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(bi ? bi->GetUID() : Config->Numeric, "MODE %s %s", u->GetUID().c_str(), buf.c_str()); } @@ -107,14 +105,17 @@ class InspIRCdTS6Proto : public IRCDProto } /* JOIN */ - void SendJoin(const BotInfo *user, const Anope::string &channel, time_t chantime) + void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status) { - send_cmd(Config->Numeric, "FJOIN %s %ld + :,%s", channel.c_str(), static_cast<long>(chantime), user->GetUID().c_str()); - } - - void SendJoin(BotInfo *user, const ChannelContainer *cc) - { - send_cmd(Config->Numeric, "FJOIN %s %ld +%s :%s,%s", cc->chan->name.c_str(), static_cast<long>(cc->chan->creation_time), cc->chan->GetModes(true, true).c_str(), cc->Status->BuildCharPrefixList().c_str(), user->GetUID().c_str()); + send_cmd(Config->Numeric, "FJOIN %s %ld +%s :,%s", c->name.c_str(), static_cast<long>(c->creation_time), c->GetModes(true, true).c_str(), user->GetUID().c_str()); + /* Note that we can send this with the FJOIN but choose not to + * because the mode stacker will handle this and probably will + * merge these modes with +nrt and other mlocked modes + */ + if (status) + for (size_t i = CMODE_BEGIN + 1; i != CMODE_END; ++i) + if (status->HasFlag(static_cast<ChannelModeName>(i))) + c->SetMode(user, static_cast<ChannelModeName>(i), user->nick, false); } /* UNSQLINE */ @@ -218,9 +219,9 @@ class InspIRCdTS6Proto : public IRCDProto send_cmd(Config->Numeric, "METADATA %s accountname :", u->GetUID().c_str()); } - void SendChannel(Channel *c, const Anope::string &modes) + void SendChannel(Channel *c) { - send_cmd(Config->Numeric, "FJOIN %s %ld %s :", c->name.c_str(), static_cast<long>(c->creation_time), modes.c_str()); + send_cmd(Config->Numeric, "FJOIN %s %ld %s :", c->name.c_str(), static_cast<long>(c->creation_time), get_mlock_modes(c->ci, true).c_str()); } bool IsNickValid(const Anope::string &nick) @@ -247,18 +248,15 @@ class InspircdIRCdMessage : public IRCdMessage as it slightly breaks RFC1459 */ User *u = finduser(source); - User *u2 = finduser(params[0]); - // This can happen with server-origin modes. if (!u) - u = u2; - + u = finduser(params[0]); // if it's still null, drop it like fire. // most likely situation was that server introduced a nick which we subsequently akilled - if (!u || !u2) + if (!u) return true; - do_umode(u->nick, u2->nick, params[1]); + do_umode(u->nick, params[1]); } return true; diff --git a/modules/protocol/inspircd11.cpp b/modules/protocol/inspircd11.cpp index 96867071c..c6dafc81a 100644 --- a/modules/protocol/inspircd11.cpp +++ b/modules/protocol/inspircd11.cpp @@ -120,15 +120,11 @@ class InspIRCdProto : public IRCDProto void SendModeInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(source ? source->nick : Config->s_OperServ, "FMODE %s %u %s", dest->name.c_str(), static_cast<unsigned>(dest->creation_time), buf.c_str()); } void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str()); } @@ -148,8 +144,6 @@ class InspIRCdProto : public IRCDProto void SendNoticeChanopsInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(Config->ServerName, "NOTICE @%s :%s", dest->name.c_str(), buf.c_str()); } @@ -160,22 +154,13 @@ class InspIRCdProto : public IRCDProto } /* JOIN */ - void SendJoin(const BotInfo *user, const Anope::string &channel, time_t chantime) - { - send_cmd(user->nick, "JOIN %s %ld", channel.c_str(), static_cast<long>(chantime)); - } - - void SendJoin(BotInfo *user, const ChannelContainer *cc) + void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status) { - SendJoin(user, cc->chan->name, cc->chan->creation_time); - for (std::map<char, ChannelMode *>::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) - { - if (cc->Status->HasFlag(it->second->Name)) - { - cc->chan->SetMode(user, it->second, user->nick); - } - } - cc->chan->SetModes(user, false, "%s", cc->chan->GetModes(true, true).c_str()); + send_cmd(user->nick, "JOIN %s %ld", c->name.c_str(), static_cast<long>(c->creation_time)); + if (status) + for (size_t i = CMODE_BEGIN + 1; i != CMODE_END; ++i) + if (status->HasFlag(static_cast<ChannelModeName>(i))) + c->SetMode(user, static_cast<ChannelModeName>(i), user->nick, false); } /* UNSQLINE */ @@ -193,8 +178,6 @@ class InspIRCdProto : public IRCDProto /* SQUIT */ void SendSquit(const Anope::string &servname, const Anope::string &message) { - if (servname.empty() || message.empty()) - return; send_cmd(Config->ServerName, "SQUIT %s :%s", servname.c_str(), message.c_str()); } @@ -292,12 +275,7 @@ class InspircdIRCdMessage : public IRCdMessage if (params[0][0] == '#' || params[0][0] == '&') do_cmode(source, params[0], params[1], params[2]); else - { - /* InspIRCd lets opers change another - users modes - */ - do_umode(source, params[0], params[1]); - } + do_umode(params[0], params[1]); return true; } @@ -510,7 +488,7 @@ class InspircdIRCdMessage : public IRCdMessage } } } - else if (capab.find("PREIX=(") != Anope::string::npos) + else if (capab.find("PREFIX=(") != Anope::string::npos) { Anope::string modes(capab.begin() + 8, capab.begin() + capab.find(')')); Anope::string chars(capab.begin() + capab.find(')') + 1, capab.end()); @@ -625,6 +603,8 @@ class InspircdIRCdMessage : public IRCdMessage if (keep_their_modes) Status.push_back(cm); } + /* Erase the , */ + buf.erase(buf.begin()); User *u = finduser(buf); if (!u) @@ -876,25 +856,26 @@ bool ChannelModeFlood::IsValid(const Anope::string &value) const return false; } -static void AddModes() -{ - ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, "UMODE_CALLERID", 'g')); - ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h')); - ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); - ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); - ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); - ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); - ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); -} - class ProtoInspIRCd : public Module { Message message_endburst, message_rsquit, message_svsmode, message_chghost, message_chgident, message_chgname, message_sethost, message_setident, message_setname, message_fmode, message_ftopic, message_opertype, - message_idle; + message_idle, message_fjoin; InspIRCdProto ircd_proto; InspircdIRCdMessage ircd_message; + + void AddModes() + { + ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, "UMODE_CALLERID", 'g')); + ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h')); + ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); + ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); + ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); + ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); + ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); + } + public: ProtoInspIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), message_endburst("ENDBURST", event_endburst), message_rsquit("RSQUIT", event_rsquit), @@ -903,19 +884,19 @@ class ProtoInspIRCd : public Module message_sethost("SETHOST", event_sethost), message_setident("SETIDENT", event_setident), message_setname("SETNAME", event_setname), message_fmode("FMODE", event_fmode), message_ftopic("FTOPIC", event_ftopic), message_opertype("OPERTYPE", event_opertype), - message_idle("IDLE", event_idle) + message_idle("IDLE", event_idle), message_fjoin("FJOIN", OnSJoin) { this->SetAuthor("Anope"); this->SetType(PROTOCOL); - AddModes(); - pmodule_ircd_var(myIrcd); pmodule_ircd_proto(&this->ircd_proto); pmodule_ircd_message(&this->ircd_message); Capab.SetFlag(CAPAB_NOQUIT); + this->AddModes(); + ModuleManager::Attach(I_OnUserNickChange, this); } diff --git a/modules/protocol/inspircd12.cpp b/modules/protocol/inspircd12.cpp index eb84601ef..958709b06 100644 --- a/modules/protocol/inspircd12.cpp +++ b/modules/protocol/inspircd12.cpp @@ -230,34 +230,6 @@ bool event_sethost(const Anope::string &source, const std::vector<Anope::string> return true; } -/* - * [Nov 03 22:09:58.176252 2009] debug: Received: :964 UID 964AAAAAC 1225746297 w00t2 localhost testnet.user w00t 127.0.0.1 1225746302 +iosw +ACGJKLNOQcdfgjklnoqtx :Robin Burchell <w00t@inspircd.org> - * 0: uid - * 1: ts - * 2: nick - * 3: host - * 4: dhost - * 5: ident - * 6: ip - * 7: signon - * 8+: modes and params -- IMPORTANT, some modes (e.g. +s) may have parameters. So don't assume a fixed position of realname! - * last: realname - */ - -bool event_uid(const Anope::string &source, const std::vector<Anope::string> ¶ms) -{ - Server *s = Server::Find(source); - time_t ts = convertTo<time_t>(params[1]); - - Anope::string modes = params[8]; - for (unsigned i = 9; i < params.size() - 1; ++i) - modes += " " + params[i]; - User *user = do_nick("", params[2], params[5], params[3], s->GetName(), params[params.size() - 1], ts, params[6], params[4], params[0], modes); - if (user && user->server->IsSynced()) - validate_user(user); - - return true; -} bool event_chghost(const Anope::string &source, const std::vector<Anope::string> ¶ms) { @@ -297,11 +269,11 @@ bool event_metadata(const Anope::string &source, const std::vector<Anope::string } } -/* - * possible incoming ssl_cert messages: - * Received: :409 METADATA 409AAAAAA ssl_cert :vTrSe c38070ce96e41cc144ed6590a68d45a6 <...> <...> - * Received: :409 METADATA 409AAAAAC ssl_cert :vTrSE Could not get peer certificate: error:00000000:lib(0):func(0):reason(0) - */ + /* + * possible incoming ssl_cert messages: + * Received: :409 METADATA 409AAAAAA ssl_cert :vTrSe c38070ce96e41cc144ed6590a68d45a6 <...> <...> + * Received: :409 METADATA 409AAAAAC ssl_cert :vTrSE Could not get peer certificate: error:00000000:lib(0):func(0):reason(0) + */ else if (params[1].equals_cs("ssl_cert")) { User *u = finduser(params[0]); @@ -342,15 +314,27 @@ bool event_endburst(const Anope::string &source, const std::vector<Anope::string class Inspircd12IRCdMessage : public InspircdIRCdMessage { public: + /* + * [Nov 03 22:09:58.176252 2009] debug: Received: :964 UID 964AAAAAC 1225746297 w00t2 localhost testnet.user w00t 127.0.0.1 1225746302 +iosw +ACGJKLNOQcdfgjklnoqtx :Robin Burchell <w00t@inspircd.org> + * 0: uid + * 1: ts + * 2: nick + * 3: host + * 4: dhost + * 5: ident + * 6: ip + * 7: signon + * 8+: modes and params -- IMPORTANT, some modes (e.g. +s) may have parameters. So don't assume a fixed position of realname! + * last: realname + */ bool OnUID(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - Server *s = Server::Find(source); time_t ts = convertTo<time_t>(params[1]); Anope::string modes = params[8]; for (unsigned i = 9; i < params.size() - 1; ++i) modes += " " + params[i]; - User *user = do_nick("", params[2], params[5], params[3], s->GetName(), params[params.size() - 1], ts, params[6], params[4], params[0], modes); + User *user = do_nick("", params[2], params[5], params[3], source, params[params.size() - 1], ts, params[6], params[4], params[0], modes); if (user && user->server->IsSynced()) validate_user(user); diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index 93928b318..e1e339635 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -105,8 +105,7 @@ bool event_opertype(const Anope::string &source, const std::vector<Anope::string { /* opertype is equivalent to mode +o because servers dont do this directly */ - User *u; - u = finduser(source); + User *u = finduser(source); if (u && !u->HasMode(UMODE_OPER)) { std::vector<Anope::string> newparams; @@ -174,9 +173,8 @@ bool event_rsquit(const Anope::string &source, const std::vector<Anope::string> bool event_setname(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - User *u; + User *u = finduser(source); - u = finduser(source); if (!u) { Log(LOG_DEBUG) << "SETNAME for nonexistent user " << source; @@ -189,9 +187,8 @@ bool event_setname(const Anope::string &source, const std::vector<Anope::string> bool event_chgname(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - User *u; + User *u = finduser(source); - u = finduser(source); if (!u) { Log(LOG_DEBUG) << "FNAME for nonexistent user " << source; @@ -204,9 +201,8 @@ bool event_chgname(const Anope::string &source, const std::vector<Anope::string> bool event_setident(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - User *u; + User *u = finduser(source); - u = finduser(source); if (!u) { Log(LOG_DEBUG) << "SETIDENT for nonexistent user " << source; @@ -233,9 +229,8 @@ bool event_chgident(const Anope::string &source, const std::vector<Anope::string bool event_sethost(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - User *u; + User *u = finduser(source); - u = finduser(source); if (!u) { Log(LOG_DEBUG) << "SETHOST for nonexistent user " << source; @@ -249,6 +244,7 @@ bool event_sethost(const Anope::string &source, const std::vector<Anope::string> bool event_chghost(const Anope::string &source, const std::vector<Anope::string> ¶ms) { User *u = finduser(source); + if (!u) { Log(LOG_DEBUG) << "FHOST for nonexistent user " << source; @@ -283,11 +279,11 @@ bool event_metadata(const Anope::string &source, const std::vector<Anope::string } } -/* - * possible incoming ssl_cert messages: - * Received: :409 METADATA 409AAAAAA ssl_cert :vTrSe c38070ce96e41cc144ed6590a68d45a6 <...> <...> - * Received: :409 METADATA 409AAAAAC ssl_cert :vTrSE Could not get peer certificate: error:00000000:lib(0):func(0):reason(0) - */ + /* + * possible incoming ssl_cert messages: + * Received: :409 METADATA 409AAAAAA ssl_cert :vTrSe c38070ce96e41cc144ed6590a68d45a6 <...> <...> + * Received: :409 METADATA 409AAAAAC ssl_cert :vTrSE Could not get peer certificate: error:00000000:lib(0):func(0):reason(0) + */ else if (params[1].equals_cs("ssl_cert")) { User *u = finduser(params[0]); @@ -343,13 +339,12 @@ class Inspircd20IRCdMessage : public InspircdIRCdMessage */ bool OnUID(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - Server *s = Server::Find(source); time_t ts = Anope::string(params[1]).is_pos_number_only() ? convertTo<time_t>(params[1]) : 0; Anope::string modes = params[8]; for (unsigned i = 9; i < params.size() - 1; ++i) modes += Anope::string(" ") + params[i]; - User *user = do_nick("", params[2], params[5], params[3], s->GetName(), params[params.size() - 1], ts, params[6], params[4], params[0], modes); + User *user = do_nick("", params[2], params[5], params[3], source, params[params.size() - 1], ts, params[6], params[4], params[0], modes); if (user && user->server->IsSynced()) validate_user(user); diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp index 91cb53415..85383dbf2 100644 --- a/modules/protocol/ngircd.cpp +++ b/modules/protocol/ngircd.cpp @@ -42,9 +42,6 @@ IRCDVar myIrcd[] = { /* PASS */ class ngIRCdProto : public IRCDProto { - /* ngIRCd does not use the following functions, but we need the - * empty functions in this class or the file will not compile - */ void SendAkill(const XLine *x) { } void SendAkillDel(const XLine*) { } void SendSQLine(const XLine*) { } @@ -54,20 +51,16 @@ class ngIRCdProto : public IRCDProto void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf) { - if (source) - send_cmd(source->nick, "WALLOPS :%s", buf.c_str()); - else - send_cmd(Config->ServerName, "WALLOPS :%s", buf.c_str()); - } - - void SendJoin(const BotInfo *user, const Anope::string &channel, time_t chantime) - { - send_cmd(user->nick, "JOIN %s", channel.c_str()); + send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str()); } - void SendJoin(const BotInfo *user, const ChannelContainer *cc) + void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status) { - send_cmd(user->nick, "JOIN %s", cc->chan->name.c_str()); + send_cmd(user->nick, "JOIN %s", c->name.c_str()); + if (status) + for (size_t i = CMODE_BEGIN + 1; i != CMODE_END; ++i) + if (status->HasFlag(static_cast<ChannelModeName>(i))) + c->SetMode(user, static_cast<ChannelModeName>(i), user->nick, false); } void SendSVSKillInternal(const BotInfo *source, const User *user, const Anope::string &buf) @@ -87,7 +80,7 @@ class ngIRCdProto : public IRCDProto /* Make myself known to myself in the serverlist */ SendServer(Me); /* finish the enhanced server handshake and register the connection */ - send_cmd(Config->ServerName, "376 * :End of MOTD command"); + this->SendNumeric(Config->ServerName, 376, "*", ":End of MOTD command"); } // Received: :dev.anope.de NICK DukeP 1 ~DukePyro p57ABF9C9.dip.t-dialin.net 1 +i :DukePyrolator @@ -105,12 +98,6 @@ class ngIRCdProto : public IRCDProto send_cmd(bi->nick, "PART %s", chan->name.c_str()); } - void SendNumericInternal(const Anope::string &, int numeric, const Anope::string &dest, const Anope::string &buf) - { - // This might need to be set in the call to SendNumeric instead of here, will review later -- CyberBotX - send_cmd(Config->ServerName, "%03d %s %s", numeric, dest.c_str(), buf.c_str()); - } - void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf) { send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", dest->name.c_str(), buf.c_str()); @@ -118,8 +105,6 @@ class ngIRCdProto : public IRCDProto void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str()); } @@ -142,33 +127,20 @@ class ngIRCdProto : public IRCDProto send_cmd(source->nick, "INVITE %s %s", nick.c_str(), chan.c_str()); } - void SendChannel(Channel *c, const Anope::string &modes) + void SendChannel(Channel *c) { - send_cmd(Config->ServerName, "CHANINFO %s %s", c->name.c_str(), modes.c_str()); + send_cmd(Config->ServerName, "CHANINFO %s %s", c->name.c_str(), get_mlock_modes(c->ci, true).c_str()); } - - bool IsNickValid(const Anope::string &nick) - { - /* TS6 Save extension -Certus */ - if (isdigit(nick[0])) - return false; - return true; - } - void SendTopic(BotInfo *bi, Channel *c) { send_cmd(bi->nick, "TOPIC %s :%s", c->name.c_str(), c->topic.c_str()); } - }; class ngIRCdIRCdMessage : public IRCdMessage { public: - /* ngIRCd uses NJOIN instead of SJOIN, but we still need an - * empty function in this class or the file will not compile - */ - bool OnSJoin(const Anope::string&, const std::vector<Anope::string>&) { return true; } + bool OnSJoin(const Anope::string&, const std::vector<Anope::string>&) { return false; } /* * Received: :dev.anope.de MODE #anope +b *!*@*aol* @@ -185,7 +157,7 @@ class ngIRCdIRCdMessage : public IRCdMessage if (params[0][0] == '#' || params[0][0] == '&') do_cmode(source, params[0], modes, ""); else - do_umode(source, params[0], params[1]); + do_umode(params[0], params[1]); return true; } @@ -255,20 +227,16 @@ class ngIRCdIRCdMessage : public IRCdMessage { if (!params.empty()) { - Anope::string channel, mode; - size_t pos; - pos = params[0].find('\7'); + size_t pos = params[0].find('\7'); if (pos != Anope::string::npos) { - channel = params[0].substr(0, pos); - mode += '+' + params[0].substr(pos, params[0].length()) + " " + source; + Anope::string channel = params[0].substr(0, pos); + Anope::string mode = '+' + params[0].substr(pos, params[0].length()) + " " + source; do_join(source, channel, ""); do_cmode(source, channel, mode, ""); } else - { do_join(source, params[0], ""); - } } return true; } @@ -283,13 +251,11 @@ bool event_chaninfo(const Anope::string &source, const std::vector<Anope::string { Channel *c = findchan(params[0]); - Anope::string modes; - if (!c) c = new Channel(params[0]); - modes = params[1]; - + Anope::string modes = params[1]; + if (params.size() == 3) { c->ChangeTopicInternal(source, params[2], Anope::CurTime); @@ -436,42 +402,6 @@ bool event_376(const Anope::string &source, const std::vector<Anope::string> &pa } -static void AddModes() -{ - /* Add user modes */ - ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); - ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); - ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); - ModeManager::AddUserMode(new UserMode(UMODE_RESTRICTED, "UMODE_RESTRICTED", 'r')); - ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); - ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); - ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); - -// channel modes: biIklmnoPstvz - /* b/e/I */ - ModeManager::AddChannelMode(new ChannelModeBan('b')); - ModeManager::AddChannelMode(new ChannelModeInvex('I')); - - /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); - - /* Add channel modes */ - ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); - ModeManager::AddChannelMode(new ChannelModeKey('k')); - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, "CMODE_PERM", 'P')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'z')); - - return; -} - - - class ProtongIRCd : public Module { Message message_kick, message_pass, message_njoin, message_chaninfo, message_005, @@ -479,6 +409,39 @@ class ProtongIRCd : public Module ngIRCdProto ircd_proto; ngIRCdIRCdMessage ircd_message; + + void AddModes() + { + /* Add user modes */ + ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); + ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); + ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); + ModeManager::AddUserMode(new UserMode(UMODE_RESTRICTED, "UMODE_RESTRICTED", 'r')); + ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); + ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); + ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); + + /* b/e/I */ + ModeManager::AddChannelMode(new ChannelModeBan('b')); + ModeManager::AddChannelMode(new ChannelModeInvex('I')); + + /* v/h/o/a/q */ + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); + + /* Add channel modes */ + // channel modes: biIklmnoPstvz + ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); + ModeManager::AddChannelMode(new ChannelModeKey('k')); + ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, "CMODE_PERM", 'P')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'z')); + } + public: ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), message_kick("KICK", event_kick), message_pass("PASS", event_pass), @@ -490,11 +453,11 @@ class ProtongIRCd : public Module Capab.SetFlag(CAPAB_QS); - AddModes(); - pmodule_ircd_var(myIrcd); pmodule_ircd_proto(&this->ircd_proto); pmodule_ircd_message(&this->ircd_message); + + this->AddModes(); } }; diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp index a1fad8d5b..98ca554e9 100644 --- a/modules/protocol/plexus.cpp +++ b/modules/protocol/plexus.cpp @@ -89,10 +89,7 @@ class PlexusProto : public IRCDProto { void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf) { - if (source) - send_cmd(source->GetUID(), "OPERWALL :%s", buf.c_str()); - else - send_cmd(Config->Numeric, "OPERWALL :%s", buf.c_str()); + send_cmd(source ? source->GetUID() : Config->Numeric, "OPERWALL :%s", buf.c_str()); } void SendSQLine(const XLine *x) @@ -123,14 +120,13 @@ class PlexusProto : public IRCDProto send_cmd(Config->Numeric, "UNRESV * %s", x->Mask.c_str()); } - void SendJoin(const BotInfo *user, const Anope::string &channel, time_t chantime) + void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status) { - send_cmd(Config->Numeric, "SJOIN %ld %s + :%s", static_cast<long>(chantime), channel.c_str(), user->GetUID().c_str()); - } - - void SendJoin(const BotInfo *user, const ChannelContainer *cc) - { - send_cmd(Config->Numeric, "SJOIN %ld %s +%s :%s%s", static_cast<long>(cc->chan->creation_time), cc->chan->name.c_str(), cc->chan->GetModes(true, true).c_str(), cc->Status->BuildModePrefixList().c_str(), user->GetUID().c_str()); + send_cmd(Config->Numeric, "SJOIN %ld %s +%s :%s", static_cast<long>(c->creation_time), c->name.c_str(), c->GetModes(true, true).c_str(), user->GetUID().c_str()); + if (status) + for (size_t i = CMODE_BEGIN + 1; i != CMODE_END; ++i) + if (status->HasFlag(static_cast<ChannelModeName>(i))) + c->SetMode(user, static_cast<ChannelModeName>(i), user->nick, false); } void SendAkill(const XLine *x) @@ -180,12 +176,6 @@ class PlexusProto : public IRCDProto send_cmd(bi->GetUID(), "PART %s", chan->name.c_str()); } - void SendNumericInternal(const Anope::string &, int numeric, const Anope::string &dest, const Anope::string &buf) - { - // This might need to be set in the call to SendNumeric instead of here, will review later -- CyberBotX - send_cmd(Config->Numeric, "%03d %s %s", numeric, dest.c_str(), buf.c_str()); - } - void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf) { if (bi) @@ -229,23 +219,14 @@ class PlexusProto : public IRCDProto send_cmd(Config->Numeric, "ENCAP * SU %s", u->GetUID().c_str()); } - bool IsNickValid(const Anope::string &nick) - { - /* TS6 Save extension -Certus */ - if (isdigit(nick[0])) - return false; - - return true; - } - void SendTopic(BotInfo *bi, Channel *c) { send_cmd(bi->GetUID(), "ENCAP * TOPIC %s %s %lu :%s", c->name.c_str(), c->topic_setter.c_str(), static_cast<unsigned long>(c->topic_time + 1), c->topic.c_str()); } - void SendChannel(Channel *c, const Anope::string &modes) + void SendChannel(Channel *c) { - send_cmd(Config->Numeric, "SJOIN %ld %s %s :", static_cast<long>(c->creation_time), c->name.c_str(), modes.c_str()); + send_cmd(Config->Numeric, "SJOIN %ld %s %s :", static_cast<long>(c->creation_time), c->name.c_str(), get_mlock_modes(c->ci, true).c_str()); } }; @@ -260,13 +241,7 @@ class PlexusIRCdMessage : public IRCdMessage if (params[0][0] == '#' || params[0][0] == '&') do_cmode(source, params[0], params[2], params[1]); else - { - User *u = finduser(source); - User *u2 = finduser(params[0]); - if (!u || !u2) - return true; - do_umode(u->nick, u2->nick, params[1]); - } + do_umode(params[0], params[1]); return true; } @@ -287,8 +262,11 @@ class PlexusIRCdMessage : public IRCdMessage */ bool OnUID(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - /* Source is always the server */ - User *user = do_nick("", params[0], params[4], params[9], source, params[10], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, params[6], params[5], params[7], params[3]); + /* An IP of 0 means the user is spoofed */ + Anope::string ip = params[6]; + if (ip == "0") + ip.clear(); + User *user = do_nick("", params[0], params[4], params[9], source, params[10], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, ip, params[5], params[7], params[3]); if (user && user->server->IsSynced()) validate_user(user); @@ -442,20 +420,23 @@ class PlexusIRCdMessage : public IRCdMessage bool event_tburst(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - if (params.size() != 4) + // :rizon.server TBURST 1298674830 #lol 1298674833 Adam!Adam@i.has.a.spoof :lol + if (params.size() < 4) return true; - Anope::string setter = myStrGetToken(params[2], '!', 0); - time_t topic_time = Anope::string(params[1]).is_pos_number_only() ? convertTo<time_t>(params[1]) : Anope::CurTime; - Channel *c = findchan(params[0]); + Channel *c = findchan(params[1]); if (!c) { Log() << "TOPIC " << params[3] << " for nonexistent channel " << params[0]; return true; } + else if (c->creation_time < convertTo<time_t>(params[0])) + return true; - c->ChangeTopicInternal(setter, params.size() > 3 ? params[3] : "", topic_time); + Anope::string setter = myStrGetToken(params[3], '!', 0); + time_t topic_time = Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : Anope::CurTime; + c->ChangeTopicInternal(setter, params.size() > 4 ? params[4] : "", topic_time); return true; } @@ -477,13 +458,7 @@ bool event_mode(const Anope::string &source, const std::vector<Anope::string> &p if (params[0][0] == '#' || params[0][0] == '&') do_cmode(source, params[0], params[2], params[1]); else - { - User *u = finduser(source); - User *u2 = finduser(params[0]); - if (!u || !u2) - return true; - do_umode(u->nick, u2->nick, params[1]); - } + do_umode(params[0], params[1]); return true; } @@ -536,13 +511,13 @@ bool event_encap(const Anope::string &source, const std::vector<Anope::string> & { if (params.size() < 4) return true; -/* - * Received: :dev.anope.de ENCAP * SU DukePyrolator DukePyrolator - * params[0] = * - * params[1] = SU - * params[2] = nickname - * params[3] = account - */ + /* + * Received: :dev.anope.de ENCAP * SU DukePyrolator DukePyrolator + * params[0] = * + * params[1] = SU + * params[2] = nickname + * params[3] = account + */ else if (params[1].equals_cs("SU")) { User *u = finduser(params[2]); @@ -555,13 +530,14 @@ bool event_encap(const Anope::string &source, const std::vector<Anope::string> & u->SetMode(NickServ, UMODE_REGISTERED); } } -/* - * Received: :dev.anope.de ENCAP * CERTFP DukePyrolator :3F122A9CC7811DBAD3566BF2CEC3009007C0868F - * params[0] = * - * params[1] = CERTFP - * params[2] = nickname - * params[3] = fingerprint - */ + + /* + * Received: :dev.anope.de ENCAP * CERTFP DukePyrolator :3F122A9CC7811DBAD3566BF2CEC3009007C0868F + * params[0] = * + * params[1] = CERTFP + * params[2] = nickname + * params[3] = fingerprint + */ else if (params[1].equals_cs("CERTFP")) { User *u = finduser(params[2]); @@ -591,58 +567,6 @@ bool event_eob(const Anope::string &source, const std::vector<Anope::string> &pa return true; } -static void AddModes() -{ - /* Add user modes */ - ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); - ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); - ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); - ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); - ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); - ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'D')); - ModeManager::AddUserMode(new UserMode(UMODE_SOFTCALLERID, "UMODE_SOFTCALLERID", 'G')); - ModeManager::AddUserMode(new UserMode(UMODE_NETADMIN, "UMODE_NETADMIN", 'M')); - ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R')); - ModeManager::AddUserMode(new UserMode(UMODE_SSL, "UMODE_SSL", 'S')); - ModeManager::AddUserMode(new UserMode(UMODE_WEBIRC, "UMODE_WEBIRC", 'W')); - ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, "UMODE_CALLERID", 'g')); - ModeManager::AddUserMode(new UserMode(UMODE_PRIV, "UMODE_PRIV", 'p')); - ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); - ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); - - /* b/e/I */ - ModeManager::AddChannelMode(new ChannelModeBan('b')); - ModeManager::AddChannelMode(new ChannelModeExcept('e')); - ModeManager::AddChannelMode(new ChannelModeInvex('I')); - - /* l/k */ - ModeManager::AddChannelMode(new ChannelModeKey('k')); - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); - - /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', '%')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', '&')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '~')); - - /* Add channel modes */ - ModeManager::AddChannelMode(new ChannelMode(CMODE_BANDWIDTH, "CMODE_BANDWIDTH", 'B')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_NONOTICE, "CMODE_NONOTICE", 'N')); - ModeManager::AddChannelMode(new ChannelModeOper('O')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'S')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, "CMODE_PERM", 'z')); -} - class ProtoPlexus : public Module { Message message_tmode, message_bmask, message_pass, @@ -651,21 +575,75 @@ class ProtoPlexus : public Module PlexusProto ircd_proto; PlexusIRCdMessage ircd_message; + + void AddModes() + { + /* Add user modes */ + ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); + ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); + ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); + ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); + ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); + ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'D')); + ModeManager::AddUserMode(new UserMode(UMODE_SOFTCALLERID, "UMODE_SOFTCALLERID", 'G')); + ModeManager::AddUserMode(new UserMode(UMODE_NETADMIN, "UMODE_NETADMIN", 'M')); + ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R')); + ModeManager::AddUserMode(new UserMode(UMODE_SSL, "UMODE_SSL", 'S')); + ModeManager::AddUserMode(new UserMode(UMODE_WEBIRC, "UMODE_WEBIRC", 'W')); + ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, "UMODE_CALLERID", 'g')); + ModeManager::AddUserMode(new UserMode(UMODE_PRIV, "UMODE_PRIV", 'p')); + ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); + ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); + + /* b/e/I */ + ModeManager::AddChannelMode(new ChannelModeBan('b')); + ModeManager::AddChannelMode(new ChannelModeExcept('e')); + ModeManager::AddChannelMode(new ChannelModeInvex('I')); + + /* l/k */ + ModeManager::AddChannelMode(new ChannelModeKey('k')); + ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); + + /* v/h/o/a/q */ + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', '%')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', '&')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '~')); + + /* Add channel modes */ + ModeManager::AddChannelMode(new ChannelMode(CMODE_BANDWIDTH, "CMODE_BANDWIDTH", 'B')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_NONOTICE, "CMODE_NONOTICE", 'N')); + ModeManager::AddChannelMode(new ChannelModeOper('O')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R')); + + ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'S')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, "CMODE_PERM", 'z')); + } + public: ProtoPlexus(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), message_tmode("TMODE", event_tmode), message_bmask("BMASK", event_bmask), - message_pass("PASS", event_pass), message_tb("TB", event_tburst), + message_pass("PASS", event_pass), message_tb("TBURST", event_tburst), message_sid("SID", event_sid), message_encap("ENCAP", event_encap), message_eob("EOB", event_eob) { this->SetAuthor("Anope"); this->SetType(PROTOCOL); - AddModes(); - pmodule_ircd_var(myIrcd); pmodule_ircd_proto(&this->ircd_proto); pmodule_ircd_message(&this->ircd_message); + + this->AddModes(); } }; diff --git a/modules/protocol/ratbox.cpp b/modules/protocol/ratbox.cpp index c7797c166..1eaafc144 100644 --- a/modules/protocol/ratbox.cpp +++ b/modules/protocol/ratbox.cpp @@ -16,7 +16,7 @@ static Anope::string TS6UPLINK; IRCDVar myIrcd[] = { {"Ratbox 2.0+", /* ircd name */ - "+oi", /* Modes used by pseudoclients */ + "+oiS", /* Modes used by pseudoclients */ 0, /* SVSNICK */ 0, /* Vhost */ 1, /* Supports SNlines */ @@ -79,7 +79,7 @@ void ratbox_cmd_svsinfo() */ void ratbox_cmd_capab() { - send_cmd("", "CAPAB :QS EX CHW IE KLN GLN KNOCK TB UNKLN CLUSTER ENCAP"); + send_cmd("", "CAPAB :QS EX CHW IE KLN GLN KNOCK TB UNKLN CLUSTER ENCAP TS6"); } /* PASS */ @@ -92,10 +92,7 @@ class RatboxProto : public IRCDProto { void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf) { - if (source) - send_cmd(source->GetUID(), "OPERWALL :%s", buf.c_str()); - else - send_cmd(Config->Numeric, "OPERWALL :%s", buf.c_str()); + send_cmd(source ? source->GetUID() : Config->Numeric, "OPERWALL :%s", buf.c_str()); } void SendSQLine(const XLine *x) @@ -126,14 +123,20 @@ class RatboxProto : public IRCDProto send_cmd(Config->Numeric, "UNRESV * %s", x->Mask.c_str()); } - void SendJoin(const BotInfo *user, const Anope::string &channel, time_t chantime) - { - send_cmd("", "SJOIN %ld %s + :%s", static_cast<long>(chantime), channel.c_str(), user->GetUID().c_str()); - } - - void SendJoin(const BotInfo *user, const ChannelContainer *cc) + void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status) { - send_cmd("", "SJOIN %ld %s +%s :%s%s", static_cast<long>(cc->chan->creation_time), cc->chan->name.c_str(), cc->chan->GetModes(true, true).c_str(), cc->Status->BuildModePrefixList().c_str(), user->GetUID().c_str()); + /* Note that we must send our modes with the SJOIN and + * can not add them to the mode stacker because ratbox + * does not allow *any* client to op itself + */ + send_cmd("", "SJOIN %ld %s +%s :%s%s", static_cast<long>(c->creation_time), c->name.c_str(), c->GetModes(true, true).c_str(), status != NULL ? status->BuildModePrefixList().c_str() : "", user->GetUID().c_str()); + /* And update our internal status for this user since this is not going through our mode handling system */ + if (status != NULL) + { + UserContainer *uc = c->FindUser(user); + if (uc != NULL) + *uc->Status = *status; + } } void SendAkill(const XLine *x) @@ -176,24 +179,13 @@ class RatboxProto : public IRCDProto send_cmd(bi->GetUID(), "PART %s", chan->name.c_str()); } - void SendNumericInternal(const Anope::string &, int numeric, const Anope::string &dest, const Anope::string &buf) - { - // This might need to be set in the call to SendNumeric instead of here, will review later -- CyberBotX - send_cmd(Config->Numeric, "%03d %s %s", numeric, dest.c_str(), buf.c_str()); - } - void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf) { - if (bi) - send_cmd(bi->GetUID(), "MODE %s %s", dest->name.c_str(), buf.c_str()); - else - send_cmd(Config->Numeric, "MODE %s %s", dest->name.c_str(), buf.c_str()); + send_cmd(bi ? bi->GetUID() : Config->Numeric, "MODE %s %s", dest->name.c_str(), buf.c_str()); } void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(bi ? bi->GetUID() : Config->Numeric, "SVSMODE %s %s", u->nick.c_str(), buf.c_str()); } @@ -227,9 +219,9 @@ class RatboxProto : public IRCDProto send_cmd(Config->Numeric, "ENCAP * SU %s", u->GetUID().c_str()); } - void SendChannel(Channel *c, const Anope::string &modes) + void SendChannel(Channel *c) { - send_cmd("", "SJOIN %ld %s %s :", static_cast<long>(c->creation_time), c->name.c_str(), modes.c_str()); + send_cmd("", "SJOIN %ld %s %s :", static_cast<long>(c->creation_time), c->name.c_str(), get_mlock_modes(c->ci, true).c_str()); } bool IsNickValid(const Anope::string &nick) @@ -248,27 +240,11 @@ class RatboxProto : public IRCDProto { ChannelStatus status; status.SetFlag(CMODE_OP); - ChannelContainer cc(c); - cc.Status = &status; - ircdproto->SendJoin(bi, &cc); + bi->Join(c, &status); } send_cmd(bi->GetUID(), "TOPIC %s :%s", c->name.c_str(), c->topic.c_str()); if (needjoin) - { - ircdproto->SendPart(bi, c, NULL); - } - } - - void SetAutoIdentificationToken(User *u) - { - - if (!u->Account()) - return; - - Anope::string svidbuf = stringify(u->timestamp); - - u->Account()->Shrink("authenticationtoken"); - u->Account()->Extend("authenticationtoken", new ExtensibleItemRegular<Anope::string>(svidbuf)); + bi->Part(c); } }; @@ -283,33 +259,17 @@ class RatboxIRCdMessage : public IRCdMessage if (params[0][0] == '#' || params[0][0] == '&') do_cmode(source, params[0], params[2], params[1]); else - { - User *u = finduser(source); - User *u2 = finduser(params[0]); - if (!u || !u2) - return true; - do_umode(u->nick, u2->nick, params[1]); - } + do_umode(params[0], params[1]); return true; } bool OnUID(const Anope::string &source, const std::vector<Anope::string> ¶ms) { - Server *s = Server::Find(source); /* Source is always the server */ - User *user = do_nick("", params[0], params[4], params[5], s->GetName(), params[8], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, params[6], "*", params[7], params[3]); - if (user) - { - NickAlias *na = findnick(user->nick); - Anope::string svidbuf; - if (na && na->nc->GetExtRegular("authenticationtoken", svidbuf) && svidbuf == params[2]) - { - user->Login(na->nc); - } - else - validate_user(user); - } + User *user = do_nick("", params[0], params[4], params[5], source, params[8], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, params[6], "*", params[7], params[3]); + if (user && user->server->IsSynced()) + validate_user(user); return true; } @@ -338,6 +298,7 @@ class RatboxIRCdMessage : public IRCdMessage do_server(source, params[0], Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0, params[2], TS6UPLINK); else do_server(source, params[0], Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0, params[2], ""); + ircdproto->SendPing(Config->ServerName, params[0]); return true; } @@ -490,9 +451,40 @@ bool event_kick(const Anope::string &source, const std::vector<Anope::string> &p bool event_sid(const Anope::string &source, const std::vector<Anope::string> ¶ms) { /* :42X SID trystan.nomadirc.net 2 43X :ircd-ratbox test server */ + do_server(source, params[0], Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0, params[3], params[2]); + ircdproto->SendPing(Config->ServerName, params[0]); + return true; +} + +// Debug: Received: :00BAAAAAB ENCAP * LOGIN Adam +bool event_encap(const Anope::string &source, const std::vector<Anope::string> ¶ms) +{ + if (params.size() > 2 && params[1] == "LOGIN") + { + User *u = finduser(source); + NickCore *nc = findcore(params[2]); + if (!u || !nc) + return true; + u->Login(nc); + } + + return true; +} + +bool event_pong(const Anope::string &source, const std::vector<Anope::string> ¶ms) +{ Server *s = Server::Find(source); + if (s && !s->IsSynced()) + { + s->Sync(false); - do_server(s->GetName(), params[0], Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0, params[3], params[2]); + for (patricia_tree<User *, ci::ci_char_traits>::iterator it(UserListByNick); it.next();) + { + User *u = *it; + if (u->server == s && !u->IsIdentified()) + validate_user(u); + } + } return true; } @@ -536,55 +528,58 @@ bool event_bmask(const Anope::string &source, const std::vector<Anope::string> & return true; } -static void AddModes() -{ - /* Add user modes */ - ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); - ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); - ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); - ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); - ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); - - /* b/e/I */ - ModeManager::AddChannelMode(new ChannelModeBan('b')); - ModeManager::AddChannelMode(new ChannelModeExcept('e')); - ModeManager::AddChannelMode(new ChannelModeInvex('I')); - - /* v/h/o/a/q */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); - - /* Add channel modes */ - ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); - ModeManager::AddChannelMode(new ChannelModeKey('k')); - ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); - ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); -} - class ProtoRatbox : public Module { - Message message_kick, message_tmode, message_bmask, message_pass, message_tb, message_sid; + Message message_kick, message_tmode, message_bmask, message_pass, message_tb, message_sid, message_encap, + message_pong; RatboxProto ircd_proto; RatboxIRCdMessage ircd_message; + + void AddModes() + { + /* Add user modes */ + ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); + ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); + ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); + ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); + ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); + + /* b/e/I */ + ModeManager::AddChannelMode(new ChannelModeBan('b')); + ModeManager::AddChannelMode(new ChannelModeExcept('e')); + ModeManager::AddChannelMode(new ChannelModeInvex('I')); + + /* v/h/o/a/q */ + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); + + /* Add channel modes */ + ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i')); + ModeManager::AddChannelMode(new ChannelModeKey('k')); + ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's')); + ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't')); + } + public: ProtoRatbox(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), message_kick("KICK", event_kick), message_tmode("TMODE", event_tmode), message_bmask("BMASK", event_bmask), message_pass("PASS", event_pass), - message_tb("TB", event_tburst), message_sid("SID", event_sid) + message_tb("TB", event_tburst), message_sid("SID", event_sid), message_encap("ENCAP", event_encap), + message_pong("PONG", event_pong) { this->SetAuthor("Anope"); this->SetType(PROTOCOL); - AddModes(); - pmodule_ircd_var(myIrcd); pmodule_ircd_proto(&this->ircd_proto); pmodule_ircd_message(&this->ircd_message); + + this->AddModes(); } }; diff --git a/modules/protocol/unreal32.cpp b/modules/protocol/unreal32.cpp index 594764900..d5ee0ef2a 100644 --- a/modules/protocol/unreal32.cpp +++ b/modules/protocol/unreal32.cpp @@ -129,15 +129,11 @@ class UnrealIRCdProto : public IRCDProto void SendModeInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(source->nick, "G %s %s", dest->name.c_str(), buf.c_str()); } void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf) { - if (buf.empty()) - return; send_cmd(bi ? bi->nick : Config->ServerName, "v %s %s", u->nick.c_str(), buf.c_str()); } @@ -173,15 +169,13 @@ class UnrealIRCdProto : public IRCDProto } /* JOIN */ - void SendJoin(const BotInfo *user, const Anope::string &channel, time_t chantime) + void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status) { - send_cmd(Config->ServerName, "~ %ld %s :%s", static_cast<long>(chantime), channel.c_str(), user->nick.c_str()); - } - - void SendJoin(BotInfo *user, const ChannelContainer *cc) - { - send_cmd(Config->ServerName, "~ %ld %s :%s%s", static_cast<long>(cc->chan->creation_time), cc->chan->name.c_str(), cc->Status->BuildModePrefixList().c_str(), user->nick.c_str()); - cc->chan->SetModes(user, false, "%s", cc->chan->GetModes(true, true).c_str()); + send_cmd(Config->ServerName, "~ %ld %s :%s", static_cast<long>(c->creation_time), c->name.c_str(), user->nick.c_str()); + if (status) + for (size_t i = CMODE_BEGIN + 1; i != CMODE_END; ++i) + if (status->HasFlag(static_cast<ChannelModeName>(i))) + c->SetMode(user, static_cast<ChannelModeName>(i), user->nick, false); } /* unsqline @@ -209,16 +203,12 @@ class UnrealIRCdProto : public IRCDProto */ void SendSVSO(const Anope::string &source, const Anope::string &nick, const Anope::string &flag) { - if (source.empty() || nick.empty() || flag.empty()) - return; send_cmd(source, "BB %s %s", nick.c_str(), flag.c_str()); } /* NICK <newnick> */ void SendChangeBotNick(const BotInfo *oldnick, const Anope::string &newnick) { - if (!oldnick || newnick.empty()) - return; send_cmd(oldnick->nick, "& %s %ld", newnick.c_str(), static_cast<long>(Anope::CurTime)); } @@ -339,7 +329,7 @@ class UnrealIRCdProto : public IRCDProto ircdproto->SendMode(NickServ, u, "+d 1"); } - void SendChannel(Channel *c, const Anope::string &modes) + void SendChannel(Channel *c) { /* Unreal does not support updating a channels TS without actually joining a user, * so we will join and part us now @@ -347,13 +337,13 @@ class UnrealIRCdProto : public IRCDProto BotInfo *bi = whosends(c->ci); if (c->FindUser(bi) == NULL) { - bi->Join(c, true); + bi->Join(c); bi->Part(c); } else { bi->Part(c); - bi->Join(c, true); + bi->Join(c); } } }; @@ -374,7 +364,7 @@ class Unreal32IRCdMessage : public IRCdMessage if (params[0][0] == '#' || params[0][0] == '&') do_cmode(source, params[0], modes, server_source ? params[params.size() - 1] : ""); else - do_umode(source, params[0], modes); + do_umode(params[0], modes); return true; } @@ -828,7 +818,7 @@ bool event_umode2(const Anope::string &source, const std::vector<Anope::string> if (params.size() < 1) return true; - do_umode(source, source, params[0]); + do_umode(source, params[0]); return true; } @@ -981,43 +971,6 @@ bool ChannelModeFlood::IsValid(const Anope::string &value) const return true; } -static void AddModes() -{ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', '%')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); - /* Unreal sends +q as * and +a as ~ */ - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', '~')); - ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '*')); - - /* Add user modes */ - ModeManager::AddUserMode(new UserMode(UMODE_SERV_ADMIN, "UMODE_SERV_ADMIN", 'A')); - ModeManager::AddUserMode(new UserMode(UMODE_BOT, "UMODE_BOT", 'B')); - ModeManager::AddUserMode(new UserMode(UMODE_CO_ADMIN, "UMODE_CO_ADMIN", 'C')); - ModeManager::AddUserMode(new UserMode(UMODE_FILTER, "UMODE_FILTER", 'G')); - ModeManager::AddUserMode(new UserMode(UMODE_HIDEOPER, "UMODE_HIDEOPER", 'H')); - ModeManager::AddUserMode(new UserMode(UMODE_NETADMIN, "UMODE_NETADMIN", 'N')); - ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R')); - ModeManager::AddUserMode(new UserMode(UMODE_PROTECTED, "UMODE_PROTECTED", 'S')); - ModeManager::AddUserMode(new UserMode(UMODE_NO_CTCP, "UMODE_NO_CTCP", 'T')); - ModeManager::AddUserMode(new UserMode(UMODE_WEBTV, "UMODE_WEBTV", 'V')); - ModeManager::AddUserMode(new UserMode(UMODE_WHOIS, "UMODE_WHOIS", 'W')); - ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); - ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd')); - ModeManager::AddUserMode(new UserMode(UMODE_GLOBOPS, "UMODE_GLOBOPS", 'g')); - ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h')); - ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); - ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); - ModeManager::AddUserMode(new UserMode(UMODE_PRIV, "UMODE_PRIV", 'p')); - ModeManager::AddUserMode(new UserMode(UMODE_GOD, "UMODE_GOD", 'q')); - ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); - ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); - ModeManager::AddUserMode(new UserMode(UMODE_VHOST, "UMODE_VHOST", 't')); - ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); - ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); - ModeManager::AddUserMode(new UserMode(UMODE_SSL, "UMODE_SSL", 'z')); -} - class ProtoUnreal : public Module { Message message_away, message_join, message_kick, @@ -1035,6 +988,44 @@ class ProtoUnreal : public Module UnrealIRCdProto ircd_proto; Unreal32IRCdMessage ircd_message; + + void AddModes() + { + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', '%')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@')); + /* Unreal sends +q as * and +a as ~ */ + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', '~')); + ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '*')); + + /* Add user modes */ + ModeManager::AddUserMode(new UserMode(UMODE_SERV_ADMIN, "UMODE_SERV_ADMIN", 'A')); + ModeManager::AddUserMode(new UserMode(UMODE_BOT, "UMODE_BOT", 'B')); + ModeManager::AddUserMode(new UserMode(UMODE_CO_ADMIN, "UMODE_CO_ADMIN", 'C')); + ModeManager::AddUserMode(new UserMode(UMODE_FILTER, "UMODE_FILTER", 'G')); + ModeManager::AddUserMode(new UserMode(UMODE_HIDEOPER, "UMODE_HIDEOPER", 'H')); + ModeManager::AddUserMode(new UserMode(UMODE_NETADMIN, "UMODE_NETADMIN", 'N')); + ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R')); + ModeManager::AddUserMode(new UserMode(UMODE_PROTECTED, "UMODE_PROTECTED", 'S')); + ModeManager::AddUserMode(new UserMode(UMODE_NO_CTCP, "UMODE_NO_CTCP", 'T')); + ModeManager::AddUserMode(new UserMode(UMODE_WEBTV, "UMODE_WEBTV", 'V')); + ModeManager::AddUserMode(new UserMode(UMODE_WHOIS, "UMODE_WHOIS", 'W')); + ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a')); + ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd')); + ModeManager::AddUserMode(new UserMode(UMODE_GLOBOPS, "UMODE_GLOBOPS", 'g')); + ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h')); + ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i')); + ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o')); + ModeManager::AddUserMode(new UserMode(UMODE_PRIV, "UMODE_PRIV", 'p')); + ModeManager::AddUserMode(new UserMode(UMODE_GOD, "UMODE_GOD", 'q')); + ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r')); + ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's')); + ModeManager::AddUserMode(new UserMode(UMODE_VHOST, "UMODE_VHOST", 't')); + ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w')); + ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x')); + ModeManager::AddUserMode(new UserMode(UMODE_SSL, "UMODE_SSL", 'z')); + } + public: ProtoUnreal(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator), message_away("6", OnAway), @@ -1065,11 +1056,11 @@ class ProtoUnreal : public Module this->SetAuthor("Anope"); this->SetType(PROTOCOL); - AddModes(); - pmodule_ircd_var(myIrcd); pmodule_ircd_proto(&this->ircd_proto); pmodule_ircd_message(&this->ircd_message); + + this->AddModes(); ModuleManager::Attach(I_OnUserNickChange, this); } diff --git a/src/bots.cpp b/src/bots.cpp index 254e987a1..1f3f29009 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -175,7 +175,7 @@ void BotInfo::UnAssign(User *u, ChannelInfo *ci) ci->bi = NULL; } -void BotInfo::Join(Channel *c, bool update_ts) +void BotInfo::Join(Channel *c, ChannelStatus *status) { if (Config->BSSmartJoin) { @@ -202,35 +202,15 @@ void BotInfo::Join(Channel *c, bool update_ts) } c->JoinUser(this); - ChannelContainer *cc = this->FindChannel(c); - for (unsigned i = 0; i < Config->BotModeList.size(); ++i) - { - if (!update_ts) - { - c->SetMode(this, Config->BotModeList[i], this->nick, false); - } - else - { - cc->Status->SetFlag(Config->BotModeList[i]->Name); - c->SetModeInternal(Config->BotModeList[i], this->nick, false); - } - } - if (!update_ts) - ircdproto->SendJoin(this, c->name, c->creation_time); - /* This is sent later, when we burst to the uplink */ - else if (Me && Me->IsSynced()) - { - ircdproto->SendJoin(this, cc); - - c->Reset(); - } - FOREACH_MOD(I_OnBotJoin, OnBotJoin(c->ci, this)); + ircdproto->SendJoin(this, c, status); + + FOREACH_MOD(I_OnBotJoin, OnBotJoin(c, this)); } -void BotInfo::Join(const Anope::string &chname, bool update_ts) +void BotInfo::Join(const Anope::string &chname, ChannelStatus *status) { Channel *c = findchan(chname); - return this->Join(c ? c : new Channel(chname), update_ts); + return this->Join(c ? c : new Channel(chname), status); } void BotInfo::Part(Channel *c, const Anope::string &reason) diff --git a/src/channels.cpp b/src/channels.cpp index 72b09ae1e..c68fd3ba0 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -126,7 +126,7 @@ void Channel::JoinUser(User *user) { Log(LOG_DEBUG) << "Changing TS of " << this->name << " from " << this->creation_time << " to " << this->ci->time_registered; this->creation_time = this->ci->time_registered; - ircdproto->SendChannel(this, ""); + ircdproto->SendChannel(this); this->Reset(); } @@ -147,7 +147,7 @@ void Channel::JoinUser(User *user) * legit users - Rob **/ if (this->users.size() >= Config->BSMinUsers && !this->FindUser(this->ci->bi)) - this->ci->bi->Join(this, false); + this->ci->bi->Join(this, &Config->BotModeList); /* Only display the greet if the main uplink we're connected * to has synced, or we'll get greet-floods when the net * recovers from a netsplit. -GD @@ -444,16 +444,17 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const Anope::string ¶m, bo if (cc) cc->Status->UnsetFlag(cm->Name); - /* Reset modes on bots if we're supposed to */ - if (bi) + if (EnforceMLock) { - if (std::find(Config->BotModeList.begin(), Config->BotModeList.end(), cm) != Config->BotModeList.end()) - this->SetMode(bi, cm, bi->nick); - } + /* Reset modes on bots if we're supposed to */ + if (bi) + { + if (Config->BotModeList.HasFlag(cm->Name)) + this->SetMode(bi, cm, bi->nick); + } - /* Enforce secureops, etc */ - if (EnforceMLock) chan_set_correct_modes(u, this, 0); + } return; } @@ -726,7 +727,10 @@ void Channel::SetModesInternal(User *setter, const Anope::string &mode, bool Enf continue; cm = ModeManager::FindChannelModeByChar(m[i]); if (!cm) + { + Log(LOG_DEBUG) << "Channel::SetModeInternal: Unknown mode char " << m[i]; continue; + } modestring += cm->ModeChar; } diff --git a/src/chanserv.cpp b/src/chanserv.cpp index 64cfeeef5..de43bb91c 100644 --- a/src/chanserv.cpp +++ b/src/chanserv.cpp @@ -109,6 +109,9 @@ int levelinfo_maxwidth = 0; Anope::string get_mlock_modes(ChannelInfo *ci, int complete) { + if (!ci) + return ""; + Anope::string pos = "+", neg = "-", params; for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) diff --git a/src/commands.cpp b/src/commands.cpp index 6944ac31e..b2e3b7192 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -141,6 +141,7 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command, if (params.size() < c->MinParams) { c->OnSyntaxError(source, !params.empty() ? params[params.size() - 1] : ""); + source.DoReply(); PopLanguage(); return; } @@ -149,6 +150,7 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command, FOREACH_RESULT(I_OnPreCommand, OnPreCommand(source, c, params)); if (MOD_RESULT == EVENT_STOP) { + source.DoReply(); PopLanguage(); return; } @@ -158,16 +160,16 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command, { u->SendMessage(bi, LanguageString::ACCESS_DENIED); Log(LOG_COMMAND, "denied", bi) << "Access denied for user " << u->GetMask() << " with command " << command; + source.DoReply(); PopLanguage(); return; } CommandReturn ret = c->Execute(source, params); + if (ret == MOD_STOP) + return; - if (ret == MOD_CONT) - { - FOREACH_MOD(I_OnPostCommand, OnPostCommand(source, c, params)); - } + FOREACH_MOD(I_OnPostCommand, OnPostCommand(source, c, params)); source.DoReply(); } diff --git a/src/config.cpp b/src/config.cpp index 6bf0a522f..cc0879936 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -317,6 +317,8 @@ ServerConfig::ServerConfig() : errstr(""), config_data(), NSDefFlags(NickCoreFla } SetDefaultMLock(this); + if (ircd) + InitLogChannels(this); if (IsFile(this->NameServer)) { @@ -950,9 +952,6 @@ bool DoLogs(ServerConfig *config, const Anope::string &, const Anope::string *, bool DoneLogs(ServerConfig *config, const Anope::string &) { - if (ircd) - InitLogChannels(config); - Log() << "Loaded " << config->LogInfos.size() << " log blocks"; return true; diff --git a/src/init.cpp b/src/init.cpp index 6ee84478a..fd2a1f3b1 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -37,7 +37,7 @@ void introduce_user(const Anope::string &user) ircdproto->SendSQLine(&x); for (UChannelList::const_iterator cit = bi->chans.begin(), cit_end = bi->chans.end(); cit != cit_end; ++cit) - ircdproto->SendJoin(bi, *cit); + ircdproto->SendJoin(bi, (*cit)->chan, &Config->BotModeList); } } @@ -70,7 +70,7 @@ void introduce_user(const Anope::string &user) ircdproto->SendSQLine(&x); for (UChannelList::const_iterator cit = bi->chans.begin(), cit_end = bi->chans.end(); cit != cit_end; ++cit) - ircdproto->SendJoin(bi, *cit); + ircdproto->SendJoin(bi, (*cit)->chan, &Config->BotModeList); } } diff --git a/src/logger.cpp b/src/logger.cpp index 42bac03cb..b40fdc11d 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -27,12 +27,8 @@ void InitLogChannels(ServerConfig *config) if (target[0] == '#') { Channel *c = findchan(target); - bool created = false; if (!c) - { c = new Channel(target); - created = true; - } c->SetFlag(CH_LOGCHAN); c->SetFlag(CH_PERSIST); @@ -41,9 +37,7 @@ void InitLogChannels(ServerConfig *config) BotInfo *bi = *it; if (bi->HasFlag(BI_CORE) && !c->FindUser(bi)) - { - bi->Join(c, created); - } + bi->Join(c, &config->BotModeList); } } } diff --git a/src/modes.cpp b/src/modes.cpp index 3a79409a6..14b884896 100644 --- a/src/modes.cpp +++ b/src/modes.cpp @@ -68,36 +68,13 @@ void SetDefaultMLock(ServerConfig *config) } /* Set Bot Modes */ - config->BotModeList.clear(); + config->BotModeList.ClearFlags(); for (unsigned i = 0; i < config->BotModes.length(); ++i) { ChannelMode *cm = ModeManager::FindChannelModeByChar(config->BotModes[i]); - if (cm && cm->Type == MODE_STATUS && std::find(config->BotModeList.begin(), config->BotModeList.end(), cm) == config->BotModeList.end()) - config->BotModeList.push_back(debug_cast<ChannelModeStatus *>(cm)); - } - - /* Apply the new modes to channels */ - for (patricia_tree<BotInfo *, ci::ci_char_traits>::iterator it(BotListByNick); it.next();) - { - BotInfo *bi = *it; - - for (UChannelList::const_iterator cit = bi->chans.begin(); cit != bi->chans.end(); ++cit) - { - ChannelContainer *cc = *cit; - - if (!cc || !cc->chan) - continue; - - for (unsigned i = 0; i < config->BotModeList.size(); ++i) - { - if (cc->Status->HasFlag(config->BotModeList[i]->Name)) - continue; - - cc->Status->SetFlag(config->BotModeList[i]->Name); - cc->chan->SetModeInternal(config->BotModeList[i], bi->nick, false); - } - } + if (cm && cm->Type == MODE_STATUS) + config->BotModeList.SetFlag(cm->Name); } } diff --git a/src/protocol.cpp b/src/protocol.cpp index a035d2f22..220b33622 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -212,11 +212,6 @@ void IRCDProto::SendPong(const Anope::string &servname, const Anope::string &who send_cmd(ircd->ts6 ? Config->Numeric : Config->ServerName, "PONG %s %s", servname.c_str(), who.c_str()); } -void IRCDProto::SendJoin(BotInfo *bi, const ChannelContainer *cc) -{ - SendJoin(bi, cc->chan->name, cc->chan->creation_time); -} - void IRCDProto::SendInvite(const BotInfo *bi, const Anope::string &chan, const Anope::string &nick) { send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "INVITE %s %s", nick.c_str(), chan.c_str()); diff --git a/src/regchannel.cpp b/src/regchannel.cpp index 204745e0c..a04cb54df 100644 --- a/src/regchannel.cpp +++ b/src/regchannel.cpp @@ -568,8 +568,8 @@ void ChannelInfo::LoadMLock() if (ModeManager::FindChannelModeByName(CMODE_PERM) != NULL) { /* At this point, CMODE_PERM *must* be locked on the channel, so this is fine */ - ircdproto->SendChannel(this->c, get_mlock_modes(this, true)); - this->c->SetModesInternal(NULL, get_mlock_modes(this, true)); + ircdproto->SendChannel(this->c); + this->c->Reset(); } else { @@ -577,10 +577,10 @@ void ChannelInfo::LoadMLock() whosends(this)->Assign(NULL, this); if (this->c->FindUser(this->bi) == NULL) this->bi->Join(this->c); - } - check_modes(this->c); - this->RestoreTopic(); + check_modes(this->c); + this->RestoreTopic(); + } } } diff --git a/src/users.cpp b/src/users.cpp index fa69b928a..fa486935f 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -823,7 +823,7 @@ User *do_nick(const Anope::string &source, const Anope::string &nick, const Anop /*************************************************************************/ -void do_umode(const Anope::string &, const Anope::string &user, const Anope::string &modes) +void do_umode(const Anope::string &user, const Anope::string &modes) { User *u = finduser(user); if (!u) |