]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configreader.cpp
Fix user->host not being assigned correctly for new connections
[user/henk/code/inspircd.git] / src / configreader.cpp
index 29dff39caafc32176e3c24d4bb825740096af82b..e184353160270898964ac22f8b3409820ae36865 100644 (file)
@@ -36,7 +36,7 @@ bool DoneELine(ServerConfig* conf, const char* tag);
 ServerConfig::ServerConfig(InspIRCd* Instance) : ServerInstance(Instance)
 {
        this->ClearStack();
-       *ServerName = *Network = *ServerDesc = *AdminName = '\0';
+       *sid = *ServerName = *Network = *ServerDesc = *AdminName = '\0';
        *HideWhoisServer = *AdminEmail = *AdminNick = *diepass = *restartpass = *FixedQuit = *HideKillsServer = '\0';
        *DefaultModes = *CustomVersion = *motd = *rules = *PrefixQuit = *DieValue = *DNSServer = '\0';
        *UserStats = *ModPath = *MyExecutable = *DisabledCommands = *PID = *SuffixQuit = '\0';
@@ -125,7 +125,7 @@ void ServerConfig::Update005()
 void ServerConfig::Send005(User* user)
 {
        for (std::vector<std::string>::iterator line = ServerInstance->Config->isupport.begin(); line != ServerInstance->Config->isupport.end(); line++)
-               user->WriteNumeric(005, "%s %s", user->nick, line->c_str());
+               user->WriteNumeric(005, "%s %s", user->nick.c_str(), line->c_str());
 }
 
 bool ServerConfig::CheckOnce(const char* tag, ConfigDataHash &newconf)
@@ -524,7 +524,12 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*)
        for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item)
        {
                ConnectClass* cc = *item;
-               if ((*name && (cc->GetName() == name)) || (*allow && (cc->GetHost() == allow)) || (*deny && (cc->GetHost() == deny)))
+               if (
+                        ((*name && (cc->GetName() == name)) || // if the name is the same
+                        (*allow && (cc->GetHost() == allow)) || // or the allow is the same
+                        (*deny && (cc->GetHost() == deny))) && // or the deny is the same
+                        (!port || port && (cc->GetPort() == port)) // and there is no port, or there is a port and the port is the same
+                  )
                {
                        /* reenable class so users can be shoved into it :P */
                        cc->SetDisabled(false);
@@ -726,11 +731,11 @@ void ServerConfig::ReportConfigError(const std::string &errormessage, bool bail,
                /* ":ServerInstance->Config->ServerName NOTICE user->nick :" */
                if (user)
                {
-                       prefixlen = strlen(this->ServerName) + strlen(user->nick) + 11;
-                       user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick);
+                       prefixlen = strlen(this->ServerName) + user->nick.length() + 11;
+                       user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick.c_str());
                        while (start < errors.length())
                        {
-                               user->WriteServ("NOTICE %s :%s",user->nick, errors.substr(start, 510 - prefixlen).c_str());
+                               user->WriteServ("NOTICE %s :%s",user->nick.c_str(), errors.substr(start, 510 - prefixlen).c_str());
                                start += 510 - prefixlen;
                        }
                }
@@ -956,7 +961,7 @@ void ServerConfig::Read(bool bail, User* user)
 
                /* Read the values of all the tags which occur once or not at all, and call their callbacks.
                 */
-               for (int Index = 0; Values[Index].tag; Index++)
+               for (int Index = 0; Values[Index].tag; ++Index)
                {
                        char item[MAXBUF];
                        int dt = Values[Index].datatype;
@@ -992,7 +997,6 @@ void ServerConfig::Read(bool bail, User* user)
                                        ValueContainerChar* vcc = (ValueContainerChar*)Values[Index].val;
                                        this->ValidateHostname(vi.GetString(), Values[Index].tag, Values[Index].value);
                                        vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1);
-                                       ServerInstance->Logs->Log("CONFIG",DEFAULT,"Got %s", vi.GetString());
                                }
                                break;
                                case DT_IPADDRESS:
@@ -1047,7 +1051,7 @@ void ServerConfig::Read(bool bail, User* user)
                 * and call the callbacks associated with them. We have three
                 * callbacks for these, a 'start', 'item' and 'end' callback.
                 */
-               for (int Index = 0; MultiValues[Index].tag; Index++)
+               for (int Index = 0; MultiValues[Index].tag; ++Index)
                {
                        ServerInstance->Threads->Mutex(true);
                        MultiValues[Index].init_function(this, MultiValues[Index].tag);
@@ -1055,10 +1059,10 @@ void ServerConfig::Read(bool bail, User* user)
 
                        int number_of_tags = ConfValueEnum(newconfig, MultiValues[Index].tag);
 
-                       for (int tagnum = 0; tagnum < number_of_tags; tagnum++)
+                       for (int tagnum = 0; tagnum < number_of_tags; ++tagnum)
                        {
                                ValueList vl;
-                               for (int valuenum = 0; MultiValues[Index].items[valuenum]; valuenum++)
+                               for (int valuenum = 0; (MultiValues[Index].items[valuenum]) && (valuenum < MAX_VALUES_PER_TAG); ++valuenum)
                                {
                                        int dt = MultiValues[Index].datatype[valuenum];
                                        bool allow_newlines =  ((dt & DT_ALLOW_NEWLINE) > 0);
@@ -1187,7 +1191,7 @@ void ServerConfig::Read(bool bail, User* user)
                        if (!foundclass)
                        {
                                if (user)
-                                       user->WriteServ("NOTICE %s :*** Warning: Oper type '%s' has a missing class named '%s', this does nothing!", user->nick, item, classname.c_str());
+                                       user->WriteServ("NOTICE %s :*** Warning: Oper type '%s' has a missing class named '%s', this does nothing!", user->nick.c_str(), item, classname.c_str());
                                else
                                {
                                        if (bail)
@@ -1224,12 +1228,12 @@ void ServerConfig::Read(bool bail, User* user)
                if (pl.size() && user)
                {
                        ServerInstance->Threads->Mutex(true);
-                       user->WriteServ("NOTICE %s :*** Not all your client ports could be bound.", user->nick);
-                       user->WriteServ("NOTICE %s :*** The following port(s) failed to bind:", user->nick);
+                       user->WriteServ("NOTICE %s :*** Not all your client ports could be bound.", user->nick.c_str());
+                       user->WriteServ("NOTICE %s :*** The following port(s) failed to bind:", user->nick.c_str());
                        int j = 1;
                        for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
                        {
-                               user->WriteServ("NOTICE %s :*** %d.   IP: %s     Port: %lu", user->nick, j, i->first.empty() ? "<all>" : i->first.c_str(), (unsigned long)i->second);
+                               user->WriteServ("NOTICE %s :*** %d.   IP: %s     Port: %lu", user->nick.c_str(), j, i->first.empty() ? "<all>" : i->first.c_str(), (unsigned long)i->second);
                        }
                        ServerInstance->Threads->Mutex(false);
                }
@@ -1244,14 +1248,14 @@ void ServerConfig::Read(bool bail, User* user)
                                        ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH UNLOADED MODULE: %s",removing->c_str());
 
                                        if (user)
-                                               user->WriteNumeric(973, "%s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str());
+                                               user->WriteNumeric(973, "%s %s :Module %s successfully unloaded.",user->nick.c_str(), removing->c_str(), removing->c_str());
 
                                        rem++;
                                }
                                else
                                {
                                        if (user)
-                                               user->WriteNumeric(972, "%s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError().c_str());
+                                               user->WriteNumeric(972, "%s %s :Failed to unload module %s: %s",user->nick.c_str(), removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError().c_str());
                                }
                        }
                }
@@ -1265,14 +1269,14 @@ void ServerConfig::Read(bool bail, User* user)
                                        ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH LOADED MODULE: %s",adding->c_str());
 
                                        if (user)
-                                               user->WriteNumeric(975, "%s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str());
+                                               user->WriteNumeric(975, "%s %s :Module %s successfully loaded.",user->nick.c_str(), adding->c_str(), adding->c_str());
 
                                        add++;
                                }
                                else
                                {
                                        if (user)
-                                               user->WriteNumeric(974, "%s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str());
+                                               user->WriteNumeric(974, "%s %s :Failed to load module %s: %s",user->nick.c_str(), adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str());
                                }
                        }
                }
@@ -1289,7 +1293,7 @@ void ServerConfig::Read(bool bail, User* user)
        ServerInstance->Threads->Mutex(false);
 
        if (user)
-               user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick);
+               user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick.c_str());
        else
                ServerInstance->SNO->WriteToSnoMask('A', "*** Successfully rehashed server.");
 
@@ -1333,9 +1337,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, FILE* &conf, const char* fil
        include_stack.push_back(filename);
 
        /* Start reading characters... */
-       while (!feof(conf))
+       while ((ch = fgetc(conf)) != EOF)
        {
-               ch = fgetc(conf);
                /*
                 * Fix for moronic windows issue spotted by Adremelech.
                 * Some windows editors save text files as utf-16, which is
@@ -1650,6 +1653,11 @@ bool ServerConfig::DoPipe(ConfigDataHash &target, const std::string &file, std::
        return ret;
 }
 
+bool ServerConfig::StartsWithWindowsDriveLetter(const std::string &path)
+{
+       return (path.length() > 2 && isalpha(path[0]) && path[1] == ':');
+}
+
 bool ServerConfig::DoInclude(ConfigDataHash &target, const std::string &file, std::ostringstream &errorstream)
 {
        std::string confpath;
@@ -1662,7 +1670,7 @@ bool ServerConfig::DoInclude(ConfigDataHash &target, const std::string &file, st
        std::replace(newfile.begin(),newfile.end(),'\\','/');
        std::replace(confpath.begin(),confpath.end(),'\\','/');
 
-       if ((newfile[0] != '/') && (newfile.find("://") == std::string::npos))
+       if ((newfile[0] != '/') && (!StartsWithWindowsDriveLetter(newfile)))
        {
                if((pos = confpath.rfind("/")) != std::string::npos)
                {
@@ -1884,17 +1892,19 @@ bool ServerConfig::ReadFile(file_cache &F, const char* fname)
 
        F.clear();
 
-       if ((*fname != '/') && (*fname != '\\'))
+       if ((*fname != '/') && (*fname != '\\') && (!StartsWithWindowsDriveLetter(fname)))
        {
                std::string::size_type pos;
                std::string confpath = ServerInstance->ConfigFileName;
                std::string newfile = fname;
 
-               if ((pos = confpath.rfind("/")) != std::string::npos)
+               if (((pos = confpath.rfind("/"))) != std::string::npos)
                        newfile = confpath.substr(0, pos) + std::string("/") + fname;
-               else if ((pos = confpath.rfind("\\")) != std::string::npos)
+               else if (((pos = confpath.rfind("\\"))) != std::string::npos)
                        newfile = confpath.substr(0, pos) + std::string("\\") + fname;
 
+               ServerInstance->Logs->Log("config", DEBUG, "Filename: %s", newfile.c_str());
+
                if (!FileExists(newfile.c_str()))
                        return false;
                file =  fopen(newfile.c_str(), "r");
@@ -1915,10 +1925,7 @@ bool ServerConfig::ReadFile(file_cache &F, const char* fname)
                        else
                                *linebuf = 0;
 
-                       if (!feof(file))
-                       {
-                               F.push_back(*linebuf ? linebuf : " ");
-                       }
+                       F.push_back(*linebuf ? linebuf : " ");
                }
 
                fclose(file);
@@ -1960,7 +1967,7 @@ bool ServerConfig::DirValid(const char* dirandfile)
 {
 #ifdef WINDOWS
        return true;
-#endif
+#else
 
        char work[1024];
        char buffer[1024];
@@ -2011,6 +2018,7 @@ bool ServerConfig::DirValid(const char* dirandfile)
        {
                return false;
        }
+#endif
 }
 
 std::string ServerConfig::GetFullProgDir()