]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treesocket1.cpp
Allow support for multiple dns results per request. This is a significant change...
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treesocket1.cpp
index 0739e8152a4c925eac575aa91ef326556f9457b9..c939f2349b90469731032106011090a35fd78b07 100644 (file)
@@ -73,6 +73,7 @@ TreeSocket::TreeSocket(SpanningTreeUtilities* Util, InspIRCd* SI, int newfd, cha
        this->LinkState = WAIT_AUTH_1;
        theirchallenge.clear();
        ourchallenge.clear();
+       sentcapab = false;
        /* If we have a transport module hooked to the parent, hook the same module to this
         * socket, and set a timer waiting for handshake before we send CAPAB etc.
         */
@@ -186,6 +187,7 @@ bool TreeSocket::OnConnected()
                                        this->Instance->SNO->WriteToSnoMask('l',"Connection to \2"+myhost+"\2["+(x->HiddenFromStats ? "<hidden>" : this->GetIP())+"] using transport \2"+x->Hook+"\2");
                                }
                                this->OutboundPass = x->SendPass;
+                               sentcapab = false;
 
                                /* found who we're supposed to be connecting to, send the neccessary gubbins. */
                                if (this->GetHook())
@@ -210,6 +212,9 @@ void TreeSocket::OnError(InspSocketError e)
 {
        Link* MyLink;
 
+       if (this->LinkState == LISTENER)
+               return;
+
        switch (e)
        {
                case I_ERR_CONNECT:
@@ -328,6 +333,10 @@ std::string TreeSocket::RandString(unsigned int length)
 
 void TreeSocket::SendCapabilities()
 {
+       if (sentcapab)
+               return;
+
+       sentcapab = true;
        irc::commasepstream modulelist(MyCapabilities());
        this->WriteLine("CAPAB START");
 
@@ -405,7 +414,7 @@ void TreeSocket::SendError(const std::string &errormessage)
 {
        /* Display the error locally as well as sending it remotely */
        this->WriteLine("ERROR :"+errormessage);
-       this->Instance->SNO->WriteToSnoMask('l',"Sent \2ERROR\2 to "+this->InboundServerName+": "+errormessage);
+       this->Instance->SNO->WriteToSnoMask('l',"Sent \2ERROR\2 to "+ (this->InboundServerName.empty() ? "<unknown>" : this->InboundServerName) +": "+errormessage);
        /* One last attempt to make sure the error reaches its target */
        this->FlushWriteBuffer();
 }
@@ -670,6 +679,13 @@ bool TreeSocket::ForceMode(const std::string &source, std::deque<std::string> &p
                        return true;
        }
 
+       if (!TS)
+       {
+               Instance->Log(DEFAULT,"*** BUG? *** TS of 0 sent to FMODE. Are some services authors smoking craq, or is it 1970 again?. Dropped.");
+               Instance->SNO->WriteToSnoMask('d', "WARNING: The server %s is sending FMODE with a TS of zero. Total craq. Mode was dropped.", sourceserv.c_str());
+               return true;
+       }
+
        /* TS is equal or less: Merge the mode changes into ours and pass on.
         */
        if (TS <= ourTS)
@@ -793,6 +809,13 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p
        params[2] = ":" + params[2];
        Utils->DoOneToAllButSender(source,"FJOIN",params,source);
 
+        if (!TS)
+       {
+               Instance->Log(DEFAULT,"*** BUG? *** TS of 0 sent to FJOIN. Are some services authors smoking craq, or is it 1970 again?. Dropped.");
+               Instance->SNO->WriteToSnoMask('d', "WARNING: The server %s is sending FJOIN with a TS of zero. Total craq. Command was dropped.", source.c_str());
+               return true;
+       }
+
        /* If our TS is less than theirs, we dont accept their modes */
        if (ourTS < TS)
                apply_other_sides_modes = false;
@@ -898,6 +921,7 @@ bool TreeSocket::IntroduceClient(const std::string &source, std::deque<std::stri
 
        time_t age = ConvToInt(params[0]);
        const char* tempnick = params[1].c_str();
+       std::string empty;
 
        cmd_validation valid[] = { {"Nickname", 1, NICKMAX}, {"Hostname", 2, 64}, {"Displayed hostname", 3, 64}, {"Ident", 4, IDENTMAX}, {"GECOS", 7, MAXGECOS}, {"", 0, 0} };
 
@@ -955,11 +979,14 @@ bool TreeSocket::IntroduceClient(const std::string &source, std::deque<std::stri
 
        for (std::string::iterator v = params[5].begin(); v != params[5].end(); v++)
        {
-               _new->modes[(*v)-65] = 1;
                /* For each mode thats set, increase counter */
                ModeHandler* mh = Instance->Modes->FindMode(*v, MODETYPE_USER);
                if (mh)
+               {
+                       mh->OnModeChange(_new, _new, NULL, empty, true);
+                       _new->SetMode(*v, true);
                        mh->ChangeCount(1);
+               }
        }
 
        /* now we've done with modes processing, put the + back for remote servers */