]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Convert InspIRCd::SetSignals to a static function.
[user/henk/code/inspircd.git] / src / users.cpp
index a3807bd751fd8cac69dd3deed2824eeba31975a0..6c58f0617d500c52624336a4e427a2aa2cd7c6fe 100644 (file)
@@ -112,6 +112,15 @@ LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::so
        ChangeRealHost(GetIPString(), true);
 }
 
+LocalUser::LocalUser(int myfd, const std::string& uid, Serializable::Data& data)
+       : User(uid, ServerInstance->FakeClient->server, USERTYPE_LOCAL)
+       , eh(this)
+       , already_sent(0)
+{
+       eh.SetFd(myfd);
+       Deserialize(data);
+}
+
 User::~User()
 {
 }
@@ -301,6 +310,12 @@ void UserIOHandler::AddWriteBuf(const std::string &data)
        WriteData(data);
 }
 
+void UserIOHandler::SwapInternals(UserIOHandler& other)
+{
+       StreamSocket::SwapInternals(other);
+       std::swap(checked_until, other.checked_until);
+}
+
 bool UserIOHandler::OnSetEndPoint(const irc::sockets::sockaddrs& server, const irc::sockets::sockaddrs& client)
 {
        memcpy(&user->server_sa, &server, sizeof(irc::sockets::sockaddrs));
@@ -308,9 +323,12 @@ bool UserIOHandler::OnSetEndPoint(const irc::sockets::sockaddrs& server, const i
        return !user->quitting;
 }
 
-void UserIOHandler::OnError(BufferedSocketError)
+void UserIOHandler::OnError(BufferedSocketError sockerr)
 {
-       ServerInstance->Users->QuitUser(user, getError());
+       ModResult res;
+       FIRST_MOD_RESULT(OnConnectionFail, res, (user, sockerr));
+       if (res != MOD_RES_ALLOW)
+               ServerInstance->Users->QuitUser(user, getError());
 }
 
 CullResult User::cull()
@@ -432,6 +450,13 @@ void User::UnOper()
         */
        oper = NULL;
 
+       // Remove the user from the oper list
+       stdalgo::vector::swaperase(ServerInstance->Users->all_opers, this);
+
+       // If the user is quitting we shouldn't remove any modes as it results in
+       // mode messages being broadcast across the network.
+       if (quitting)
+               return;
 
        /* Remove all oper only modes from the user when the deoper - Bug #466*/
        Modes::ChangeList changelist;
@@ -445,9 +470,6 @@ void User::UnOper()
 
        ServerInstance->Modes->Process(this, NULL, this, changelist);
 
-       // Remove the user from the oper list
-       stdalgo::vector::swaperase(ServerInstance->Users->all_opers, this);
-
        ModeHandler* opermh = ServerInstance->Modes->FindMode('o', MODETYPE_USER);
        if (opermh)
                this->SetMode(opermh, false);
@@ -478,14 +500,20 @@ void LocalUser::CheckClass(bool clone_count)
                {
                        ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (local)");
                        if (a->maxconnwarn)
-                               ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum LOCAL connections (%ld) exceeded for IP %s", a->GetMaxLocal(), this->GetIPString().c_str());
+                       {
+                               ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum local connections for the %s class (%ld) exceeded by %s",
+                                       a->name.c_str(), a->GetMaxLocal(), this->GetIPString().c_str());
+                       }
                        return;
                }
                else if ((a->GetMaxGlobal()) && (clonecounts.global > a->GetMaxGlobal()))
                {
                        ServerInstance->Users->QuitUser(this, "No more connections allowed from your host via this connect class (global)");
                        if (a->maxconnwarn)
-                               ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum GLOBAL connections (%ld) exceeded for IP %s", a->GetMaxGlobal(), this->GetIPString().c_str());
+                       {
+                               ServerInstance->SNO->WriteToSnoMask('a', "WARNING: maximum global connections for the %s class (%ld) exceeded by %s",
+                               a->name.c_str(), a->GetMaxGlobal(), this->GetIPString().c_str());
+                       }
                        return;
                }
        }
@@ -730,17 +758,16 @@ void LocalUser::SetClientIP(const irc::sockets::sockaddrs& sa)
                return;
 
        ServerInstance->Users->RemoveCloneCounts(this);
-
        User::SetClientIP(sa);
-
-       FOREACH_MOD(OnSetUserIP, (this));
-
        ServerInstance->Users->AddClone(this);
 
        // Recheck the connect class.
        this->MyClass = NULL;
        this->SetClass();
        this->CheckClass();
+
+       if (!quitting)
+               FOREACH_MOD(OnSetUserIP, (this));
 }
 
 void LocalUser::Write(const ClientProtocol::SerializedMessage& text)
@@ -826,7 +853,7 @@ void User::WriteNumeric(const Numeric::Numeric& numeric)
 
 void User::WriteRemoteNotice(const std::string& text)
 {
-       ServerInstance->PI->SendUserNotice(this, text);
+       ServerInstance->PI->SendMessage(this, text, MSG_NOTICE);
 }
 
 void LocalUser::WriteRemoteNotice(const std::string& text)
@@ -1170,10 +1197,24 @@ 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(ServerInstance->Config->MaxChans),
-       limit(0), resolvehostnames(true)
+       : 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)
+       , resolvehostnames(true)
 {
 }