X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fhelperfuncs.cpp;h=800d147ebf8e4989b22bbe11b1631c7effd2499e;hb=e2b0f3dc9ef4d56c71d7abda13e6139ca092e387;hp=8ced78ae8ac720d880f14d34cdba42da5144ddc7;hpb=124c17e14134a4999afc1a5e981ab7c75b3694b9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index 8ced78ae8..800d147eb 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -1,12 +1,18 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2019-2020 Matt Schatz + * Copyright (C) 2018 linuxdaemon + * Copyright (C) 2013 Daniel Vassdal + * Copyright (C) 2013 Adam + * Copyright (C) 2012-2015 Attila Molnar + * Copyright (C) 2012-2014, 2017-2018, 2020 Sadie Powell + * Copyright (C) 2012, 2018 Robby + * Copyright (C) 2012 ChrisTX * Copyright (C) 2009-2010 Daniel De Graaf - * Copyright (C) 2006-2008 Robin Burchell - * Copyright (C) 2005-2008 Craig Edwards - * Copyright (C) 2008 Thomas Stagner - * Copyright (C) 2006-2007 Oliver Lupton * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2006-2008 Robin Burchell + * Copyright (C) 2005, 2007, 2010 Craig Edwards * * 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 @@ -29,8 +35,6 @@ #include "inspircd.h" #include "xline.h" -#include "exitcodes.h" -#include /* Find a user record by nickname and return a pointer to it */ User* InspIRCd::FindNick(const std::string &nick) @@ -156,10 +160,11 @@ void InspIRCd::ProcessColors(file_cache& input) special_chars("\\c", "\x03"), // Color special_chars("\\i", "\x1D"), // Italic special_chars("\\m", "\x11"), // Monospace + special_chars("\\r", "\x16"), // Reverse special_chars("\\s", "\x1E"), // Strikethrough special_chars("\\u", "\x1F"), // Underline special_chars("\\x", "\x0F"), // Reset - special_chars("\\", "") + special_chars("", "") }; for(file_cache::iterator it = input.begin(), it_end = input.end(); it != it_end; it++) @@ -336,59 +341,114 @@ bool InspIRCd::IsSID(const std::string &str) ((str[2] >= 'A' && str[2] <= 'Z') || isdigit(str[2]))); } -void InspIRCd::CheckRoot() -{ -#ifndef _WIN32 - if (geteuid() == 0) - { - std::cout << "ERROR: You are running an irc server as root! DO NOT DO THIS!" << std::endl << std::endl; - this->Logs->Log("STARTUP", LOG_DEFAULT, "Can't start as root"); - Exit(EXIT_STATUS_ROOT); - } -#endif -} - -/** Refactored by Brain, Jun 2009. Much faster with some clever O(1) array - * lookups and pointer maths. +/** A lookup table of values for multiplier characters used by + * InspIRCd::Duration(). In this lookup table, the indexes for + * the ascii values 'm' and 'M' have the value '60', the indexes + * for the ascii values 'D' and 'd' have a value of '86400', etc. */ -unsigned long InspIRCd::Duration(const std::string &str) +static const unsigned int duration_multi[] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86400, 0, 0, 0, 3600, 0, 0, 0, 0, 60, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 604800, 0, 31557600, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86400, 0, 0, 0, 3600, 0, 0, 0, 0, 60, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 604800, 0, 31557600, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +bool InspIRCd::Duration(const std::string& str, unsigned long& duration) { - unsigned char multiplier = 0; - long total = 0; - long times = 1; - long subtotal = 0; + unsigned long total = 0; + unsigned long subtotal = 0; /* Iterate each item in the string, looking for number or multiplier */ - for (std::string::const_reverse_iterator i = str.rbegin(); i != str.rend(); ++i) + for (std::string::const_iterator i = str.begin(); i != str.end(); ++i) { /* Found a number, queue it onto the current number */ if ((*i >= '0') && (*i <= '9')) { - subtotal = subtotal + ((*i - '0') * times); - times = times * 10; + subtotal = (subtotal * 10) + (*i - '0'); } else { - /* Found something thats not a number, find out how much + /* Found something that's not a number, find out how much * it multiplies the built up number by, multiply the total * and reset the built up number. */ - if (subtotal) - total += subtotal * duration_multi[multiplier]; + unsigned int multiplier = duration_multi[static_cast(*i)]; + if (multiplier == 0) + return false; + + total += subtotal * multiplier; /* Next subtotal please */ subtotal = 0; - multiplier = *i; - times = 1; } } - if (multiplier) + /* Any trailing values built up are treated as raw seconds */ + duration = total + subtotal; + return true; +} + +unsigned long InspIRCd::Duration(const std::string& str) +{ + unsigned long out = 0; + InspIRCd::Duration(str, out); + return out; +} + +bool InspIRCd::IsValidDuration(const std::string& duration) +{ + for (std::string::const_iterator i = duration.begin(); i != duration.end(); ++i) { - total += subtotal * duration_multi[multiplier]; - subtotal = 0; + unsigned char c = *i; + if (((c >= '0') && (c <= '9'))) + continue; + + if (!duration_multi[c]) + return false; } - /* Any trailing values built up are treated as raw seconds */ - return total + subtotal; + return true; +} + +std::string InspIRCd::DurationString(time_t duration) +{ + if (duration == 0) + return "0s"; + + time_t years = duration / 31449600; + time_t weeks = (duration / 604800) % 52; + time_t days = (duration / 86400) % 7; + time_t hours = (duration / 3600) % 24; + time_t minutes = (duration / 60) % 60; + time_t seconds = duration % 60; + + std::string ret; + + if (years) + ret = ConvToStr(years) + "y"; + if (weeks) + ret += ConvToStr(weeks) + "w"; + if (days) + ret += ConvToStr(days) + "d"; + if (hours) + ret += ConvToStr(hours) + "h"; + if (minutes) + ret += ConvToStr(minutes) + "m"; + if (seconds) + ret += ConvToStr(seconds) + "s"; + + return ret; } std::string InspIRCd::Format(va_list& vaList, const char* formatString) @@ -455,14 +515,12 @@ std::string InspIRCd::TimeString(time_t curtime, const char* format, bool utc) std::string InspIRCd::GenRandomStr(unsigned int length, bool printable) { - char* buf = new char[length]; - GenRandom(buf, length); - std::string rv; - rv.resize(length); - for(size_t i = 0; i < length; i++) - rv[i] = printable ? 0x3F + (buf[i] & 0x3F) : buf[i]; - delete[] buf; - return rv; + std::vector str(length); + GenRandom(&str[0], length); + if (printable) + for (size_t i = 0; i < length; i++) + str[i] = 0x3F + (str[i] & 0x3F); + return std::string(&str[0], str.size()); } // NOTE: this has a slight bias for lower values if max is not a power of 2. @@ -474,11 +532,14 @@ unsigned long InspIRCd::GenRandomInt(unsigned long max) return rv % max; } -// This is overridden by a higher-quality algorithm when SSL support is loaded +// This is overridden by a higher-quality algorithm when TLS (SSL) support is loaded void InspIRCd::DefaultGenRandom(char* output, size_t max) { - for(unsigned int i=0; i < max; i++) -#ifdef _WIN32 +#if defined HAS_ARC4RANDOM_BUF + arc4random_buf(output, max); +#else + for (unsigned int i = 0; i < max; ++i) +# ifdef _WIN32 { unsigned int uTemp; if(rand_s(&uTemp) != 0) @@ -486,7 +547,8 @@ void InspIRCd::DefaultGenRandom(char* output, size_t max) else output[i] = uTemp; } -#else +# else output[i] = random(); +# endif #endif }