]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Deprecate Send{Channel,User}Notice; use SendMessage instead.
[user/henk/code/inspircd.git] / src / users.cpp
index 56f9f5591342e17c261579f9e3798f6985e6a9da..6c58f0617d500c52624336a4e427a2aa2cd7c6fe 100644 (file)
@@ -105,13 +105,22 @@ LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::so
        signon = ServerInstance->Time();
        // The user's default nick is their UUID
        nick = uuid;
-       ident = "unknown";
+       ident = uuid;
        eh.SetFd(myfd);
        memcpy(&client_sa, client, sizeof(irc::sockets::sockaddrs));
        memcpy(&server_sa, servaddr, sizeof(irc::sockets::sockaddrs));
        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()
 {
 }
@@ -121,7 +130,6 @@ const std::string& User::MakeHost()
        if (!this->cached_makehost.empty())
                return this->cached_makehost;
 
-       // XXX: Is there really a need to cache this?
        this->cached_makehost = ident + "@" + GetRealHost();
        return this->cached_makehost;
 }
@@ -131,7 +139,6 @@ const std::string& User::MakeHostIP()
        if (!this->cached_hostip.empty())
                return this->cached_hostip;
 
-       // XXX: Is there really a need to cache this?
        this->cached_hostip = ident + "@" + this->GetIPString();
        return this->cached_hostip;
 }
@@ -141,7 +148,6 @@ const std::string& User::GetFullHost()
        if (!this->cached_fullhost.empty())
                return this->cached_fullhost;
 
-       // XXX: Is there really a need to cache this?
        this->cached_fullhost = nick + "!" + ident + "@" + GetDisplayedHost();
        return this->cached_fullhost;
 }
@@ -151,7 +157,6 @@ const std::string& User::GetFullRealHost()
        if (!this->cached_fullrealhost.empty())
                return this->cached_fullrealhost;
 
-       // XXX: Is there really a need to cache this?
        this->cached_fullrealhost = nick + "!" + ident + "@" + GetRealHost();
        return this->cached_fullrealhost;
 }
@@ -305,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));
@@ -312,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()
@@ -368,7 +382,7 @@ void User::Oper(OperInfo* info)
        if (info->oper_block)
                opername = info->oper_block->getString("name");
 
-       ServerInstance->SNO->WriteToSnoMask('o',"%s (%s@%s) is now an IRC operator of type %s (using oper '%s')",
+       ServerInstance->SNO->WriteToSnoMask('o', "%s (%s@%s) is now a server operator of type %s (using oper '%s')",
                nick.c_str(), ident.c_str(), GetRealHost().c_str(), oper->name.c_str(), opername.c_str());
        this->WriteNumeric(RPL_YOUAREOPER, InspIRCd::Format("You are now %s %s", strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->name.c_str()));
 
@@ -436,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;
@@ -449,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);
@@ -482,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;
                }
        }
@@ -734,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)
@@ -830,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)
@@ -1174,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)
 {
 }