]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Lower the acceptable drift for clocks on link.
[user/henk/code/inspircd.git] / src / users.cpp
index aaaa06f19293bf989469a88836ff029e43e61156..b8a2d31a83750669f7ea9f3ff006b42029d9103b 100644 (file)
@@ -105,7 +105,7 @@ 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));
@@ -121,7 +121,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 +130,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 +139,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 +148,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 +301,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 +314,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()
@@ -436,6 +441,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 +461,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 +491,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;
                }
        }