]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/helperfuncs.cpp
Fix configure system loading cache file too late.
[user/henk/code/inspircd.git] / src / helperfuncs.cpp
index ffa30fb840799e8f4cdc025f1cbfd8a1170a3290..3efa58bba44150c111d2e109ab5f14d6cb6f39e6 100644 (file)
@@ -1,21 +1,38 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2006-2008 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2005-2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ *   Copyright (C) 2006-2007 Oliver Lupton <oliverlupton@gmail.com>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
  *
- * This program is free but copyrighted software; see
- *         the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 /* $Core */
 
+#ifdef _WIN32
+#define _CRT_RAND_S
+#include <stdlib.h>
+#endif
+
 #include "inspircd.h"
 #include "xline.h"
 #include "exitcodes.h"
+#include <iostream>
 
 std::string InspIRCd::GetServerDescription(const std::string& servername)
 {
@@ -173,9 +190,39 @@ bool InspIRCd::IsValidMask(const std::string &mask)
        if (exclamation != 1 || atsign != 1)
                return false;
 
+       if (mask.length() > 250)
+               return false;
+
        return true;
 }
 
+void InspIRCd::StripColor(std::string &sentence)
+{
+       /* refactor this completely due to SQUIT bug since the old code would strip last char and replace with \0 --peavey */
+       int seq = 0;
+
+       for (std::string::iterator i = sentence.begin(); i != sentence.end();)
+       {
+               if (*i == 3)
+                       seq = 1;
+               else if (seq && (( ((*i >= '0') && (*i <= '9')) || (*i == ',') ) ))
+               {
+                       seq++;
+                       if ( (seq <= 4) && (*i == ',') )
+                               seq = 1;
+                       else if (seq > 3)
+                               seq = 0;
+               }
+               else
+                       seq = 0;
+
+               if (seq || ((*i == 2) || (*i == 15) || (*i == 22) || (*i == 21) || (*i == 31)))
+                       i = sentence.erase(i);
+               else
+                       ++i;
+       }
+}
+
 /* true for valid channel name, false else */
 bool IsChannelHandler::Call(const char *chname, size_t max)
 {
@@ -279,7 +326,7 @@ bool InspIRCd::OpenLog(char**, int)
        if (!Config->cmdline.writelog) return true; // Skip opening default log if -nolog
 
        if (Config->cmdline.startup_log.empty())
-               Config->cmdline.startup_log = "logs/startup.log";
+               Config->cmdline.startup_log = LOG_PATH "/startup.log";
        FILE* startup = fopen(Config->cmdline.startup_log.c_str(), "a+");
 
        if (!startup)
@@ -297,12 +344,14 @@ bool InspIRCd::OpenLog(char**, int)
 
 void InspIRCd::CheckRoot()
 {
+#ifndef _WIN32
        if (geteuid() == 0)
        {
-               printf("WARNING!!! You are running an irc server as ROOT!!! DO NOT DO THIS!!!\n\n");
-               this->Logs->Log("STARTUP",DEFAULT,"Cant start as root");
+               std::cout << "ERROR: You are running an irc server as root! DO NOT DO THIS!" << std::endl << std::endl;
+               this->Logs->Log("STARTUP",DEFAULT,"Can't start as root");
                Exit(EXIT_STATUS_ROOT);
        }
+#endif
 }
 
 void InspIRCd::SendWhoisLine(User* user, User* dest, int numeric, const std::string &text)
@@ -396,13 +445,81 @@ std::string InspIRCd::TimeString(time_t curtime)
 void InspIRCd::AddExtBanChar(char c)
 {
        std::string &tok = Config->data005;
-       std::string::size_type ebpos;
+       std::string::size_type ebpos = tok.find(" EXTBAN=,");
 
-       if ((ebpos = tok.find(" EXTBAN=,")) == std::string::npos)
+       if (ebpos == std::string::npos)
        {
                tok.append(" EXTBAN=,");
                tok.push_back(c);
        }
        else
-               tok.insert(ebpos + 9, 1, c);
+       {
+               ebpos += 9;
+               while (isalpha(tok[ebpos]) && tok[ebpos] < c)
+                       ebpos++;
+               tok.insert(ebpos, 1, c);
+       }
+}
+
+std::string InspIRCd::GenRandomStr(int length, bool printable)
+{
+       char* buf = new char[length];
+       GenRandom(buf, length);
+       std::string rv;
+       rv.resize(length);
+       for(int i=0; i < length; i++)
+               rv[i] = printable ? 0x3F + (buf[i] & 0x3F) : buf[i];
+       delete[] buf;
+       return rv;
+}
+
+// NOTE: this has a slight bias for lower values if max is not a power of 2.
+// Don't use it if that matters.
+unsigned long InspIRCd::GenRandomInt(unsigned long max)
+{
+       unsigned long rv;
+       GenRandom((char*)&rv, sizeof(rv));
+       return rv % max;
+}
+
+// This is overridden by a higher-quality algorithm when SSL support is loaded
+void GenRandomHandler::Call(char *output, size_t max)
+{
+       for(unsigned int i=0; i < max; i++)
+#ifdef _WIN32
+       {
+               unsigned int uTemp;
+               if(rand_s(&uTemp) != 0)
+                       output[i] = rand();
+               else
+                       output[i] = uTemp;
+       }
+#else
+               output[i] = random();
+#endif
+}
+
+ModResult OnCheckExemptionHandler::Call(User* user, Channel* chan, const std::string& restriction)
+{
+       unsigned int mypfx = chan->GetPrefixValue(user);
+       char minmode = 0;
+       std::string current;
+
+       irc::spacesepstream defaultstream(ServerInstance->Config->ConfValue("options")->getString("exemptchanops"));
+
+       while (defaultstream.GetToken(current))
+       {
+               std::string::size_type pos = current.find(':');
+               if (pos == std::string::npos)
+                       continue;
+               if (current.substr(0,pos) == restriction)
+                       minmode = current[pos+1];
+       }
+
+       ModeHandler* mh = ServerInstance->Modes->FindMode(minmode, MODETYPE_CHANNEL);
+       if (mh && mypfx >= mh->GetPrefixRank())
+               return MOD_RES_ALLOW;
+       if (mh || minmode == '*')
+               return MOD_RES_DENY;
+       return MOD_RES_PASSTHRU;
 }