X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fhelperfuncs.cpp;h=439320c1e00d85334c29d3da845357b246d11cfa;hb=a785f350fd584d87f3b84bbaff569ecb59c29f04;hp=4605092a1e6f01b777d24435adaefd4752d07d91;hpb=c2f7fc047c2e5bbb899c820590ce07fee593b28f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index 4605092a1..439320c1e 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -24,9 +24,15 @@ /* $Core */ +#ifdef _WIN32 +#define _CRT_RAND_S +#include +#endif + #include "inspircd.h" #include "xline.h" #include "exitcodes.h" +#include std::string InspIRCd::GetServerDescription(const std::string& servername) { @@ -94,11 +100,6 @@ User* InspIRCd::FindNickOnly(const char* nick) } User *InspIRCd::FindUUID(const std::string &uid) -{ - return FindUUID(uid.c_str()); -} - -User *InspIRCd::FindUUID(const char *uid) { user_hash::iterator finduuid = this->Users->uuidlist->find(uid); @@ -108,6 +109,11 @@ User *InspIRCd::FindUUID(const char *uid) return finduuid->second; } +User *InspIRCd::FindUUID(const char *uid) +{ + return FindUUID(std::string(uid)); +} + /* find a channel record by channel name and return a pointer to it */ Channel* InspIRCd::FindChan(const char* chan) { @@ -134,7 +140,7 @@ Channel* InspIRCd::FindChan(const std::string &chan) /* Send an error notice to all users, registered or not */ void InspIRCd::SendError(const std::string &s) { - for (std::vector::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++) + for (LocalUserList::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++) { User* u = *i; if (u->registered == REG_ALL) @@ -190,6 +196,90 @@ bool InspIRCd::IsValidMask(const std::string &mask) 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; + } +} + +void InspIRCd::ProcessColors(file_cache& input) +{ + /* + * Replace all color codes from the special[] array to actual + * color code chars using C++ style escape sequences. You + * can append other chars to replace if you like -- Justasic + */ + static struct special_chars + { + std::string character; + std::string replace; + special_chars(const std::string &c, const std::string &r) : character(c), replace(r) { } + } + + special[] = { + special_chars("\\002", "\002"), // Bold + special_chars("\\037", "\037"), // underline + special_chars("\\003", "\003"), // Color + special_chars("\\017", "\017"), // Stop colors + special_chars("\\u", "\037"), // Alias for underline + special_chars("\\b", "\002"), // Alias for Bold + special_chars("\\x", "\017"), // Alias for stop + special_chars("\\c", "\003"), // Alias for color + special_chars("", "") + }; + + for(file_cache::iterator it = input.begin(), it_end = input.end(); it != it_end; it++) + { + std::string ret = *it; + for(int i = 0; special[i].character.empty() == false; ++i) + { + std::string::size_type pos = ret.find(special[i].character); + if(pos == std::string::npos) // Couldn't find the character, skip this line + continue; + + if((pos > 0) && (ret[pos-1] == '\\') && (ret[pos] == '\\')) + continue; // Skip double slashes. + + // Replace all our characters in the array + while(pos != std::string::npos) + { + ret = ret.substr(0, pos) + special[i].replace + ret.substr(pos + special[i].character.size()); + pos = ret.find(special[i].character, pos + special[i].replace.size()); + } + } + + // Replace double slashes with a single slash before we return + std::string::size_type pos = ret.find("\\\\"); + while(pos != std::string::npos) + { + ret = ret.substr(0, pos) + "\\" + ret.substr(pos + 2); + pos = ret.find("\\\\", pos + 1); + } + *it = ret; + } +} + /* true for valid channel name, false else */ bool IsChannelHandler::Call(const char *chname, size_t max) { @@ -249,8 +339,8 @@ bool IsNickHandler::Call(const char* n, size_t max) return false; } - /* too long? or not -- pointer arithmetic rocks */ - return (p < max); + /* too long? or not */ + return (p <= max); } /* return true for good ident, false else */ @@ -311,12 +401,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) @@ -403,7 +495,26 @@ bool InspIRCd::SilentULine(const std::string& sserver) std::string InspIRCd::TimeString(time_t curtime) { - return std::string(ctime(&curtime),24); +#ifdef _WIN32 + if (curtime < 0) + curtime = 0; +#endif + + struct tm* timeinfo = localtime(&curtime); + if (!timeinfo) + { + curtime = 0; + timeinfo = localtime(&curtime); + } + + // If the calculated year exceeds four digits or is less than the year 1000, + // the behavior of asctime() is undefined + if (timeinfo->tm_year + 1900 > 9999) + timeinfo->tm_year = 9999 - 1900; + else if (timeinfo->tm_year + 1900 < 1000) + timeinfo->tm_year = 0; + + return std::string(asctime(timeinfo),24); } // You should only pass a single character to this. @@ -451,7 +562,17 @@ unsigned long InspIRCd::GenRandomInt(unsigned long max) 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)