* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2007 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
#ifndef __MODULES_H
#define __MODULES_H
-#include "globals.h"
#include "dynamic.h"
#include "base.h"
#include "ctables.h"
*/
#define FOREACH_MOD(y,x) do { \
EventHandlerIter safei; \
- for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
+ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
{ \
safei = _i; \
- safei++; \
+ ++safei; \
try \
{ \
(*_i)->x ; \
} \
catch (CoreException& modexcept) \
{ \
- ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
*/
#define FOREACH_MOD_I(z,y,x) do { \
EventHandlerIter safei; \
- for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
+ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \
{ \
safei = _i; \
- safei++; \
+ ++safei; \
try \
{ \
(*_i)->x ; \
} \
catch (CoreException& modexcept) \
{ \
- z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ z->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
do { \
EventHandlerIter safei; \
MOD_RESULT = 0; \
- for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
+ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
{ \
safei = _i; \
- safei++; \
+ ++safei; \
try \
{ \
int res = (*_i)->x ; \
} \
catch (CoreException& modexcept) \
{ \
- ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
do { \
EventHandlerIter safei; \
MOD_RESULT = 0; \
- for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
+ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \
{ \
safei = _i; \
- safei++; \
+ ++safei; \
try \
{ \
int res = (*_i)->x ; \
} \
catch (CoreException& modexcept) \
{ \
- z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \
+ z->Logs->Log("MODULE",DEBUG,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
} while (0);
+#define FOREACH_RESULT_MAP(y,x,f) \
+do { \
+ EventHandlerIter safei; \
+ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
+ { \
+ safei = _i; \
+ ++safei; \
+ try \
+ { \
+ int MOD_RESULT = (*_i)->x ; \
+ f; \
+ } \
+ catch (CoreException& modexcept) \
+ { \
+ ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ } \
+ _i = safei; \
+ } \
+} while(0);
+
/** Represents a non-local user.
* (in fact, any FD less than -1 does)
*/
#define FD_MAGIC_NUMBER -42
/* Useful macros */
-#ifdef WINDOWS
+
/** Is a local user */
#define IS_LOCAL(x) ((x->GetFd() > -1))
-#else
-/** Is a local user */
-#define IS_LOCAL(x) ((x->GetFd() > -1) && (x->GetFd() <= MAX_DESCRIPTORS))
-#endif
/** Is a remote user */
#define IS_REMOTE(x) (x->GetFd() < 0)
/** Is a module created user */
#define IS_MODULE_CREATED(x) (x->GetFd() == FD_MAGIC_NUMBER)
/** Is an oper */
-#define IS_OPER(x) (*x->oper)
+#define IS_OPER(x) (!x->oper.empty())
/** Is away */
-#define IS_AWAY(x) (*x->awaymsg)
+#define IS_AWAY(x) (!x->awaymsg.empty())
/** Holds a module's Version information.
* The four members (set by the constructor only) indicate details as to the version number
class CoreExport Version : public classbase
{
public:
- /** Version numbers, build number, flags and API version
- */
- const int Major, Minor, Revision, Build, Flags, API;
+ /** Version information.
+ */
+ std::string version;
+
+ /** Flags and API version
+ */
+ const int Flags, API;
- /** Initialize version class
- */
- Version(int major, int minor, int revision, int build, int flags, int api_ver);
+ /** Initialize version class
+ */
+ Version(const std::string &sversion, int flags, int api_ver);
};
/** The ModuleMessage class is the base class of Request and Event
* sent the request to. It is up to your module to know what this data is and
* how to deal with it.
*/
- char* Send();
+ const char* Send();
};
enum Implementation
{
I_BEGIN,
- I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart, I_OnRehash, I_OnServerRaw,
+ I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUserJoin, I_OnUserPart, I_OnRehash, I_OnSendSnotice,
I_OnUserPreJoin, I_OnUserPreKick, I_OnUserKick, I_OnOper, I_OnInfo, I_OnWhois, I_OnUserPreInvite,
I_OnUserInvite, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreNick, I_OnUserMessage, I_OnUserNotice, I_OnMode,
I_OnGetServerDescription, I_OnSyncUser, I_OnSyncChannel, I_OnSyncChannelMetaData, I_OnSyncUserMetaData,
I_OnDecodeMetaData, I_ProtoSendMode, I_ProtoSendMetaData, I_OnWallops, I_OnChangeHost, I_OnChangeName, I_OnAddLine,
- I_OnDelLine, I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule,
- I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnUserRrgister, I_OnCheckInvite,
- I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnLocalTopicChange,
- I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnOperCompre, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan,
+ I_OnDelLine, I_OnExpireLine, I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule,
+ I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite, I_OnRawMode,
+ I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckExtBan, I_OnCheckStringExtBan, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos,
+ I_OnLocalTopicChange, I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan,
I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister,
- I_OnOperCompare, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnCancelAway, I_OnUserList,
+ I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnUserList,
I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed,
- I_OnText,
+ I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookUserIO, I_OnHostCycle,
I_END
};
+class ConfigReader;
+
/** Base class for all InspIRCd modules
* This class is the base class for InspIRCd modules. All modules must inherit from this class,
* its methods will be called when irc server events occur. class inherited from module must be
*/
virtual void OnUserDisconnect(User* user);
+ /** Called whenever a channel is about to be deleted
+ * @param chan The channel being deleted
+ * @return An integer specifying whether or not the channel may be deleted. 0 for yes, 1 for no.
+ */
+ virtual int OnChannelPreDelete(Channel *chan);
+
/** Called whenever a channel is deleted, either by QUIT, KICK or PART.
* @param chan The channel being deleted
*/
* and the details of the channel they have left is available in the variable Channel *channel
* @param user The user who is parting
* @param channel The channel being parted
- * @param partmessage The part message, or an empty string
+ * @param partmessage The part message, or an empty string (may be modified)
* @param silent Change this to true if you want to conceal the PART command from the other users
* of the channel (useful for modules such as auditorium)
*/
- virtual void OnUserPart(User* user, Channel* channel, const std::string &partmessage, bool &silent);
+ virtual void OnUserPart(User* user, Channel* channel, std::string &partmessage, bool &silent);
/** Called on rehash.
* This method is called prior to a /REHASH or when a SIGHUP is received from the operating
*/
virtual void OnRehash(User* user, const std::string ¶meter);
- /** Called when a raw command is transmitted or received.
- * This method is the lowest level of handler available to a module. It will be called with raw
- * data which is passing through a connected socket. If you wish, you may munge this data by changing
- * the string parameter "raw". If you do this, after your function exits it will immediately be
- * cut down to 510 characters plus a carriage return and linefeed. For INBOUND messages only (where
- * inbound is set to true) the value of user will be the User of the connection sending the
- * data. This is not possible for outbound data because the data may be being routed to multiple targets.
- * @param raw The raw string in RFC1459 format
- * @param inbound A flag to indicate wether the data is coming into the daemon or going out to the user
- * @param user The user record sending the text, when inbound == true.
+ /** Called whenever a snotice is about to be sent to a snomask.
+ * snomask and type may both be modified; the message may not.
+ * @param snomask The snomask the message is going to (e.g. 'A')
+ * @param type The textual description the snomask will go to (e.g. 'OPER')
+ * @param message The text message to be sent via snotice
+ * @return 1 to block the snotice from being sent entirely, 0 else.
*/
- virtual void OnServerRaw(std::string &raw, bool inbound, User* user);
+ virtual int OnSendSnotice(char &snomask, std::string &type, const std::string &message);
/** Called whenever a user is about to join a channel, before any processing is done.
* Returning a value of 1 from this function stops the process immediately, causing no
* @param cname The channel name being joined. For new channels this is valid where chan is not.
* @param privs A string containing the users privilages when joining the channel. For new channels this will contain "@".
* You may alter this string to alter the user's modes on the channel.
+ * @param keygiven The key given to join the channel, or an empty string if none was provided
* @return 1 To prevent the join, 0 to allow it.
*/
- virtual int OnUserPreJoin(User* user, Channel* chan, const char* cname, std::string &privs);
-
+ virtual int OnUserPreJoin(User* user, Channel* chan, const char* cname, std::string &privs, const std::string &keygiven);
+
/** Called whenever a user is about to be kicked.
* Returning a value of 1 from this function stops the process immediately, causing no
* output to be sent to the user by the core. If you do this you must produce your own numerics,
* can be gauranteed to already have processed the oper-up, for example m_spanningtree has sent
* out the OPERTYPE, etc.
* @param user The user who is opering up
+ * @param opername The name of the oper that the user is opering up to. Only valid locally. Empty string otherwise.
* @param opertype The opers type name
*/
- virtual void OnPostOper(User* user, const std::string &opertype);
-
+ virtual void OnPostOper(User* user, const std::string &opername, const std::string &opertype);
+
/** Called whenever a user types /INFO.
* The User will contain the information of the user who typed the command. Modules may use this
* method to output their own credits in /INFO (which is the ircd's version of an about box).
* @param user The user issuing /INFO
*/
virtual void OnInfo(User* user);
-
+
/** Called whenever a /WHOIS is performed on a local user.
* The source parameter contains the details of the user who issued the WHOIS command, and
* the dest parameter contains the information of the user they are whoising.
* @param dest The user who is being WHOISed
*/
virtual void OnWhois(User* source, User* dest);
-
+
/** Called whenever a user is about to invite another user into a channel, before any processing is done.
* Returning 1 from this function stops the process immediately, causing no
* output to be sent to the user by the core. If you do this you must produce your own numerics,
* @param source The user who is issuing the INVITE
* @param dest The user being invited
* @param channel The channel the user is being invited to
- * @return 1 to deny the invite, 0 to allow
+ * @param timeout The time the invite will expire (0 == never)
+ * @return 1 to deny the invite, 0 to check whether or not the user has permission to invite, -1 to explicitly allow the invite
*/
- virtual int OnUserPreInvite(User* source,User* dest,Channel* channel);
-
+ virtual int OnUserPreInvite(User* source,User* dest,Channel* channel, time_t timeout);
+
/** Called after a user has been successfully invited to a channel.
* You cannot prevent the invite from occuring using this function, to do that,
* use OnUserPreInvite instead.
* @param source The user who is issuing the INVITE
* @param dest The user being invited
* @param channel The channel the user is being invited to
+ * @param timeout The time the invite will expire (0 == never)
*/
- virtual void OnUserInvite(User* source,User* dest,Channel* channel);
-
+ virtual void OnUserInvite(User* source,User* dest,Channel* channel, time_t timeout);
+
/** Called whenever a user is about to PRIVMSG A user or a channel, before any processing is done.
* Returning any nonzero value from this function stops the process immediately, causing no
* output to be sent to the user by the core. If you do this you must produce your own numerics,
* @param status The status being used, e.g. PRIVMSG @#chan has status== '@', 0 to send to everyone.
* @param exempt_list A list of users not to send to. For channel messages, this will usually contain just the sender.
* It will be ignored for private messages.
- * @return 1 to deny the NOTICE, 0 to allow it
+ * @return 1 to deny the message, 0 to allow it
*/
virtual int OnUserPreMessage(User* user,void* dest,int target_type, std::string &text,char status, CUList &exempt_list);
* @param text The original message text causing the exempt list to be built
*/
virtual void OnBuildExemptList(MessageType message_type, Channel* chan, User* sender, char status, CUList &exempt_list, const std::string &text);
-
+
/** Called before any nickchange, local or remote. This can be used to implement Q-lines etc.
* Please note that although you can see remote nickchanges through this function, you should
* NOT make any changes to the User if the user is a remote user as this may cause a desnyc.
* @param dest The target of the modes (User* or Channel*)
* @param target_type The type of target (TYPE_USER or TYPE_CHANNEL)
* @param text The actual modes and their parameters if any
+ * @param translate The translation types of the mode parameters
*/
- virtual void OnMode(User* user, void* dest, int target_type, const std::string &text);
+ virtual void OnMode(User* user, void* dest, int target_type, const std::deque<std::string> &text, const std::deque<TranslateType> &translate);
/** Allows modules to alter or create server descriptions
* Whenever a module requires a server description, for example for display in
* @param target_type The type of item to decode data for, TYPE_USER or TYPE_CHANNEL
* @param target The Channel* or User* that modes should be sent for
* @param modeline The modes and parameters to be sent
+ * @param translate The translation types of the mode parameters
*/
- virtual void ProtoSendMode(void* opaque, int target_type, void* target, const std::string &modeline);
+ virtual void ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::deque<std::string> &modeline, const std::deque<TranslateType> &translate);
/** Implemented by modules which provide the ability to link servers.
* These modules will implement this method, which allows metadata (extra data added to
* @param extname The extension name to send metadata for
* @param extdata Encoded data for this extension name, which will be encoded at the oppsite end by an identical module using OnDecodeMetaData
*/
- virtual void ProtoSendMetaData(void* opaque, int target_type, void* target, const std::string &extname, const std::string &extdata);
-
+ virtual void ProtoSendMetaData(void* opaque, TargetTypeFlags target_type, void* target, const std::string &extname, const std::string &extdata);
+
/** Called after every WALLOPS command.
* @param user The user sending the WALLOPS
* @param text The content of the WALLOPS message
*/
virtual void OnAddLine(User* source, XLine* line);
- /** Called whenever an xline is deleted.
+ /** Called whenever an xline is deleted MANUALLY. See OnExpireLine for expiry.
* This method is triggered after the line is deleted.
* @param source The user removing the line or NULL for local server
* @param line the line being deleted
*/
virtual void OnDelLine(User* source, XLine* line);
- /** Called whenever a zline is deleted.
+ /** Called whenever an xline expires.
* This method is triggered after the line is deleted.
- * @param source The user removing the line
- * @param hostmask The hostmask to delete
+ * @param line The line being deleted.
*/
+ virtual void OnExpireLine(XLine *line);
/** Called before your module is unloaded to clean up Extensibles.
* This method is called once for every user and channel on the network,
* before opping a user, deopping a user, kicking a user, etc.
* There are several values for access_type which indicate for what reason access is being checked.
* These are:<br><br>
- * AC_KICK (0) - A user is being kicked<br>
- * AC_DEOP (1) - a user is being deopped<br>
- * AC_OP (2) - a user is being opped<br>
- * AC_VOICE (3) - a user is being voiced<br>
- * AC_DEVOICE (4) - a user is being devoiced<br>
- * AC_HALFOP (5) - a user is being halfopped<br>
- * AC_DEHALFOP (6) - a user is being dehalfopped<br>
- * AC_INVITE () - a user is being invited<br>
- * AC_GENERAL_MODE (8) - a user channel mode is being changed<br><br>
+ * AC_KICK - A user is being kicked<br>
+ * AC_DEOP - a user is being deopped<br>
+ * AC_OP - a user is being opped<br>
+ * AC_VOICE - a user is being voiced<br>
+ * AC_DEVOICE - a user is being devoiced<br>
+ * AC_HALFOP - a user is being halfopped<br>
+ * AC_DEHALFOP - a user is being dehalfopped<br>
+ * AC_INVITE - a user is being invited<br>
+ * AC_GENERAL_MODE - a user channel mode is being changed<br><br>
* Upon returning from your function you must return either ACR_DEFAULT, to indicate the module wishes
* to do nothing, or ACR_DENY where approprate to deny the action, and ACR_ALLOW where appropriate to allow
* the action. Please note that in the case of some access checks (such as AC_GENERAL_MODE) access may be
* @param pcnt The nuimber of parameters passed to the command
* @param user the user issuing the command
* @param validated True if the command has passed all checks, e.g. it is recognised, has enough parameters, the user has permission to execute it, etc.
+ * You should only change the parameter list and command string if validated == false (e.g. before the command lookup occurs).
* @param original_line The entire original line as passed to the parser from the user
* @return 1 to block the command, 0 to allow
*/
- virtual int OnPreCommand(const std::string &command, const char** parameters, int pcnt, User *user, bool validated, const std::string &original_line);
+ virtual int OnPreCommand(std::string &command, std::vector<std::string>& parameters, User *user, bool validated, const std::string &original_line);
/** Called after any command has been executed.
* This event occurs for all registered commands, wether they are registered in the core,
* @param result The return code given by the command handler, one of CMD_SUCCESS or CMD_FAILURE
* @param original_line The entire original line as passed to the parser from the user
*/
- virtual void OnPostCommand(const std::string &command, const char** parameters, int pcnt, User *user, CmdResult result, const std::string &original_line);
+ virtual void OnPostCommand(const std::string &command, const std::vector<std::string>& parameters, User *user, CmdResult result, const std::string &original_line);
/** Called to check if a user who is connecting can now be allowed to register
* If any modules return false for this function, the user is held in the waiting
*/
virtual int OnCheckInvite(User* user, Channel* chan);
+ /** Called whenever a mode character is processed.
+ * Return 1 from this function to block the mode character from being processed entirely.
+ * @param user The user who is sending the mode
+ * @param chan The channel the mode is being sent to (or NULL if a usermode)
+ * @param mode The mode character being set
+ * @param param The parameter for the mode or an empty string
+ * @param adding true of the mode is being added, false if it is being removed
+ * @param pcnt The parameter count for the mode (0 or 1)
+ * @return ACR_DENY to deny the mode, ACR_DEFAULT to do standard mode checking, and ACR_ALLOW
+ * to skip all permission checking. Please note that for remote mode changes, your return value
+ * will be ignored!
+ */
+ virtual int OnRawMode(User* user, Channel* chan, const char mode, const std::string ¶m, bool adding, int pcnt, bool servermode = true);
+
/** Called whenever a user joins a channel, to determine if key checks should go ahead or not.
* This method will always be called for each join, wether or not the channel is actually +k, and
* determines the outcome of an if statement around the whole section of key checking code.
* return 1 to explicitly allow the join to go ahead or 0 to ignore the event.
* @param user The user joining the channel
* @param chan The channel being joined
- * @return 1 to explicitly allow the join, 0 to proceed as normal
+ * @return 1 to explicitly allow the join, 0 to proceed as normal. Return -1 to explicitly deny the
+ * join to the channel.
*/
virtual int OnCheckBan(User* user, Channel* chan);
+ /* Called whenever checking whether or not a user is matched by an applicable extended bantype.
+ * NOTE: may also trigger extra OnCheckStringExtBan events!
+ * @param u The user to check
+ * @param c The channel the user is on
+ * @param type The type of extended ban to check for.
+ * @returns 1 = exempt, 0 = no match, -1 = banned
+ */
+ virtual int OnCheckExtBan(User *u, Channel *c, char type);
+
+ /** Called whenever checking whether or not a string is extbanned. NOTE: one OnCheckExtBan will also trigger a number of
+ * OnCheckStringExtBan events for seperate host/IP comnbinations.
+ * @returns 1 = exempt, 0 = no match, -1 = banned
+ */
+ virtual int OnCheckStringExtBan(const std::string &s, Channel *c, char type);
+
/** Called on all /STATS commands
* This method is triggered for all /STATS use, including stats symbols handled by the core.
* @param symbol the symbol provided to /STATS
* @param newhost The new GECOS
* @return 1 to deny the GECOS change, 0 to allow
*/
- virtual int OnChangeLocalUserGECOS(User* user, const std::string &newhost);
+ virtual int OnChangeLocalUserGECOS(User* user, const std::string &newhost);
/** Called whenever a topic is changed by a local user.
- * Return 1 to deny the topic change, or 0 to allow it.
+ * Return 1 to deny the topic change, 0 to check details on the change, -1 to let it through with no checks
* @param user The user changing the topic
* @param chan The channels who's topic is being changed
* @param topic The actual topic text
* may be able to use for pre-determined purposes (e.g. the results of an SQL query, etc).
* @param request The Request class being received
*/
- virtual char* OnRequest(Request* request);
+ virtual const char* OnRequest(Request* request);
- /** Called whenever an oper password is to be compared to what a user has input.
+ /** Called whenever a password check is to be made. Replaces the old OldOperCompare API.
* The password field (from the config file) is in 'password' and is to be compared against
- * 'input'. This method allows for encryption of oper passwords and much more besides.
- * You should return a nonzero value if you want to allow the comparison or zero if you wish
- * to do nothing.
- * @param password The oper's password
- * @param input The password entered
- * @param tagnumber The tag number (from the configuration file) of this oper's tag
- * @return 1 to match the passwords, 0 to do nothing. -1 to not match, and not continue.
+ * 'input'. This method allows for encryption of passwords (oper, connect:allow, die/restart, etc).
+ * You should return a nonzero value to override the normal comparison, or zero to pass it on.
+ * @param ex The object that's causing the authentication (User* for <oper> <connect:allow> etc, Server* for <link>).
+ * @param password The password from the configuration file (the password="" value).
+ * @param input The password entered by the user or whoever.
+ * @param hashtype The hash value from the config
+ * @return 0 to do nothing (pass on to next module/default), 1 == password is OK, -1 == password is not OK
*/
- virtual int OnOperCompare(const std::string &password, const std::string &input, int tagnumber);
+ virtual int OnPassCompare(Extensible* ex, const std::string &password, const std::string &input, const std::string& hashtype);
/** Called whenever a user is given usermode +o, anywhere on the network.
* You cannot override this and prevent it from happening as it is already happened and
*/
virtual int OnDelBan(User* source, Channel* channel,const std::string &banmask);
+ virtual void OnHookUserIO(User* user, const std::string &targetip);
+
/** Called immediately after any connection is accepted. This is intended for raw socket
* processing (e.g. modules which wrap the tcp connection within another library) and provides
* no information relating to a user record as the connection has not been assigned yet.
*/
virtual int OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult);
- /** Called whenever a user sets away.
- * This method has no parameter for the away message, as it is available in the
- * user record as User::awaymsg.
+ /** Called whenever a user sets away or returns from being away.
+ * The away message is available as a parameter, but should not be modified.
+ * At this stage, it has already been copied into the user record.
+ * If awaymsg is empty, the user is returning from away.
* @param user The user setting away
+ * @param awaymsg The away message of the user, or empty if returning from away
+ * @return nonzero if the away message should be blocked - should ONLY be nonzero for LOCAL users (IS_LOCAL) (no output is returned by core)
*/
- virtual void OnSetAway(User* user);
-
- /** Called when a user cancels their away state.
- * @param user The user returning from away
- */
- virtual void OnCancelAway(User* user);
+ virtual int OnSetAway(User* user, const std::string &awaymsg);
/** Called whenever a NAMES list is requested.
* You can produce the nameslist yourself, overriding the current list,
* @param user The user who's buffer is now empty.
*/
virtual void OnBufferFlushed(User* user);
+
+ /** Add test suite hooks here. These are used for testing functionality of a module
+ * via the --testsuite debugging parameter.
+ */
+ virtual void OnRunTestSuite();
+
+ /** Called for every item in a NAMES list, so that modules may reformat portions of it as they see fit.
+ * For example NAMESX, channel mode +u and +I, and UHNAMES. If the nick is set to an empty string by any
+ * module, then this will cause the nickname not to be displayed at all.
+ */
+ virtual void OnNamesListItem(User* issuer, User* user, Channel* channel, std::string &prefixes, std::string &nick);
+
+ virtual int OnNumeric(User* user, unsigned int numeric, const std::string &text);
+
+ /** Called for every time the user's host or ident changes, to indicate wether or not the 'Changing host'
+ * message should be sent, if enabled. Certain modules such as auditorium may opt to hide this message
+ * even if it is enabled.
+ */
+ virtual bool OnHostCycle(User* user);
};
/** Error code
*/
long error;
-
+
public:
/** Default constructor.
* This constructor initialises the ConfigReader class to read the inspircd.conf file
* This function will return false if the file could not be opened.
*/
bool Exists();
-
+
/** Retrieve one line from the file.
* This method retrieves one line from the text file. If an empty non-NULL string is returned,
* the index was out of bounds, or the line had no data on it.
*/
typedef IntModuleList::iterator EventHandlerIter;
-/** Module priority states
- */
-enum PriorityState
-{
- PRIO_DONTCARE,
- PRIO_FIRST,
- PRIO_LAST,
- PRIO_AFTER,
- PRIO_BEFORE
-};
-
/** ModuleManager takes care of all things module-related
* in the core.
*/
/** Holds a string describing the last module error to occur
*/
std::string LastModuleError;
-
+
/** The feature names published by various modules
*/
featurelist Features;
/** The interface names published by various modules
*/
interfacelist Interfaces;
-
+
/** Total number of modules loaded into the ircd
*/
- int ModCount;
-
+ int ModCount;
+
/** Our pointer to the main insp instance
*/
InspIRCd* Instance;
/** Destructor
*/
- ~ModuleManager();
+ ~ModuleManager();
/** Change the priority of one event in a module.
* Each module event has a list of modules which are attached to that event type.
* set it to be the last called, or PRIO_BEFORE and PRIO_AFTER
* to set it to be before or after one or more other modules.
* @param modules If PRIO_BEFORE or PRIO_AFTER is set in parameter 's',
- * then this contains a list of one or more modules your module must be
+ * then this contains a list of one or more modules your module must be
* placed before or after. Your module will be placed before the highest
* priority module in this list for PRIO_BEFORE, or after the lowest
* priority module in this list for PRIO_AFTER.
* Defaults to 1, as most of the time you will only want to prioritize your module
* to be before or after one other module.
*/
- bool SetPriority(Module* mod, Implementation i, PriorityState s, Module** modules = NULL, size_t sz = 1);
+ bool SetPriority(Module* mod, Implementation i, Priority s, Module** modules = NULL, size_t sz = 1);
/** Change the priority of all events in a module.
* @param mod The module to set the priority of
* SetPriority method for this, where you may specify other modules to
* be prioritized against.
*/
- bool SetPriority(Module* mod, PriorityState s);
+ bool SetPriority(Module* mod, Priority s);
/** Attach an event to a module.
* You may later detatch the event with ModuleManager::Detach().
* @param mod Module to detach from
*/
void DetachAll(Module* mod);
-
+
/** Returns text describing the last module error
* @return The last error message to occur
*/
* @return True if the module was unloaded
*/
bool Unload(const char* filename);
-
+
/** Called by the InspIRCd constructor to load all modules from the config file.
*/
void LoadAll();
-
+
/** Get the total number of currently loaded modules
* @return The number of loaded modules
*/
{
return this->ModCount;
}
-
+
/** Find a module by name, and return a Module* to it.
* This is preferred over iterating the module lists yourself.
* @param name The module name to look up
* @return A pointer to the module, or NULL if the module cannot be found
*/
Module* Find(const std::string &name);
-
+
/** Publish a 'feature'.
* There are two ways for a module to find another module it depends on.
* Either by name, using InspIRCd::FindModule, or by feature, using this
*/
modulelist* FindInterface(const std::string &InterfaceName);
+ /** Determine if a module has published the named interface.
+ * This could be used in, for example, OnLoadModule to pick up other modules that can be used.
+ * @param mod The module to check.
+ * @param InterfaceName the interface you want to check for
+ * @return True if the module provides the interface, false otherwise.
+ */
+ bool ModuleHasInterface(Module* mod, const std::string& InterfaceName);
+
/** Given a pointer to a Module, return its filename
* @param m The module pointer to identify
* @return The module name or an empty string
* and functions needed to make a module loadable by the OS.
* It defines the class factory and external init_module function.
*/
+#ifdef WINDOWS
+
+#define MODULE_INIT(y) \
+ extern "C" DllExport Module * init_module(InspIRCd* Me) \
+ { \
+ return new y(Me); \
+ } \
+ BOOLEAN WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved) \
+ { \
+ switch ( nReason ) \
+ { \
+ case DLL_PROCESS_ATTACH: \
+ case DLL_PROCESS_DETACH: \
+ break; \
+ } \
+ return TRUE; \
+ }
+
+#else
+
#define MODULE_INIT(y) \
extern "C" DllExport Module * init_module(InspIRCd* Me) \
{ \
return new y(Me); \
}
+#endif
#endif