X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=inline;f=include%2Finspircd.h;h=95da70e54321a011ce8e68930afc35c8d352c923;hb=51206352a965aced6913957f80421ade6ebe1eb3;hp=e63092f23b4023084a2bf667532b3822f6c29232;hpb=a3d2b4475708520207d95d66a6ecd5a35e176ab9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/inspircd.h b/include/inspircd.h index e63092f23..95da70e54 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -44,7 +45,9 @@ #include #include "intrusive_list.h" +#include "flat_map.h" #include "compat.h" +#include "aligned_storage.h" #include "typedefs.h" #include "stdalgo.h" @@ -62,13 +65,14 @@ struct fakederef }; #include "config.h" +#include "convto.h" #include "dynref.h" #include "consolecolors.h" -#include "caller.h" #include "cull_list.h" #include "extensible.h" #include "fileutils.h" #include "numerics.h" +#include "numeric.h" #include "uid.h" #include "server.h" #include "users.h" @@ -84,94 +88,14 @@ struct fakederef #include "socketengine.h" #include "snomasks.h" #include "filelogger.h" +#include "message.h" #include "modules.h" #include "threadengine.h" #include "configreader.h" #include "inspstring.h" #include "protocol.h" #include "bancache.h" - -/** Template function to convert any input type to std::string - */ -template inline std::string ConvNumeric(const T &in) -{ - if (in == 0) - return "0"; - T quotient = in; - std::string out; - while (quotient) - { - out += "0123456789"[ std::abs( (long)quotient % 10 ) ]; - quotient /= 10; - } - if (in < 0) - out += '-'; - std::reverse(out.begin(), out.end()); - return out; -} - -/** Template function to convert any input type to std::string - */ -inline std::string ConvToStr(const int in) -{ - return ConvNumeric(in); -} - -/** Template function to convert any input type to std::string - */ -inline std::string ConvToStr(const long in) -{ - return ConvNumeric(in); -} - -/** Template function to convert any input type to std::string - */ -inline std::string ConvToStr(const char* in) -{ - return in; -} - -/** Template function to convert any input type to std::string - */ -inline std::string ConvToStr(const bool in) -{ - return (in ? "1" : "0"); -} - -/** Template function to convert any input type to std::string - */ -inline std::string ConvToStr(char in) -{ - return std::string(1, in); -} - -/** Template function to convert any input type to std::string - */ -template inline std::string ConvToStr(const T &in) -{ - std::stringstream tmp; - if (!(tmp << in)) return std::string(); - return tmp.str(); -} - -/** Template function to convert any input type to any other type - * (usually an integer or numeric type) - */ -template inline long ConvToInt(const T &in) -{ - std::stringstream tmp; - if (!(tmp << in)) return 0; - return atol(tmp.str().c_str()); -} - -inline uint64_t ConvToUInt64(const std::string& in) -{ - uint64_t ret; - std::istringstream tmp(in); - if (!(tmp >> ret)) - return 0; - return ret; -} +#include "isupportmanager.h" /** This class contains various STATS counters * It is used by the InspIRCd class, which internally @@ -241,33 +165,6 @@ class serverstats } }; -/** This class manages the generation and transmission of ISUPPORT. */ -class CoreExport ISupportManager -{ -private: - /** The generated lines which are sent to clients. */ - std::vector Lines; - -public: - /** (Re)build the ISUPPORT vector. */ - void Build(); - - /** Returns the std::vector of ISUPPORT lines. */ - const std::vector& GetLines() - { - return this->Lines; - } - - /** Send the 005 numerics (ISUPPORT) to a user. */ - void SendTo(LocalUser* user); -}; - -DEFINE_HANDLER1(IsNickHandler, bool, const std::string&); -DEFINE_HANDLER2(GenRandomHandler, void, char*, size_t); -DEFINE_HANDLER1(IsIdentHandler, bool, const std::string&); -DEFINE_HANDLER1(IsChannelHandler, bool, const std::string&); -DEFINE_HANDLER3(OnCheckExemptionHandler, ModResult, User*, Channel*, const std::string&); - /** The main class of the irc server. * This class contains instances of all the other classes in this software. * Amongst other things, it contains a ModeParser, a DNS object, a CommandParser @@ -310,14 +207,6 @@ class CoreExport InspIRCd /** Actions that must happen outside of the current call stack */ ActionList AtomicActions; - /**** Functors ****/ - - IsNickHandler HandleIsNick; - IsIdentHandler HandleIsIdent; - OnCheckExemptionHandler HandleOnCheckExemption; - IsChannelHandler HandleIsChannel; - GenRandomHandler HandleGenRandom; - /** Globally accessible fake user record. This is used to force mode changes etc across s2s, etc.. bit ugly, but.. better than how this was done in 1.1 * Reason for it: * kludge alert! @@ -385,7 +274,7 @@ class CoreExport InspIRCd /** Snomask manager - handles routing of snomask messages * to opers. */ - SnomaskManager* SNO; + SnomaskManager SNO; /** Timer manager class, triggers Timer timer events */ @@ -397,7 +286,7 @@ class CoreExport InspIRCd /** User manager. Various methods and data associated with users. */ - UserManager *Users; + UserManager Users; /** Channel list, a hash_map containing all channels XXX move to channel manager class */ @@ -419,10 +308,6 @@ class CoreExport InspIRCd */ ProtocolInterface DefaultProtocolInterface; - /** Holds extensible for user operquit - */ - StringExtItem OperQuit; - /** Manages the generation and transmission of ISUPPORT. */ ISupportManager ISupport; @@ -442,29 +327,27 @@ class CoreExport InspIRCd * @param printable if false, the string will use characters 0-255; otherwise, * it will be limited to 0x30-0x7E ('0'-'~', nonspace printable characters) */ - std::string GenRandomStr(int length, bool printable = true); + std::string GenRandomStr(unsigned int length, bool printable = true); /** Generate a random integer. * This is generally more secure than rand() */ unsigned long GenRandomInt(unsigned long max); /** Fill a buffer with random bits */ - caller2 GenRandom; + TR1NS::function GenRandom; + + /** Fills the output buffer with the specified number of random characters. + * This is the default function for InspIRCd::GenRandom. + * @param output The output buffer to store random characters in. + * @param max The maximum number of random characters to put in the buffer. + */ + static void DefaultGenRandom(char* output, size_t max); /** Bind all ports specified in the configuration file. * @return The number of ports bound without error */ int BindPorts(FailedPortList &failed_ports); - /** Binds a socket on an already open file descriptor - * @param sockfd A valid file descriptor of an open socket - * @param port The port number to bind to - * @param addr The address to bind to (IP only) - * @param dolisten Should this port be listened on? - * @return True if the port was bound successfully - */ - bool BindSocket(int sockfd, int port, const char* addr, bool dolisten = true); - /** Find a user in the nick hash. * If the user cant be found in the nick hash check the uuid hash * @param nick The nickname to find @@ -487,11 +370,15 @@ class CoreExport InspIRCd */ chan_hash& GetChans() { return chanlist; } - /** Return true if a channel name is valid - * @param chname A channel name to verify - * @return True if the name is valid - */ - caller1 IsChannel; + /** Determines whether an channel name is valid. */ + TR1NS::function IsChannel; + + /** Determines whether a channel name is valid according to the RFC 1459 rules. + * This is the default function for InspIRCd::IsChannel. + * @param channel The channel name to validate. + * @return True if the channel name is valid according to RFC 1459 rules; otherwise, false. + */ + static bool DefaultIsChannel(const std::string& channel); /** Return true if str looks like a server ID * @param sid string to check against @@ -516,35 +403,33 @@ class CoreExport InspIRCd */ void Exit(int status); - /** Causes the server to exit immediately with exit code 0. - * The status code is required for signal handlers, and ignored. - */ - static void QuickExit(int status); - /** Formats the input string with the specified arguments. * @param formatString The string to format * @param ... A variable number of format arguments. * @return The formatted string */ - static const char* Format(const char* formatString, ...) CUSTOM_PRINTF(1, 2); - static const char* Format(va_list &vaList, const char* formatString) CUSTOM_PRINTF(2, 0); + static std::string Format(const char* formatString, ...) CUSTOM_PRINTF(1, 2); + static std::string Format(va_list& vaList, const char* formatString) CUSTOM_PRINTF(2, 0); - /** Send an error notice to all local users, opered and unopered - * @param s The error string to send - */ - void SendError(const std::string &s); + /** Determines whether a nickname is valid. */ + TR1NS::function IsNick; - /** Return true if a nickname is valid - * @param n A nickname to verify - * @return True if the nick is valid + /** Determines whether a nickname is valid according to the RFC 1459 rules. + * This is the default function for InspIRCd::IsNick. + * @param nick The nickname to validate. + * @return True if the nickname is valid according to RFC 1459 rules; otherwise, false. */ - caller1 IsNick; + static bool DefaultIsNick(const std::string& nick); - /** Return true if an ident is valid - * @param An ident to verify - * @return True if the ident is valid - */ - caller1 IsIdent; + /** Determines whether an ident is valid. */ + TR1NS::function IsIdent; + + /** Determines whether a ident is valid according to the RFC 1459 rules. + * This is the default function for InspIRCd::IsIdent. + * @param ident The ident to validate. + * @return True if the ident is valid according to RFC 1459 rules; otherwise, false. + */ + static bool DefaultIsIdent(const std::string& ident); /** Match two strings using pattern matching, optionally, with a map * to check case against (may be NULL). If map is null, match will be case insensitive. @@ -578,7 +463,7 @@ class CoreExport InspIRCd */ static bool IsValidMask(const std::string& mask); - /** Strips all color codes from the given string + /** Strips all color and control codes except 001 from the given string * @param sentence The string to strip from */ static void StripColor(std::string &sentence); @@ -618,9 +503,10 @@ class CoreExport InspIRCd /** Attempt to write the process id to a given file * @param filename The PID file to attempt to write to + * @param exitonfail If true and the PID fail cannot be written log to stdout and exit, otherwise only log on failure * @return This function may bail if the file cannot be written */ - void WritePID(const std::string &filename); + void WritePID(const std::string& filename, bool exitonfail = true); /** This constructor initialises all the subsystems and reads the config file. * @param argc The argument count passed to main() @@ -631,30 +517,6 @@ class CoreExport InspIRCd */ InspIRCd(int argc, char** argv); - /** Send a line of WHOIS data to a user. - * @param user user to send the line to - * @param dest user being WHOISed - * @param numeric Numeric to send - * @param text Text of the numeric - */ - void SendWhoisLine(User* user, User* dest, int numeric, const std::string &text); - - /** Send a line of WHOIS data to a user. - * @param user user to send the line to - * @param dest user being WHOISed - * @param numeric Numeric to send - * @param format Format string for the numeric - * @param ... Parameters for the format string - */ - void SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...) CUSTOM_PRINTF(5, 6); - - /** Called to check whether a channel restriction mode applies to a user - * @param User that is attempting some action - * @param Channel that the action is being performed on - * @param Action name - */ - caller3 OnCheckExemption; - /** Prepare the ircd for restart or shutdown. * This function unloads all modules which can be unloaded, * closes all open sockets, and closes the logfile. @@ -662,8 +524,22 @@ class CoreExport InspIRCd void Cleanup(); /** Return a time_t as a human-readable string. + * @param format The format to retrieve the date/time in. See `man 3 strftime` + * for more information. If NULL, "%a %b %d %T %Y" is assumed. + * @param curtime The timestamp to convert to a human-readable string. + * @param utc True to convert the time to string as-is, false to convert it to local time first. + * @return A string representing the given date/time. + */ + static std::string TimeString(time_t curtime, const char* format = NULL, bool utc = false); + + /** Compare two strings in a timing-safe way. If the lengths of the strings differ, the function + * returns false immediately (leaking information about the length), otherwise it compares each + * character and only returns after all characters have been compared. + * @param one First string + * @param two Second string + * @return True if the strings match, false if they don't */ - static std::string TimeString(time_t curtime); + static bool TimingSafeCompare(const std::string& one, const std::string& two); /** Begin execution of the server. * NOTE: this function NEVER returns. Internally, @@ -688,7 +564,7 @@ class CommandModule : public Module { } - Version GetVersion() + Version GetVersion() CXX11_OVERRIDE { return Version(cmd.name, VF_VENDOR|VF_CORE); } @@ -699,3 +575,7 @@ inline void stdalgo::culldeleter::operator()(classbase* item) if (item) ServerInstance->GlobalCulls.AddItem(item); } + +#include "numericbuilder.h" +#include "modules/whois.h" +#include "modules/stats.h"