]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Fix for bug typo, dont let it creep into the release!
[user/henk/code/inspircd.git] / src / users.cpp
index b10753b8bf28afff387f477884808903b820628e..59d19adff0dec4a77ef299b9897d2f66de0062bf 100644 (file)
@@ -210,7 +210,7 @@ void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl,
                        if (hostname.length() < 65)
                        {
                                /* Check we didnt time out */
-                               if (this->bound_user->registered != REG_ALL)
+                               if ((this->bound_user->registered != REG_ALL) && (!this->bound_user->dns_done))
                                {
                                        /* Hostnames starting with : are not a good thing (tm) */
                                        if (*(hostname.c_str()) == ':')
@@ -226,12 +226,20 @@ void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl,
                        }
                        else
                        {
-                               this->bound_user->WriteServ("NOTICE Auth :*** Your hostname is longer than the maximum of 64 characters, using your IP address (%s) instead.", this->bound_user->GetIPString());
+                               if (!this->bound_user->dns_done)
+                               {
+                                       this->bound_user->WriteServ("NOTICE Auth :*** Your hostname is longer than the maximum of 64 characters, using your IP address (%s) instead.", this->bound_user->GetIPString());
+                                       this->bound_user->dns_done = true;
+                               }
                        }
                }
                else
                {
-                       this->bound_user->WriteServ("NOTICE Auth :*** Your hostname does not match up with your IP address. Sorry, using your IP address (%s) instead.", this->bound_user->GetIPString());
+                       if (!this->bound_user->dns_done)
+                       {
+                               this->bound_user->WriteServ("NOTICE Auth :*** Your hostname does not match up with your IP address. Sorry, using your IP address (%s) instead.", this->bound_user->GetIPString());
+                               this->bound_user->dns_done = true;
+                       }
                }
        }
 }
@@ -240,9 +248,14 @@ void UserResolver::OnError(ResolverError e, const std::string &errormessage)
 {
        if (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user)
        {
-               /* Error message here */
-               this->bound_user->WriteServ("NOTICE Auth :*** Could not resolve your hostname: %s; using your IP address (%s) instead.", errormessage.c_str(), this->bound_user->GetIPString());
-               this->bound_user->dns_done = true;
+               /* Since dns timeout is implemented outside of the resolver, this was a race condition that could result in this message being sent *after*
+                * the user was fully connected. This check fixes that issue  - Special */
+               if (!this->bound_user->dns_done)
+               {
+                       /* Error message here */
+                       this->bound_user->WriteServ("NOTICE Auth :*** Could not resolve your hostname: %s; using your IP address (%s) instead.", errormessage.c_str(), this->bound_user->GetIPString());
+                       this->bound_user->dns_done = true;
+               }
        }
 }
 
@@ -325,19 +338,22 @@ userrec::userrec(InspIRCd* Instance) : ServerInstance(Instance)
        sendq = "";
        WriteError = "";
        res_forward = res_reverse = NULL;
+       Visibility = NULL;
        ip = NULL;
        chans.clear();
        invites.clear();
        memset(modes,0,sizeof(modes));
        memset(snomasks,0,sizeof(snomasks));
        /* Invalidate cache */
-       cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
+       operquit = cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
 }
 
 userrec::~userrec()
 {
        this->InvalidateCache();
        this->DecrementModes();
+       if (operquit)
+               free(operquit);
        if (ip)
        {
                clonemap::iterator x = ServerInstance->local_clones.find(this->GetIPString());
@@ -734,6 +750,11 @@ void userrec::FlushWriteBuf()
        {
                ServerInstance->Log(DEBUG,"Exception in userrec::FlushWriteBuf()");
        }
+
+       if (this->sendq.empty())
+       {
+               FOREACH_MOD(I_OnBufferFlushed,OnBufferFlushed(this));
+       }
 }
 
 void userrec::SetWriteError(const std::string &error)
@@ -984,14 +1005,14 @@ void userrec::FullConnect()
                return;
        }
 
-       if (this->LocalCloneCount() > a->GetMaxLocal())
+       if ((a->GetMaxLocal()) && (this->LocalCloneCount() > a->GetMaxLocal()))
        {
                this->muted = true;
                ServerInstance->GlobalCulls.AddItem(this, "No more connections allowed from your host via this connect class (local)");
                ServerInstance->WriteOpers("*** WARNING: maximum LOCAL connections (%ld) exceeded for IP %s", a->GetMaxLocal(), this->GetIPString());
                return;
        }
-       else if (this->GlobalCloneCount() > a->GetMaxGlobal())
+       else if ((a->GetMaxGlobal()) && (this->GlobalCloneCount() > a->GetMaxGlobal()))
        {
                this->muted = true;
                ServerInstance->GlobalCulls.AddItem(this, "No more connections allowed from your host via this connect class (global)");
@@ -1799,8 +1820,18 @@ ConnectClass* userrec::GetClass()
 {
        for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
        {
-               if ((match(this->GetIPString(),i->GetHost().c_str(),true)) || (match(this->host,i->GetHost().c_str())))
-                       return &(*i);
+               if (((match(this->GetIPString(),i->GetHost().c_str(),true)) || (match(this->host,i->GetHost().c_str()))))
+               {
+                       if (i->GetPort())
+                       {
+                               if (this->GetPort() == i->GetPort())
+                                       return &(*i);
+                               else
+                                       continue;
+                       }
+                       else
+                               return &(*i);
+               }
        }
        return NULL;
 }
@@ -1909,3 +1940,29 @@ void userrec::HandleEvent(EventType et, int errornum)
        }
 }
 
+void userrec::SetOperQuit(const std::string &oquit)
+{
+       if (operquit)
+               return;
+
+       operquit = strdup(oquit.c_str());
+}
+
+const char* userrec::GetOperQuit()
+{
+       return operquit ? operquit : "";
+}
+
+VisData::VisData()
+{
+}
+
+VisData::~VisData()
+{
+}
+
+bool VisData::VisibleTo(userrec* user)
+{
+       return true;
+}
+