/** * ccontrol.h * * This program 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; either version 2 * of the License, or (at your option) any later version. * * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * $Id: ccontrol.h,v 1.118 2009/12/24 20:19:14 hidden1 Exp $ */ #ifndef __CCONTROL_H #define __CCONTROL_H "$Id: ccontrol.h,v 1.118 2009/12/24 20:19:14 hidden1 Exp $" //Undef this if you want to log to the database #define LOGTOHD // If a server is >LAG_TOO_BIG ms lagged, report it to opers who have GetLag=ON set #define LAG_TOO_BIG 45 // Minimum Interval in seconds between lag reports for those with GetLag=ON #define LAG_REPORT_INTERVAL 300 // Maximum time diff tolerated for a server's clock #define MAX_TIME_DIFF 120 // Minimum Interval in seconds between Time diff reports #define TIMEDIFF_REPORT_INTERVAL 43200 #include #include #include #include #include #include #include #include #include "client.h" #include "iClient.h" #include "server.h" #include "CControlCommands.h" #include "Channel.h" #include "dbHandle.h" #include "match.h" #include "md5hash.h" #include "ccUser.h" #include "ccGline.h" #include "ccServer.h" #include "ccFloodData.h" #include "ccException.h" #include "server.h" #include "CommandsDec.h" #include "ccBadChannel.h" #include "defs.h" #ifdef LOGTOHD #include "ccLog.h" #endif namespace gnuworld { using std::map ; using std::string ; using std::vector ; namespace uworld { using namespace std; /* * Sublcass the postgres API to create our own accessor * to get at the PID information. */ /* class cmDatabase : public dbHandle { public: cmDatabase(const string& conninfo) : dbHandle(conninfo.c_str()) {} virtual ~cmDatabase() {} }; */ /// Forward declaration of command handler class class Command ; /** * The ccontrol client class. This is an operator service for network * operations. */ class ccontrol : public xClient { protected: /** * The type used to store the client's command handlers. */ typedef map< string, Command*, noCaseCompare > commandMapType ; /** * The value_type of the command table type. * This type will be used to model key/value pairs * for the command handler table. */ typedef commandMapType::value_type pairType ; /** * The db clients map */ typedef map usersMapType; /** * Holds the authenticated user list */ usersMapType usersMap ; /** * A mutable iterator to the usersMap. */ typedef usersMapType::iterator usersIterator; /** * The db servers */ typedef map serversMapType; /** * Holds the servers map */ serversMapType serversMap ; /** * A mutable iterator to the serversMap. */ typedef serversMapType::iterator serversIterator; /** * Type used to hold the gline list. */ typedef map< string, ccGline* > glineListType ; typedef map< string, string > opersIPMapType; /** * Holds the glines */ glineListType glineList ; glineListType rnGlineList; // This is the list of glines sent that match an exception // The oper has to send the gline command twice in order to set the G: typedef list< pair< string,int > > glinedExceptionListType ; glinedExceptionListType glinedExceptionList; typedef pair< ccGline* , bool > glineQueueDataType; typedef list< glineQueueDataType > glineQueueType; glineQueueType glineQueue; typedef list< ccFloodData* > ignoreListType; ignoreListType ignoreList; typedef list< ccException* > exceptionListType; exceptionListType exceptionList; typedef std::list< string > stringListType; typedef map clientsIpMapType; typedef clientsIpMapType::iterator clientsIpIterator; typedef list allowedVersionsType; #ifdef LOGTOHD typedef list ccLogList; typedef ccLogList::iterator ccLogIterator; #endif typedef map badChannelsMapType; typedef badChannelsMapType::iterator badChannelsIterator; typedef map timediffServersMapType; timediffServersMapType timediffServersMap; iServer* myHub; ccServer* ccHub; typedef pair< unsigned int, string> levelMapperType; vector levelMapper; public: /** * Default, and only constructor, receives the name * of the configuration file for this client. */ ccontrol( const string& configFileName ) ; /** * Destructor cleans up any allocated memory, etc. */ virtual ~ccontrol() ; /** * This method is called by the xServer when it wants information * about the channels this client will be on. */ virtual void BurstChannels() ; /** * This method is called by the xServer when it wants information * about the glines this client has in its database; */ virtual bool BurstGlines() ; /** * This method is invoked each time the client is sent a * PRIVMSG. */ virtual void OnPrivateMessage( iClient*, const string&, bool secure = false ) ; virtual void OnServerMessage( iServer*, const string&, bool secure = false ) ; bool Notice( const iClient* Target, const string& Message ); bool Notice( const iClient* Target, const char* Message, ... ); virtual void OnCTCP( iClient* , const string& , const string&, bool Secure = false ) ; /** * This method is invoked each time a network event occurs. */ virtual void OnEvent( const eventType&, void* = 0, void* = 0, void* = 0, void* = 0 ) ; /** * This method is invoked each time a channel event occurs * for one of the channels for which this client has registered * to receive channel events. */ virtual void OnChannelEvent( const channelEventType&, Channel*, void* = 0, void* = 0, void* = 0, void* = 0 ) ; virtual void OnTimer(const gnuworld::xServer::timerID&, void*); virtual void OnConnect(); /** * This method is called once this client has been attached * to an xServer. This method is overloaded because the * command handlers each require a reference to the xServer * for efficiency. */ virtual void OnAttach() ; /** * This method is called duringg shutdown. It unloads the * client correctly during a shutdown. */ virtual void OnShutdown(const std::string& reason); /** * Return true if the given channel name corresponds to a * channel which is an IRCoperator only channel. */ bool isOperChan( const string& chanName ) const ; /** * Return true if the given channel corresponds to a * channel which is an IRCoperator only channel. */ bool isOperChan( const Channel* theChan ) const ; /** * Return true if this client is on the given channel. */ virtual bool isOnChannel( const string& chanName ) const { return isOperChan( chanName ) ; } /** * Return true if this client is on the given channel. */ virtual bool isOnChannel( const Channel* theChan ) const { return isOperChan( theChan->getName() ) ; } /** * This method will kick the given user from the given channel * for the given reason (arg 3). */ // virtual bool Kick( Channel*, iClient*, const string& ) ; /** * This method will cause the bot to join the channel with * the given name, if the client is not already on that * channel. */ virtual bool Join( const string&, const string& = string(), time_t = 0, bool = false) ; /** * This method will cause this client to part the given channel, * if it is already on that channel. */ virtual bool Part( const string& ) ; /** * This method will register a given command handler, removing * (and deallocating) the existing handler for this command, * should one exist. */ virtual bool RegisterCommand( Command* ) ; /** * This method will unregister the command handler for the command * of the given command name, deallocating the object from the * heap as well. */ virtual bool UnRegisterCommand( const string& ) ; /** * This method will add the given channel name as an IRC operator * only channel. * This method will cause the client to join the channel and * kick all non-IRCops if it is not already on the channel. */ virtual bool addOperChan( const string& chanName ) ; /** * This method will add the channel with the given name as an IRC * operator only channel for the given reason. * This method will cause the client to join the channel and * kick all non-IRCops if it is not already on the channel. */ virtual bool addOperChan( const string& chanName, const string& reason ) ; /** * This method will remove the channel with the given name from the * list of IRCoperator only channels. * This method will cause the client to part from the channel, if it * is already in the channel. */ virtual bool removeOperChan( const string& ) ; void handleNewClient( iClient* ); void isNowAnOper ( iClient* ); bool isIpOfOper ( const string& ); void refreshOpersIPMap(); void announce ( iClient* , const string& ); void privAnnounce ( iClient* , const string& ); string getLastNUHOfOperFromIP ( const string& ); void addGlineToUplink( ccGline* ); int strToLevel(const string&); const string& levelToStr(unsigned int level); /** * This method will check if a client is authenticated * based on the iClient structure */ ccUser* IsAuth( const iClient* theClient ) ; /** * This method will check if a client is authenticated * based on a nick */ ccUser *IsAuth( const string& ); /** * This method will add a new oper to the database */ bool AddOper( ccUser* ); /** * This method will delete an oper from the database * based on the a handle */ bool DeleteOper( const string& ); /** * This method will mark the client as authenticated */ bool AuthUser( ccUser* ,iClient* ); /** * This method will deauthenticate a client with the bot */ bool deAuthUser( ccUser* ); /** * This method will return the access flag needed for a command */ int getCommandLevel( const string& ); /** * This method will check if a user got a corrisponding * host mask in the databse */ bool UserGotMask( ccUser* , const string& ); /** * This method will check if a user got a corrisponding * host in the databse */ bool UserGotHost( ccUser* , const string& ); /** * This method will crypt a string based on the md5 hash */ static string CryptPass( const string& ); /** * This method will check if a mask is valid */ virtual bool validUserMask(const string& userMask) const ; /** * This method will add a host to a client */ bool AddHost( ccUser* , const string& host ); /** * This method will delete a host from aclient */ bool DelHost( ccUser* , const string& host ); /** * This method lists all the hosts a client got */ bool listHosts( ccUser* , iClient* ); /** * This method will update a client authenticate info * based on the ccUser structure (called after update) */ void UpdateAuth( ccUser* ); /** * This method will get a help entry for a command from the database */ bool GetHelp( iClient* , const string& ); /** * This method will get a help entry for a command and its subcommand * from the database */ bool GetHelp( iClient* , const string& , const string&); /** * This method will post help for a client */ void DoHelp( iClient* ); /** * This method will replace a word in a string with another one */ static string replace( const string&, const string&, const string& ) ; /** * This method will attempt to load an oper info from the database * based on the handle */ ccUser *GetOper( const string ); /** * This method will attempt to load an oper info from the database * based on the user id */ ccUser *GetOper( unsigned int ); /** * This method add a gline to the database */ bool addGline( ccGline* ); /** * This method deletes a gline from the database */ bool remGline( ccGline* ); vector< ccGline* > findAllMatchingGlines(const string& ); /* * Remove matching glines from mod.ccontrol's glines list, from 'gnuworld server' gline list * and also send gline remove messages to the network. */ bool removeAllMatchingGlines( const string& ); ccGline* findMatchingGline( const iClient* ); ccGline* findMatchingRNGline( const iClient* ); ccGline* findGline( const string& ); ccGline* findRealGline( const string& ); /** * This method logs the bot commands to the message channel */ bool MsgChanLog( const char * , ... ) ; bool ConnChanLog( const char * , ... ) ; bool MsgChanLag( const char * , ... ) ; /** * This method logs the commands to the database * for lastcom report */ #ifndef LOGTOHD bool DailyLog( ccUser * , const char *, ... ); bool DailyLog( iClient * , const char *, ... ); #else bool DailyLog(ccLog*); #endif /** * This method convers a unix time to ascii time */ char *convertToAscTime(time_t); /** * This method converts a unix time to tm structure */ struct tm convertToTmTime(time_t ); /** * This method creates a lastcom report between two dates */ bool CreateReport(time_t , time_t); /** * This method emails the lastcom report */ bool MailReport(const char *, const char *); /** * This method checks the gline paramerters for valid time/host */ int checkGline(const string ,unsigned int ,unsigned int &); int checkSGline(const string ,unsigned int ,unsigned int &); bool isSuspended(ccUser *); bool refreshVersions(); bool refreshSuspention(); bool refreshGlines(); void queueGline(ccGline* , bool = true); bool processGlineQueue(); bool loadGlines(); bool loadUsers(); bool loadServers(); bool loadMaxUsers(); bool loadVersions(); bool loadBadChannels(); void loadCommands(); bool loadMisc(); void wallopsAsServer(const char * , ... ); int getExceptions( const string & ); bool isException( const string & ); int isGlinedException( const string & ); void addGlinedException( const string & ); bool listExceptions( iClient * ); bool insertException( iClient * , const string & , int , const string &); bool delException( iClient * , const string & ); bool isValidCidr( const string & ); bool isCidrMatch( const string & , const string & ); ccFloodData *findLogin( const string & ); void removeLogin( ccFloodData * ); void addLogin( iClient* ); void addFloodData(iClient*, unsigned int); int removeIgnore( const string & ); int removeIgnore( iClient * ); void ignoreUser( ccFloodData * ); bool listIgnores( iClient * ); bool refreshIgnores(); bool loadExceptions(); void listGlines( iClient *, string Mask = "*" ); void listSuspended( iClient * ); bool updateCommand ( Command* ); Command* findRealCommand( const string& ); Command* findCommandInMem( const string& ); bool UpdateCommandFromDb ( Command* Comm ); const string expandDbServer(const string&); static const string removeSqlChars(const string&); void checkDbConnection(); void updateSqldb(dbHandle*); void showStatus(iClient*); unsigned int checkPassword(string,ccUser*); /** Servers Functions */ ccServer* getServer(const string& ); void addServer(ccServer*); void remServer(ccServer*); bool CleanServers(); void listServers( iClient * ); #ifdef LOGTOHD void initLogs(); void addLog(ccLog*); void showLogs(iClient* , unsigned int = 20); #endif /** Signals Commands */ void OnSignal(int sig); void saveServersInfo(); void saveChannelsInfo(); /** MaxUsers Functions */ void checkMaxUsers(); const unsigned int& getMaxUsers() const { return maxUsers; } const unsigned long& getDateMax() const { return dateMax; } const unsigned long& getCurUsers() const { return curUsers; } /** Server Versions Functions */ bool addVersion(const string&); bool remVersion(const string&); bool isValidVersion(const string&); bool updateCheckVer(const bool); void listVersions(iClient*); /** BadChannel Functions */ ccBadChannel* isBadChannel(const string&); void addBadChannel(ccBadChannel*); void remBadChannel(ccBadChannel*); void listBadChannels( iClient* ); bool updateMisc(const string&, const unsigned int); bool glineChannelUsers(iClient* , Channel* , const string& , unsigned int , const string& , bool, bool); /** * This is a constant iterator type used to perform a read-only * iteration of the operchan structure. */ typedef vector< string >::const_iterator const_operChanIterator ; /** * This it an iterator type used to perform a mutating * iteration of the operchan structure. */ typedef vector< string >::size_type operChanSizeType ; /** * Retrieve a constant iterator to the beginning of the oper * chan structure. */ inline const_operChanIterator operChan_begin() const { return operChans.begin() ; } /** * Retrieve a constant iterator to the end of the oper chan * structure. */ inline const_operChanIterator operChan_end() const { return operChans.end() ; } /** * Retrieve the size of the operchan structure. */ inline operChanSizeType operChan_size() const { return operChans.size() ; } /** * Return true if the oper chan structure is empty. */ inline bool operChan_empty() const { return operChans.empty() ; } /** * The type of a constant iterator to the command map. */ typedef commandMapType::const_iterator constCommandIterator ; /** * Retrieve a constant iterator to the beginning of the command * table. */ constCommandIterator command_begin() const { return commandMap.begin() ; } /** * Retrieve a constant iterator to the end of the command table. */ constCommandIterator command_end() const { return commandMap.end() ; } /** * Retrieve a constant iterator to a command handler for the * given command token. */ constCommandIterator findCommand( const string& theComm ) const { return commandMap.find( theComm ) ; } /** * The type of a mutable iterator to the command map. */ typedef commandMapType::iterator commandIterator ; /** * Retrieve a mutable iterator to the beginning of the command * table. */ commandIterator command_begin() { return commandMap.begin() ; } /** * Retrieve a mutable iterator to the end of the command table. */ commandIterator command_end() { return commandMap.end() ; } /** * Retrieve a mutable iterator to a command handler for the * given command token. */ commandIterator findCommand( const string& theComm ) { return commandMap.find( theComm ) ; } typedef glineListType::iterator glineIterator; glineIterator gline_begin() { return glineList.begin() ; } glineIterator gline_end() { return glineList.end() ; } glineIterator rngline_begin() { return rnGlineList.begin() ; } glineIterator rngline_end() { return rnGlineList.end() ; } typedef ignoreListType::iterator ignoreIterator; ignoreIterator ignore_begin() { return ignoreList.begin() ; } ignoreIterator ignore_end() { return ignoreList.end() ; } typedef exceptionListType::iterator exceptionIterator; exceptionIterator exception_begin() { return exceptionList.begin(); } exceptionIterator exception_end() { return exceptionList.end(); } clientsIpMapType clientsIpMap; opersIPMapType opersIPMap; clientsIpIterator clientsIp_begin() { return clientsIpMap.begin(); } clientsIpIterator clientsIp_end() { return clientsIpMap.end(); } clientsIpMapType clientsIp24Map; clientsIpMapType clientsIp24MapLastWarn; clientsIpIterator clientsIp24_begin() { return clientsIp24Map.begin(); } clientsIpIterator clientsIp24_end() { return clientsIp24Map.end(); } clientsIpMapType clientsIp24IdentMap; clientsIpMapType clientsIp24IdentMapLastWarn; clientsIpIterator clientsIp24IdentMap_begin() { return clientsIp24IdentMap.begin(); } clientsIpIterator clientsIp24IdentMap_end() { return clientsIp24IdentMap.end(); } clientsIpMapType virtualClientsMap; clientsIpIterator virtualClientsMap_begin() { return virtualClientsMap.begin(); } clientsIpIterator virtualClientsMap_end() { return virtualClientsMap.end(); } clientsIpMapType virtualClientsMapLastWarn; clientsIpIterator virtualClientsMapLastWarn_begin() { return virtualClientsMapLastWarn.begin(); } clientsIpIterator virtualClientsMapLastWarn_end() { return virtualClientsMapLastWarn.end(); } typedef usersMapType::const_iterator usersConstIterator; usersConstIterator usersMap_begin() const { return usersMap.begin(); } usersConstIterator usersMap_end() const { return usersMap.end(); } typedef serversMapType::const_iterator serversConstIterator; serversConstIterator serversMap_begin() const { return serversMap.begin(); } serversConstIterator serversMap_end() const { return serversMap.end(); } allowedVersionsType VersionsList; typedef list::iterator versionsIterator; badChannelsIterator badChannels_begin() { return badChannelsMap.begin(); } badChannelsIterator badChannels_end() { return badChannelsMap.end(); } /** * Retrieve the default length of time for glines. */ inline const time_t& getDefaultGlineLength() const { return gLength ; } inline const int& getMaxListChannels() const { return maxListChannels; } /** * PostgreSQL Database */ dbHandle* SQLDb; /* TimerID - Posts the daily log to the abuse team */ gnuworld::xServer::timerID postDailyLog; /* TimerID = Expired glines/ignores/suspends/... interval timer */ gnuworld::xServer::timerID expiredTimer; gnuworld::xServer::timerID dbConnectionCheck; gnuworld::xServer::timerID glineQueueCheck; gnuworld::xServer::timerID rpingCheck; gnuworld::xServer::timerID timeCheck; protected: /** * The name of the channel to which to send network events. * This is also an oper chan. */ string msgChan ; /** * The modes to enforce in an oper channel. */ string operChanModes ; /** * The kick reason for kicking (-o) users from oper * only channel. */ string operChanReason ; /** * How many channels will be listed with the list channels command? * 0 = all */ int maxListChannels; /** * The default length of time for glines. */ time_t gLength ; /** * The table of oper only channels. */ vector< string > operChans ; /** * The command handler table. */ commandMapType commandMap ; #ifdef LOGTOHD ccLogList LogList; unsigned long NumOfLogs; string LogFileName; unsigned int LogsToSave; fstream LogFile; #endif badChannelsMapType badChannelsMap; /** * The email address that ccontrol will send the email from */ string CCEmail; /** * The email that the lastcom report should be sent to */ string AbuseMail; /** * The full path to sendmail */ string Sendmail_Path; /** * Send report trigger */ int SendReport; /** * Burst flag */ bool inBurst; /** * Refresh gline flag */ bool inRefresh; /** * Refresh gline interval */ int ExpiredInterval; int maxClones; int maxVClones; int maxCClones; int CClonesCIDR; int CClonesTime; bool CClonesGline; int CClonesGTime; bool IClonesGline; int maxIClones; int maxGlineLen; int maxThreads; bool checkClones; bool showCGIpsInLogs; time_t dbConnectionTimer; string AnnounceNick; string sqlHost; string sqlPort; string sqlUser; string sqlPass; string sqlDb; unsigned int connectCount; unsigned int connectRetry; unsigned int maxUsers; unsigned long int dateMax; bool checkVer; unsigned long int curUsers; unsigned int glineBurstInterval; unsigned int glineBurstCount; bool saveGlines; bool listenNonOpers; } ; extern bool dbConnected; } //namespace uworld } // namespace gnuworld #endif // __CCONTROL_H