]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
kick_channel -> chanrec::KickUser(), server_kick_channel -> chanrec::ServerKickUser()
[user/henk/code/inspircd.git] / src / users.cpp
index 0e29519d59bb4a44032255b54f9d701e905052c0..34c347cb934deac5aaa0a576a1383801fa20e7cd 100644 (file)
@@ -178,7 +178,11 @@ void UserResolver::OnLookupComplete(const std::string &result)
                        std::string hostname = this->bound_user->stored_host;
                        if (hostname.length() < 65)
                        {
-                               WriteServ(this->bound_fd, "NOTICE Auth :*** Found your hostname (%s)", this->bound_user->stored_host.c_str());
+                               /* Hostnames starting with : are not a good thing (tm) */
+                               if (*(hostname.c_str()) == ':')
+                                       hostname = "0" + hostname;
+
+                               WriteServ(this->bound_fd, "NOTICE Auth :*** Found your hostname (%s)", hostname.c_str());
                                this->bound_user->dns_done = true;
                                strlcpy(this->bound_user->dhost, hostname.c_str(),64);
                                strlcpy(this->bound_user->host, hostname.c_str(),64);
@@ -814,11 +818,6 @@ void AddClient(int socket, int port, bool iscached, insp_inaddr ip)
        _new->fd = socket;
        strlcpy(_new->nick,tempnick.c_str(),NICKMAX-1);
 
-       /* Smarter than your average bear^H^H^H^Hset of strlcpys. */
-       for (const char* temp = ipaddr; *temp && j < 64; temp++, j++)
-               _new->dhost[j] = _new->host[j] = *temp;
-       _new->dhost[j] = _new->host[j] = 0;
-
        _new->server = FindServerNamePtr(Config->ServerName);
        /* We don't need range checking here, we KNOW 'unknown\0' will fit into the ident field. */
        strcpy(_new->ident, "unknown");
@@ -831,6 +830,11 @@ void AddClient(int socket, int port, bool iscached, insp_inaddr ip)
        _new->SetSockAddr(AF_FAMILY, ipaddr, port);
        log(DEBUG,"Socket addresses set.");
 
+       /* Smarter than your average bear^H^H^H^Hset of strlcpys. */
+        for (const char* temp = _new->GetIPString(); *temp && j < 64; temp++, j++)
+               _new->dhost[j] = _new->host[j] = *temp;
+       _new->dhost[j] = _new->host[j] = 0;
+                       
        // set the registration timeout for this user
        unsigned long class_regtimeout = 90;
        int class_flood = 0;
@@ -840,7 +844,7 @@ void AddClient(int socket, int port, bool iscached, insp_inaddr ip)
 
        for (ClassVector::iterator i = Config->Classes.begin(); i != Config->Classes.end(); i++)
        {
-               if ((i->type == CC_ALLOW) && (match(ipaddr,i->host.c_str())))
+               if ((i->type == CC_ALLOW) && (match(ipaddr,i->host.c_str(),true)))
                {
                        class_regtimeout = (unsigned long)i->registration_timeout;
                        class_flood = i->flood;
@@ -904,22 +908,27 @@ void AddClient(int socket, int port, bool iscached, insp_inaddr ip)
 
        if (socket > -1)
        {
-               ServerInstance->SE->AddFd(socket,true,X_ESTAB_CLIENT);
+               if (!ServerInstance->SE->AddFd(socket,true,X_ESTAB_CLIENT))
+               {
+                       kill_link(_new, "Internal error handling connection");
+                       return;
+               }
        }
 
-       log(DEBUG,"Writing to client %d",_new->fd);
        WriteServ(_new->fd,"NOTICE Auth :*** Looking up your hostname...");
 }
 
 long FindMatchingGlobal(userrec* user)
 {
+       char u1[1024];
+       char u2[1024];
        long x = 0;
        for (user_hash::const_iterator a = clientlist.begin(); a != clientlist.end(); a++)
        {
                /* We have to match ip's as strings - we don't know what protocol
                 * a remote user may be using
                 */
-               if (!strcasecmp(a->second->GetIPString(), user->GetIPString()))
+               if (!strcasecmp(a->second->GetIPString(u1), user->GetIPString(u2)))
                                x++;
        }
        return x;
@@ -1228,3 +1237,46 @@ const char* userrec::GetIPString()
        return "";
 }
 
+const char* userrec::GetIPString(char* buf)
+{
+       static char temp[1024];
+
+       if (this->ip == NULL)
+       {
+               *buf = 0;
+               return buf;
+       }
+
+       switch (this->GetProtocolFamily())
+       {
+#ifdef SUPPORT_IP6LINKS
+               case AF_INET6:
+               {
+                       sockaddr_in6* sin = (sockaddr_in6*)this->ip;
+                       inet_ntop(sin->sin6_family, &sin->sin6_addr, buf, sizeof(buf));
+                       /* IP addresses starting with a : on irc are a Bad Thing (tm) */
+                       if (*buf == ':')
+                       {
+                               strlcpy(&temp[1], buf, sizeof(temp));
+                               *temp = '0';
+                               strlcpy(buf, temp, sizeof(temp));
+                       }
+                       return buf;
+               }
+               break;
+#endif
+               case AF_INET:
+               {
+                       sockaddr_in* sin = (sockaddr_in*)this->ip;
+                       inet_ntop(sin->sin_family, &sin->sin_addr, buf, sizeof(buf));
+                       return buf;
+               }
+               break;
+
+               default:
+                       log(DEBUG,"Ut oh, '%s' has an unknown protocol family!",this->nick);
+               break;
+       }
+       return "";
+}
+