]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
ISupportManager: Tidy-up, expand comments
[user/henk/code/inspircd.git] / src / users.cpp
index 899ccecc6140ccb446f1e4084fdd632febdeffcd..49c5c5e42e32ff8d49f30985149e4a4dd3bb36ea 100644 (file)
@@ -108,26 +108,6 @@ std::string User::ProcessNoticeMasks(const char *sm)
        return output;
 }
 
-void LocalUser::StartDNSLookup()
-{
-       try
-       {
-               bool cached = false;
-               UserResolver *res_reverse;
-
-               QueryType resolvtype = this->client_sa.sa.sa_family == AF_INET6 ? DNS_QUERY_PTR6 : DNS_QUERY_PTR4;
-               res_reverse = new UserResolver(this, this->GetIPString(), resolvtype, cached);
-
-               ServerInstance->AddResolver(res_reverse, cached);
-       }
-       catch (CoreException& e)
-       {
-               ServerInstance->Logs->Log("USERS", LOG_DEBUG,"Error in resolver: %s",e.GetReason());
-               dns_done = true;
-               ServerInstance->stats->statsDnsBad++;
-       }
-}
-
 bool User::IsNoticeMaskSet(unsigned char sm)
 {
        if (!isalpha(sm))
@@ -173,15 +153,15 @@ void User::SetMode(unsigned char m, bool value)
 
 const char* User::FormatModes(bool showparameters)
 {
-       static char data[MAXBUF];
+       static std::string data;
        std::string params;
-       int offset = 0;
+       data.clear();
 
        for (unsigned char n = 0; n < 64; n++)
        {
                if (modes[n])
                {
-                       data[offset++] = n + 65;
+                       data.push_back(n + 65);
                        ModeHandler* mh = ServerInstance->Modes->FindMode(n + 65, MODETYPE_USER);
                        if (showparameters && mh && mh->GetNumParams(true))
                        {
@@ -191,9 +171,8 @@ const char* User::FormatModes(bool showparameters)
                        }
                }
        }
-       data[offset] = 0;
-       strlcat(data, params.c_str(), MAXBUF);
-       return data;
+       data += params;
+       return data.c_str();
 }
 
 User::User(const std::string &uid, const std::string& sid, int type)
@@ -220,7 +199,7 @@ LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::so
        bytes_in(0), bytes_out(0), cmds_in(0), cmds_out(0), nping(0), CommandFloodPenalty(0),
        already_sent(0)
 {
-       exempt = quitting_sendq = dns_done = false;
+       exempt = quitting_sendq = false;
        idle_lastmsg = 0;
        ident = "unknown";
        lastping = 0;
@@ -408,7 +387,7 @@ bool LocalUser::HasPrivPermission(const std::string &privstr, bool noisy)
        if (!this->IsOper())
        {
                if (noisy)
-                       this->WriteServ("NOTICE %s :You are not an oper", this->nick.c_str());
+                       this->WriteNotice("You are not an oper");
                return false;
        }
 
@@ -422,7 +401,8 @@ bool LocalUser::HasPrivPermission(const std::string &privstr, bool noisy)
        }
 
        if (noisy)
-               this->WriteServ("NOTICE %s :Oper type %s does not have access to priv %s", this->nick.c_str(), oper->NameStr(), privstr.c_str());
+               this->WriteNotice("Oper type " + oper->name + " does not have access to priv " + privstr);
+
        return false;
 }
 
@@ -436,6 +416,7 @@ void UserIOHandler::OnDataReady()
                ServerInstance->Users->QuitUser(user, "RecvQ exceeded");
                ServerInstance->SNO->WriteToSnoMask('a', "User %s RecvQ of %lu exceeds connect class maximum of %lu",
                        user->nick.c_str(), (unsigned long)recvq.length(), user->MyClass->GetRecvqMax());
+               return;
        }
        unsigned long sendqmax = ULONG_MAX;
        if (!user->HasPrivPermission("users/flood/increased-buffers"))
@@ -526,6 +507,8 @@ CullResult LocalUser::cull()
        // is only a precaution currently.
        if (localuseriter != ServerInstance->Users->local_users.end())
                ServerInstance->Users->local_users.erase(localuseriter);
+       else
+               ServerInstance->Logs->Log("USERS", LOG_DEFAULT, "ERROR: LocalUserIter does not point to a valid entry for " + this->nick);
 
        ClearInvites();
        eh.cull();
@@ -567,10 +550,10 @@ void User::Oper(OperInfo* info)
        }
 
        ServerInstance->SNO->WriteToSnoMask('o',"%s (%s@%s) is now an IRC operator of type %s (using oper '%s')",
-               nick.c_str(), ident.c_str(), host.c_str(), oper->NameStr(), opername.c_str());
-       this->WriteNumeric(381, "%s :You are now %s %s", nick.c_str(), strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->NameStr());
+               nick.c_str(), ident.c_str(), host.c_str(), oper->name.c_str(), opername.c_str());
+       this->WriteNumeric(381, "%s :You are now %s %s", nick.c_str(), strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->name.c_str());
 
-       ServerInstance->Logs->Log("OPER", LOG_DEFAULT, "%s opered as type: %s", GetFullRealHost().c_str(), oper->NameStr());
+       ServerInstance->Logs->Log("OPER", LOG_DEFAULT, "%s opered as type: %s", GetFullRealHost().c_str(), oper->name.c_str());
        ServerInstance->Users->all_opers.push_back(this);
 
        // Expand permissions from config for faster lookup
@@ -748,10 +731,8 @@ void LocalUser::FullConnect()
        this->WriteNumeric(RPL_YOURHOSTIS, "%s :Your host is %s, running version %s",this->nick.c_str(),ServerInstance->Config->ServerName.c_str(),BRANCH);
        this->WriteNumeric(RPL_SERVERCREATED, "%s :This server was created %s %s", this->nick.c_str(), __TIME__, __DATE__);
 
-       std::string umlist = ServerInstance->Modes->UserModeList();
-       std::string cmlist = ServerInstance->Modes->ChannelModeList();
-       std::string pmlist = ServerInstance->Modes->ParaModeList();
-       this->WriteNumeric(RPL_SERVERVERSION, "%s %s %s %s %s %s", this->nick.c_str(), ServerInstance->Config->ServerName.c_str(), BRANCH, umlist.c_str(), cmlist.c_str(), pmlist.c_str());
+       const std::string& modelist = ServerInstance->Modes->GetModeListFor004Numeric();
+       this->WriteNumeric(RPL_SERVERVERSION, "%s %s %s %s", this->nick.c_str(), ServerInstance->Config->ServerName.c_str(), BRANCH, modelist.c_str());
 
        ServerInstance->ISupport.SendTo(this);
        this->WriteNumeric(RPL_YOURUUID, "%s %s :your unique ID", this->nick.c_str(), this->uuid.c_str());
@@ -806,19 +787,24 @@ void User::InvalidateCache()
 
 bool User::ChangeNick(const std::string& newnick, bool force)
 {
-       ModResult MOD_RESULT;
-
-       if (force)
-               ServerInstance->NICKForced.set(this, 1);
-       FIRST_MOD_RESULT(OnUserPreNick, MOD_RESULT, (this, newnick));
-       ServerInstance->NICKForced.set(this, 0);
-
-       if (MOD_RESULT == MOD_RES_DENY)
+       if (quitting)
        {
-               ServerInstance->stats->statsCollisions++;
+               ServerInstance->Logs->Log("USERS", LOG_DEFAULT, "ERROR: Attempted to change nick of a quitting user: " + this->nick);
                return false;
        }
 
+       if (!force)
+       {
+               ModResult MOD_RESULT;
+               FIRST_MOD_RESULT(OnUserPreNick, MOD_RESULT, (this, newnick));
+
+               if (MOD_RESULT == MOD_RES_DENY)
+               {
+                       ServerInstance->stats->statsCollisions++;
+                       return false;
+               }
+       }
+
        if (assign(newnick) == assign(nick))
        {
                // case change, don't need to check Q:lines and such
@@ -1028,14 +1014,9 @@ void LocalUser::Write(const std::string& text)
  */
 void LocalUser::Write(const char *text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->Write(std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->Write(textbuffer);
 }
 
 void User::WriteServ(const std::string& text)
@@ -1048,27 +1029,21 @@ void User::WriteServ(const std::string& text)
  */
 void User::WriteServ(const char* text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteServ(std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->WriteServ(textbuffer);
 }
 
+void User::WriteNotice(const std::string& text)
+{
+       this->WriteServ("NOTICE " + (this->registered == REG_ALL ? this->nick : "*") + " :" + text);
+}
 
 void User::WriteNumeric(unsigned int numeric, const char* text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteNumeric(numeric, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->WriteNumeric(numeric, textbuffer);
 }
 
 void User::WriteNumeric(unsigned int numeric, const std::string &text)
@@ -1087,11 +1062,8 @@ void User::WriteNumeric(unsigned int numeric, const std::string &text)
 
 void User::WriteFrom(User *user, const std::string &text)
 {
-       char tb[MAXBUF];
-
-       snprintf(tb,MAXBUF,":%s %s",user->GetFullHost().c_str(),text.c_str());
-
-       this->Write(std::string(tb));
+       const std::string message = ":" + user->GetFullHost() + " " + text;
+       this->Write(message);
 }
 
 
@@ -1099,14 +1071,9 @@ void User::WriteFrom(User *user, const std::string &text)
 
 void User::WriteFrom(User *user, const char* text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteFrom(user, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->WriteFrom(user, textbuffer);
 }
 
 
@@ -1114,14 +1081,9 @@ void User::WriteFrom(User *user, const char* text, ...)
 
 void User::WriteTo(User *dest, const char *data, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-
-       va_start(argsPtr, data);
-       vsnprintf(textbuffer, MAXBUF, data, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteTo(dest, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, data, data);
+       this->WriteTo(dest, textbuffer);
 }
 
 void User::WriteTo(User *dest, const std::string &data)
@@ -1131,36 +1093,24 @@ void User::WriteTo(User *dest, const std::string &data)
 
 void User::WriteCommon(const char* text, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-
        if (this->registered != REG_ALL || quitting)
                return;
 
-       int len = snprintf(textbuffer,MAXBUF,":%s ",this->GetFullHost().c_str());
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer + len, MAXBUF - len, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteCommonRaw(std::string(textbuffer), true);
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       textbuffer = ":" + this->GetFullHost() + " " + textbuffer;
+       this->WriteCommonRaw(textbuffer, true);
 }
 
 void User::WriteCommonExcept(const char* text, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-
        if (this->registered != REG_ALL || quitting)
                return;
 
-       int len = snprintf(textbuffer,MAXBUF,":%s ",this->GetFullHost().c_str());
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer + len, MAXBUF - len, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteCommonRaw(std::string(textbuffer), false);
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       textbuffer = ":" + this->GetFullHost() + " " + textbuffer;
+       this->WriteCommonRaw(textbuffer, false);
 }
 
 void User::WriteCommonRaw(const std::string &line, bool include_self)
@@ -1205,18 +1155,13 @@ void User::WriteCommonRaw(const std::string &line, bool include_self)
 
 void User::WriteCommonQuit(const std::string &normal_text, const std::string &oper_text)
 {
-       char tb1[MAXBUF];
-       char tb2[MAXBUF];
-
        if (this->registered != REG_ALL)
                return;
 
        already_sent_t uniq_id = ++LocalUser::already_sent_id;
 
-       snprintf(tb1,MAXBUF,":%s QUIT :%s",this->GetFullHost().c_str(),normal_text.c_str());
-       snprintf(tb2,MAXBUF,":%s QUIT :%s",this->GetFullHost().c_str(),oper_text.c_str());
-       std::string out1 = tb1;
-       std::string out2 = tb2;
+       const std::string normalMessage = ":" + this->GetFullHost() + " QUIT :" + normal_text;
+       const std::string operMessage = ":" + this->GetFullHost() + " QUIT :" + oper_text;
 
        UserChanList include_c(chans);
        std::map<User*,bool> exceptions;
@@ -1230,7 +1175,7 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op
                {
                        u->already_sent = uniq_id;
                        if (i->second)
-                               u->Write(u->IsOper() ? out2 : out1);
+                               u->Write(u->IsOper() ? operMessage : normalMessage);
                }
        }
        for (UCListIter v = include_c.begin(); v != include_c.end(); ++v)
@@ -1242,7 +1187,7 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op
                        if (u && !u->quitting && (u->already_sent != uniq_id))
                        {
                                u->already_sent = uniq_id;
-                               u->Write(u->IsOper() ? out2 : out1);
+                               u->Write(u->IsOper() ? operMessage : normalMessage);
                        }
                }
        }
@@ -1264,14 +1209,9 @@ void FakeUser::SendText(const std::string& line)
 
 void User::SendText(const char *text, ...)
 {
-       va_list argsPtr;
-       char line[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(line, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       SendText(std::string(line));
+       std::string line;
+       VAFORMAT(line, text, text);
+       SendText(line);
 }
 
 void User::SendText(const std::string &LinePrefix, std::stringstream &TextStream)
@@ -1347,8 +1287,6 @@ bool User::ChangeName(const char* gecos)
 
 void User::DoHostCycle(const std::string &quitline)
 {
-       char buffer[MAXBUF];
-
        if (!ServerInstance->Config->CycleHosts)
                return;
 
@@ -1379,18 +1317,17 @@ void User::DoHostCycle(const std::string &quitline)
        for (UCListIter v = include_c.begin(); v != include_c.end(); ++v)
        {
                Channel* c = *v;
-               snprintf(buffer, MAXBUF, ":%s JOIN %s", GetFullHost().c_str(), c->name.c_str());
-               std::string joinline(buffer);
                Membership* memb = c->GetUser(this);
-               std::string modeline = memb->modes;
-               if (modeline.length() > 0)
+               const std::string joinline = ":" + GetFullHost() + " JOIN " + c->name;
+               std::string modeline;
+
+               if (!memb->modes.empty())
                {
-                       for(unsigned int i=0; i < memb->modes.length(); i++)
+                       modeline = ":" + (ServerInstance->Config->CycleHostsFromUser ? GetFullHost() : ServerInstance->Config->ServerName)
+                               + " MODE " + c->name + " +" + memb->modes;
+
+                       for (size_t i = 0; i < memb->modes.length(); i++)
                                modeline.append(" ").append(nick);
-                       snprintf(buffer, MAXBUF, ":%s MODE %s +%s",
-                               ServerInstance->Config->CycleHostsFromUser ? GetFullHost().c_str() : ServerInstance->Config->ServerName.c_str(),
-                               c->name.c_str(), modeline.c_str());
-                       modeline = buffer;
                }
 
                const UserMembList *ulist = c->GetUsers();
@@ -1408,7 +1345,7 @@ void User::DoHostCycle(const std::string &quitline)
                                u->already_sent = seen_id;
                        }
                        u->Write(joinline);
-                       if (modeline.length() > 0)
+                       if (!memb->modes.empty())
                                u->Write(modeline);
                }
        }
@@ -1464,21 +1401,14 @@ bool User::ChangeIdent(const char* newident)
 
 void User::SendAll(const char* command, const char* text, ...)
 {
-       char textbuffer[MAXBUF];
-       char formatbuffer[MAXBUF];
-       va_list argsPtr;
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       snprintf(formatbuffer,MAXBUF,":%s %s $* :%s", this->GetFullHost().c_str(), command, textbuffer);
-       std::string fmt = formatbuffer;
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       const std::string message = ":" + this->GetFullHost() + " " + command + " $* :" + textbuffer;
 
        for (LocalUserList::const_iterator i = ServerInstance->Users->local_users.begin(); i != ServerInstance->Users->local_users.end(); i++)
        {
                if ((*i)->registered == REG_ALL)
-                       (*i)->Write(fmt);
+                       (*i)->Write(message);
        }
 }
 
@@ -1630,7 +1560,8 @@ const std::string& FakeUser::GetFullRealHost()
 ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask)
        : config(tag), type(t), fakelag(true), name("unnamed"), registration_timeout(0), host(mask),
        pingtime(0), softsendqmax(0), hardsendqmax(0), recvqmax(0),
-       penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxconnwarn(true), maxchans(0), limit(0)
+       penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxconnwarn(true), maxchans(0),
+       limit(0), nouserdns(false)
 {
 }
 
@@ -1640,7 +1571,7 @@ ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask, cons
        softsendqmax(parent.softsendqmax), hardsendqmax(parent.hardsendqmax), recvqmax(parent.recvqmax),
        penaltythreshold(parent.penaltythreshold), commandrate(parent.commandrate),
        maxlocal(parent.maxlocal), maxglobal(parent.maxglobal), maxconnwarn(parent.maxconnwarn), maxchans(parent.maxchans),
-       limit(parent.limit)
+       limit(parent.limit), nouserdns(parent.nouserdns)
 {
 }
 
@@ -1663,4 +1594,5 @@ void ConnectClass::Update(const ConnectClass* src)
        maxconnwarn = src->maxconnwarn;
        maxchans = src->maxchans;
        limit = src->limit;
+       nouserdns = src->nouserdns;
 }