summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/bancache.h39
-rw-r--r--include/base.h5
-rw-r--r--include/builtinmodes.h184
-rw-r--r--include/caller.h77
-rw-r--r--include/channels.h64
-rw-r--r--include/command_parse.h5
-rw-r--r--include/commands/cmd_whowas.h55
-rw-r--r--include/configparser.h6
-rw-r--r--include/configreader.h53
-rw-r--r--include/consolecolors.h6
-rw-r--r--include/ctables.h5
-rw-r--r--include/cull_list.h6
-rw-r--r--include/dns.h443
-rw-r--r--include/dynamic.h6
-rw-r--r--include/exitcodes.h6
-rw-r--r--include/extensible.h5
-rw-r--r--include/filelogger.h23
-rw-r--r--include/hash_map.h59
-rw-r--r--include/hashcomp.h89
-rw-r--r--include/inspircd.h181
-rw-r--r--include/inspsocket.h6
-rw-r--r--include/inspstring.h11
-rw-r--r--include/listmode.h218
-rw-r--r--include/logger.h9
-rw-r--r--include/membership.h7
-rw-r--r--include/mode.h13
-rw-r--r--include/modes/cmode_b.h41
-rw-r--r--include/modes/cmode_l.h30
-rw-r--r--include/modes/cmode_v.h37
-rw-r--r--include/modes/simplemodes.h100
-rw-r--r--include/modes/umode_s.h34
-rw-r--r--include/modules.h192
-rw-r--r--include/modules/account.h (renamed from include/modes/cmode_o.h)30
-rw-r--r--include/modules/cap.h90
-rw-r--r--include/modules/dns.h193
-rw-r--r--include/modules/hash.h58
-rw-r--r--include/modules/httpd.h203
-rw-r--r--include/modules/regex.h55
-rw-r--r--include/modules/sasl.h (renamed from include/modes/umode_o.h)18
-rw-r--r--include/modules/spanningtree.h (renamed from include/modes/cmode_k.h)29
-rw-r--r--include/modules/sql.h184
-rw-r--r--include/modules/ssl.h172
-rw-r--r--include/numerics.h5
-rw-r--r--include/protocol.h6
-rw-r--r--include/snomasks.h5
-rw-r--r--include/socket.h9
-rw-r--r--include/socketengine.h14
-rw-r--r--include/testsuite.h6
-rw-r--r--include/threadengine.h8
-rw-r--r--include/threadengines/threadengine_pthread.h6
-rw-r--r--include/threadengines/threadengine_win32.h8
-rw-r--r--include/timer.h64
-rw-r--r--include/typedefs.h22
-rw-r--r--include/uid.h44
-rw-r--r--include/usermanager.h11
-rw-r--r--include/users.h153
-rw-r--r--include/xline.h16
57 files changed, 1804 insertions, 1620 deletions
diff --git a/include/bancache.h b/include/bancache.h
index a7aac7f17..7f51ca75e 100644
--- a/include/bancache.h
+++ b/include/bancache.h
@@ -18,8 +18,7 @@
*/
-#ifndef BANCACHE_H
-#define BANCACHE_H
+#pragma once
/** Stores a cached ban entry.
* Each ban has one of these hashed in a hash_map to make for faster removal
@@ -37,68 +36,50 @@ class CoreExport BanCacheHit
/** Reason, shown as quit message
*/
std::string Reason;
- /** IP to match against, no wildcards here (of course)
- */
- std::string IP;
/** Time that the ban expires at
*/
time_t Expiry;
- BanCacheHit(const std::string &ip, const std::string &type, const std::string &reason)
+ BanCacheHit(const std::string &type, const std::string &reason, time_t seconds)
+ : Type(type), Reason(reason), Expiry(ServerInstance->Time() + seconds)
{
- this->Type = type;
- this->Reason = reason;
- this->IP = ip;
- this->Expiry = ServerInstance->Time() + 86400; // a day. this might seem long, but entries will be removed as glines/etc expire.
}
- // overridden to allow custom time
- BanCacheHit(const std::string &ip, const std::string &type, const std::string &reason, time_t seconds)
- {
- this->Type = type;
- this->Reason = reason;
- this->IP = ip;
- this->Expiry = ServerInstance->Time() + seconds;
- }
+ bool IsPositive() const { return (!Reason.empty()); }
};
/* A container of ban cache items.
* must be defined after class BanCacheHit.
*/
-typedef nspace::hash_map<std::string, BanCacheHit*, nspace::hash<std::string> > BanCacheHash;
+typedef TR1NS::unordered_map<std::string, BanCacheHit*, TR1NS::hash<std::string> > BanCacheHash;
/** A manager for ban cache, which allocates and deallocates and checks cached bans.
*/
class CoreExport BanCacheManager
{
- private:
BanCacheHash* BanHash;
+ bool RemoveIfExpired(BanCacheHash::iterator& it);
+
public:
/** Creates and adds a Ban Cache item.
* @param ip The IP the item is for.
* @param type The type of ban cache item. std::string. .empty() means it's a negative match (user is allowed freely).
* @param reason The reason for the ban. Left .empty() if it's a negative match.
+ * @param seconds Number of seconds before nuking the bancache entry, the default is a day. This might seem long, but entries will be removed as glines/etc expire.
*/
- BanCacheHit *AddHit(const std::string &ip, const std::string &type, const std::string &reason);
-
- // Overridden to allow an optional number of seconds before expiry
- BanCacheHit *AddHit(const std::string &ip, const std::string &type, const std::string &reason, time_t seconds);
+ BanCacheHit *AddHit(const std::string &ip, const std::string &type, const std::string &reason, time_t seconds = 0);
BanCacheHit *GetHit(const std::string &ip);
- bool RemoveHit(BanCacheHit *b);
/** Removes all entries of a given type, either positive or negative. Returns the number of hits removed.
* @param type The type of bancache entries to remove (e.g. 'G')
* @param positive Remove either positive (true) or negative (false) hits.
*/
- unsigned int RemoveEntries(const std::string &type, bool positive);
+ void RemoveEntries(const std::string& type, bool positive);
BanCacheManager()
{
this->BanHash = new BanCacheHash();
}
~BanCacheManager();
- void RehashCache();
};
-
-#endif
diff --git a/include/base.h b/include/base.h
index 5308ed655..117ffab76 100644
--- a/include/base.h
+++ b/include/base.h
@@ -20,8 +20,7 @@
*/
-#ifndef BASE_H
-#define BASE_H
+#pragma once
#include <map>
#include <deque>
@@ -255,5 +254,3 @@ class CoreExport ServiceProvider : public classbase
virtual ~ServiceProvider();
};
-
-#endif
diff --git a/include/builtinmodes.h b/include/builtinmodes.h
new file mode 100644
index 000000000..a4a950922
--- /dev/null
+++ b/include/builtinmodes.h
@@ -0,0 +1,184 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2006 Craig Edwards <craigedwards@brainbox.cc>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "mode.h"
+#include "channels.h"
+#include "listmode.h"
+
+/** Channel mode +b
+ */
+class ModeChannelBan : public ListModeBase
+{
+ public:
+ ModeChannelBan()
+ : ListModeBase(NULL, "ban", 'b', "End of channel ban list", 367, 368, true, "maxbans")
+ {
+ }
+};
+
+/** Channel mode +i
+ */
+class ModeChannelInviteOnly : public SimpleChannelModeHandler
+{
+ public:
+ ModeChannelInviteOnly() : SimpleChannelModeHandler(NULL, "inviteonly", 'i')
+ {
+ }
+};
+
+/** Channel mode +k
+ */
+class ModeChannelKey : public ModeHandler
+{
+ public:
+ ModeChannelKey();
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
+ void RemoveMode(Channel* channel, irc::modestacker* stack = NULL);
+ void RemoveMode(User* user, irc::modestacker* stack = NULL);
+};
+
+
+/** Channel mode +l
+ */
+class ModeChannelLimit : public ParamChannelModeHandler
+{
+ public:
+ ModeChannelLimit();
+ bool ParamValidate(std::string& parameter);
+ bool ResolveModeConflict(std::string &their_param, const std::string &our_param, Channel* channel);
+};
+
+/** Channel mode +m
+ */
+class ModeChannelModerated : public SimpleChannelModeHandler
+{
+ public:
+ ModeChannelModerated() : SimpleChannelModeHandler(NULL, "moderated", 'm')
+ {
+ }
+};
+
+/** Channel mode +n
+ */
+class ModeChannelNoExternal : public SimpleChannelModeHandler
+{
+ public:
+ ModeChannelNoExternal() : SimpleChannelModeHandler(NULL, "noextmsg", 'n')
+ {
+ }
+};
+
+/** Channel mode +o
+ */
+class ModeChannelOp : public ModeHandler
+{
+ private:
+ public:
+ ModeChannelOp();
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
+ unsigned int GetPrefixRank();
+ void RemoveMode(Channel* channel, irc::modestacker* stack = NULL);
+ void RemoveMode(User* user, irc::modestacker* stack = NULL);
+};
+
+/** Channel mode +p
+ */
+class ModeChannelPrivate : public SimpleChannelModeHandler
+{
+ public:
+ ModeChannelPrivate() : SimpleChannelModeHandler(NULL, "private", 'p')
+ {
+ }
+};
+
+/** Channel mode +s
+ */
+class ModeChannelSecret : public SimpleChannelModeHandler
+{
+ public:
+ ModeChannelSecret() : SimpleChannelModeHandler(NULL, "secret", 's')
+ {
+ }
+};
+
+/** Channel mode +t
+ */
+class ModeChannelTopicOps : public SimpleChannelModeHandler
+{
+ public:
+ ModeChannelTopicOps() : SimpleChannelModeHandler(NULL, "topiclock", 't')
+ {
+ }
+};
+
+/** Channel mode +v
+ */
+class ModeChannelVoice : public ModeHandler
+{
+ private:
+ public:
+ ModeChannelVoice();
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
+ unsigned int GetPrefixRank();
+ void RemoveMode(User* user, irc::modestacker* stack = NULL);
+ void RemoveMode(Channel* channel, irc::modestacker* stack = NULL);
+};
+
+/** User mode +i
+ */
+class ModeUserInvisible : public SimpleUserModeHandler
+{
+ public:
+ ModeUserInvisible() : SimpleUserModeHandler(NULL, "invisible", 'i')
+ {
+ }
+};
+
+/** User mode +n
+ */
+class ModeUserServerNoticeMask : public ModeHandler
+{
+ public:
+ ModeUserServerNoticeMask();
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
+ void OnParameterMissing(User* user, User* dest, Channel* channel);
+ std::string GetUserParameter(User* user);
+};
+
+/** User mode +o
+ */
+class ModeUserOperator : public ModeHandler
+{
+ public:
+ ModeUserOperator();
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
+};
+
+/** User mode +w
+ */
+class ModeUserWallops : public SimpleUserModeHandler
+{
+ public:
+ ModeUserWallops() : SimpleUserModeHandler(NULL, "wallops", 'w')
+ {
+ }
+};
diff --git a/include/caller.h b/include/caller.h
index 64b37611f..f69ff6796 100644
--- a/include/caller.h
+++ b/include/caller.h
@@ -3,6 +3,7 @@
*
* Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
* Copyright (C) 2007 Craig Edwards <craigedwards@brainbox.cc>
+ * Copyright (C) 2012 Adam <Adam@anope.org>
*
* 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
@@ -18,8 +19,80 @@
*/
-#ifndef CALLER_H
-#define CALLER_H
+#pragma once
+
+/* Pending some sort of C++11 support */
+#if 0
+
+template<typename ReturnType, typename... Args> class CoreExport Handler : public classbase
+{
+ public:
+ virtual ~Handler() { }
+ virtual ReturnType Call(Args...) = 0;
+};
+
+template<typename ReturnType, typename... Args> class CoreExport Caller
+{
+ public:
+ Handler<ReturnType, Args...>* target;
+
+ Caller(Handler<ReturnType, Args...>* initial) : target(initial) { }
+ virtual ~Caller() { }
+
+ virtual ReturnType operator()(const Args&... params)
+ {
+ return this->target->Call(params...);
+ }
+};
+
+/* Below here is compat with the old API */
+#define HandlerBase0 Handler
+#define HandlerBase1 Handler
+#define HandlerBase2 Handler
+#define HandlerBase3 Handler
+#define HandlerBase4 Handler
+#define HandlerBase5 Handler
+#define HandlerBase6 Handler
+#define HandlerBase7 Handler
+#define HandlerBase8 Handler
+
+#define caller1 Caller
+#define caller2 Caller
+#define caller3 Caller
+#define caller4 Caller
+#define caller5 Caller
+#define caller6 Caller
+#define caller7 Caller
+#define caller8 Caller
+
+#define DEFINE_HANDLER0(NAME, RETURN) \
+ class CoreExport NAME : public Handler<RETURN> { public: NAME() { } virtual RETURN Call(); }
+
+#define DEFINE_HANDLER1(NAME, RETURN, V1) \
+ class CoreExport NAME : public Handler<RETURN, V1> { public: NAME() { } virtual RETURN Call(V1); }
+
+#define DEFINE_HANDLER2(NAME, RETURN, V1, V2) \
+ class CoreExport NAME : public Handler<RETURN, V1, V2> { public: NAME() { } virtual RETURN Call(V1, V2); }
+
+#define DEFINE_HANDLER3(NAME, RETURN, V1, V2, V3) \
+ class CoreExport NAME : public Handler<RETURN, V1, V2, V3> { public: NAME() { } virtual RETURN Call(V1, V2, V3); }
+
+#define DEFINE_HANDLER4(NAME, RETURN, V1, V2, V3, V4) \
+ class CoreExport NAME : public Handler<RETURN, V1, V2, V3, V4> { public: NAME() { } virtual RETURN Call(V1, V2, V3, V4); }
+
+#define DEFINE_HANDLER5(NAME, RETURN, V1, V2, V3, V4, V5) \
+ class CoreExport NAME : public Handler<RETURN, V1, V2, V3, V4, V5> { public: NAME() { } virtual RETURN Call(V1, V2, V3, V4, V5); }
+
+#define DEFINE_HANDLER6(NAME, RETURN, V1, V2, V3, V4, V5, V6) \
+ class CoreExport NAME : public Handler<RETURN, V1, V2, V3, V4, V5, V6> { public: NAME() { } virtual RETURN Call(V1, V2, V3, V4, V5, V6); }
+
+#define DEFINE_HANDLER7(NAME, RETURN, V1, V2, V3, V4, V5, V6, V7) \
+ class CoreExport NAME : public Handler<RETURN, V1, V2, V3, V4, V5, V6, V7> { public: NAME() { } virtual RETURN Call(V1, V2, V3, V4, V5, V6, V7); }
+
+#define DEFINE_HANDLER8(NAME, RETURN, V1, V2, V3, V4, V5, V6, V7, V8) \
+ class CoreExport NAME : public Handler<RETURN, V1, V2, V3, V4, V5, V6, V7, V8> { public: NAME() { } virtual RETURN Call(V1, V2, V3, V4, V5, V6, V7, V8); }
+
+#else
/** The templates below can be auto generated by tools/create_templates.pl.
* They are used to represent a functor with a given number of parameters and
diff --git a/include/channels.h b/include/channels.h
index dda53f69d..2b2681eac 100644
--- a/include/channels.h
+++ b/include/channels.h
@@ -20,8 +20,7 @@
*/
-#ifndef CHANNELS_H
-#define CHANNELS_H
+#pragma once
#include "membership.h"
#include "mode.h"
@@ -29,28 +28,6 @@
/** Holds an entry for a ban list, exemption list, or invite list.
* This class contains a single element in a channel list, such as a banlist.
*/
-class HostItem
-{
- public:
- /** Time the item was added
- */
- time_t set_time;
- /** Who added the item
- */
- std::string set_by;
- /** The actual item data
- */
- std::string data;
-
- HostItem() { /* stub */ }
- virtual ~HostItem() { /* stub */ }
-};
-
-/** A subclass of HostItem designed to hold channel bans (+b)
- */
-class BanItem : public HostItem
-{
-};
/** Holds all relevent information for a channel.
* This class represents a channel, and contains its name, modes, topic, topic set time,
@@ -58,18 +35,10 @@ class BanItem : public HostItem
*/
class CoreExport Channel : public Extensible, public InviteBase
{
- /** Connect a Channel to a User
- */
- static Channel* ForceChan(Channel* Ptr, User* user, const std::string &privs, bool bursting, bool created);
-
/** Set default modes for the channel on creation
*/
void SetDefaultModes();
- /** Maximum number of bans (cached)
- */
- int maxbans;
-
/** Modes for the channel.
* This is not a null terminated string! It is a bitset where
* each item in it represents if a mode is set. For example
@@ -116,10 +85,6 @@ class CoreExport Channel : public Extensible, public InviteBase
*/
std::string setby; /* 128 */
- /** The list of all bans set on the channel.
- */
- BanList bans;
-
/** Sets or unsets a custom mode in the channels info
* @param mode The mode character to set or unset
* @param value True if you want to set the mode or false if you want to remove it
@@ -220,16 +185,24 @@ class CoreExport Channel : public Extensible, public InviteBase
*/
void PartUser(User *user, std::string &reason);
- /* Join a user to a channel. May be a channel that doesnt exist yet.
+ /** Join a local user to a channel, with or without permission checks. May be a channel that doesn't exist yet.
* @param user The user to join to the channel.
- * @param cn The channel name to join to. Does not have to exist.
+ * @param channame The channel name to join to. Does not have to exist.
* @param key The key of the channel, if given
* @param override If true, override all join restrictions such as +bkil
* @return A pointer to the Channel the user was joined to. A new Channel may have
* been created if the channel did not exist before the user was joined to it.
- * If the user could not be joined to a channel, the return value may be NULL.
+ * If the user could not be joined to a channel, the return value is NULL.
+ */
+ static Channel* JoinUser(LocalUser* user, std::string channame, bool override = false, const std::string& key = "");
+
+ /** Join a user to an existing channel, without doing any permission checks
+ * @param user The user to join to the channel
+ * @param privs Priviliges (prefix mode letters) to give to this user, may be NULL
+ * @param bursting True if this join is the result of a netburst (passed to modules in the OnUserJoin hook)
+ * @param created True if this channel was just created by a local user (passed to modules in the OnUserJoin hook)
*/
- static Channel* JoinUser(User *user, const char* cn, bool override, const char* key, bool bursting, time_t TS = 0);
+ void ForceJoin(User* user, const std::string* privs = NULL, bool bursting = false, bool created_by_local = false);
/** Write to a channel, from a user, using va_args for text
* @param user User whos details to prefix the line with
@@ -301,11 +274,6 @@ class CoreExport Channel : public Extensible, public InviteBase
/** Write a line of text that already includes the source */
void RawWriteAllExcept(User* user, bool serversource, char status, CUList &except_list, const std::string& text);
- /** Returns the maximum number of bans allowed to be set on this channel
- * @return The maximum number of bans allowed
- */
- long GetMaxBans();
-
/** Return the channel's modes with parameters.
* @param showkey If this is set to true, the actual key is shown,
* otherwise it is replaced with '&lt;KEY&gt;'
@@ -388,10 +356,4 @@ class CoreExport Channel : public Extensible, public InviteBase
/** Get the status of an "action" type extban
*/
ModResult GetExtBanStatus(User *u, char type);
-
- /** Clears the cached max bans value
- */
- void ResetMaxBans();
};
-
-#endif
diff --git a/include/command_parse.h b/include/command_parse.h
index f6ff588e1..e865018e4 100644
--- a/include/command_parse.h
+++ b/include/command_parse.h
@@ -20,8 +20,7 @@
*/
-#ifndef COMMAND_PARSE_H
-#define COMMAND_PARSE_H
+#pragma once
/** A list of dll/so files containing the command handlers for the core
*/
@@ -175,5 +174,3 @@ const int duration_multi[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
-
-#endif
diff --git a/include/commands/cmd_whowas.h b/include/commands/cmd_whowas.h
index d33354122..7e1eeefc9 100644
--- a/include/commands/cmd_whowas.h
+++ b/include/commands/cmd_whowas.h
@@ -19,39 +19,13 @@
*/
-#ifndef CMD_WHOWAS_H
-#define CMD_WHOWAS_H
-#include "modules.h"
-
-struct WhowasRequest : public Request
-{
- /* list of available internal commands */
- enum Internals
- {
- WHOWAS_ADD = 1,
- WHOWAS_STATS = 2,
- WHOWAS_PRUNE = 3,
- WHOWAS_MAINTAIN = 4
- };
-
- const Internals type;
- std::string value;
- User* user;
-
- WhowasRequest(Module* src, Module* whowas, Internals Type) : Request(src, whowas, "WHOWAS"), type(Type)
- {}
-};
+#pragma once
-/* Forward ref for timer */
-class WhoWasMaintainTimer;
+#include "modules.h"
/* Forward ref for typedefs */
class WhoWasGroup;
-/** Timer that is used to maintain the whowas list, called once an hour
- */
-extern WhoWasMaintainTimer* timer;
-
/** A group of users related by nickname
*/
typedef std::deque<WhoWasGroup*> whowas_set;
@@ -81,6 +55,19 @@ class CommandWhowas : public Command
whowas_users_fifo whowas_fifo;
public:
+ /** Max number of WhoWas entries per user.
+ */
+ int WhoWasGroupSize;
+
+ /** Max number of cumulative user-entries in WhoWas.
+ * When max reached and added to, push out oldest entry FIFO style.
+ */
+ int WhoWasMaxGroups;
+
+ /** Max seconds a user is kept in WhoWas before being pruned.
+ */
+ int WhoWasMaxKeep;
+
CommandWhowas(Module* parent);
/** Handle command.
* @param parameters The parameters to the comamnd
@@ -127,15 +114,3 @@ class WhoWasGroup
*/
~WhoWasGroup();
};
-
-class WhoWasMaintainTimer : public Timer
-{
- public:
- WhoWasMaintainTimer(long interval)
- : Timer(interval, ServerInstance->Time(), true)
- {
- }
- virtual void Tick(time_t TIME);
-};
-
-#endif
diff --git a/include/configparser.h b/include/configparser.h
index 999d79e24..8292fdda5 100644
--- a/include/configparser.h
+++ b/include/configparser.h
@@ -17,6 +17,8 @@
*/
+#pragma once
+
struct fpos
{
std::string filename;
@@ -31,7 +33,7 @@ struct fpos
enum ParseFlags
{
- FLAG_USE_XML = 1,
+ FLAG_USE_COMPAT = 1,
FLAG_NO_EXEC = 2,
FLAG_NO_INC = 4
};
@@ -76,5 +78,3 @@ struct FileWrapper
}
}
};
-
-
diff --git a/include/configreader.h b/include/configreader.h
index 09d4e619d..bdba0efc3 100644
--- a/include/configreader.h
+++ b/include/configreader.h
@@ -21,8 +21,7 @@
*/
-#ifndef INSPIRCD_CONFIGREADER
-#define INSPIRCD_CONFIGREADER
+#pragma once
#include <sstream>
#include <string>
@@ -240,19 +239,6 @@ class CoreExport ServerConfig
*/
int c_ipv6_range;
- /** Max number of WhoWas entries per user.
- */
- int WhoWasGroupSize;
-
- /** Max number of cumulative user-entries in WhoWas.
- * When max reached and added to, push out oldest entry FIFO style.
- */
- int WhoWasMaxGroups;
-
- /** Max seconds a user is kept in WhoWas before being pruned.
- */
- int WhoWasMaxKeep;
-
/** Holds the server name of the local server
* as defined by the administrator.
*/
@@ -334,10 +320,6 @@ class CoreExport ServerConfig
*/
std::string FixedPart;
- /** The DNS server to use for DNS queries
- */
- std::string DNSServer;
-
/** Pretend disabled commands don't exist.
*/
bool DisabledDontExist;
@@ -445,16 +427,6 @@ class CoreExport ServerConfig
*/
ClassVector Classes;
- /** The 005 tokens of this server (ISUPPORT)
- * populated/repopulated upon loading or unloading
- * modules.
- */
- std::string data005;
-
- /** isupport strings
- */
- std::vector<std::string> isupport;
-
/** STATS characters in this list are available
* only to operators.
*/
@@ -472,14 +444,6 @@ class CoreExport ServerConfig
*/
std::map<irc::string, bool> ulines;
- /** Max banlist sizes for channels (the std::string is a glob)
- */
- std::map<std::string, int> maxbans;
-
- /** If set to true, no user DNS lookups are to be performed
- */
- bool NoUserDns;
-
/** If set to true, provide syntax hints for unknown commands
*/
bool SyntaxHints;
@@ -532,14 +496,6 @@ class CoreExport ServerConfig
*/
const std::string& GetSID();
- /** Update the 005 vector
- */
- void Update005();
-
- /** Send the 005 numerics (ISUPPORT) to a user
- */
- void Send005(User* user);
-
/** Read the entire configuration into memory
* and initialize this class. All other methods
* should be used only by the core.
@@ -578,11 +534,6 @@ class CoreExport ServerConfig
/** If this value is true, snotices will not stack when repeats are sent
*/
bool NoSnoticeStack;
-
- /** If true, a "Welcome to <networkname>!" NOTICE will be sent to
- * connecting users
- */
- bool WelcomeNotice;
};
/** The background thread for config reading, so that reading from executable includes
@@ -609,5 +560,3 @@ class CoreExport ConfigReaderThread : public Thread
void Finish();
bool IsDone() { return done; }
};
-
-#endif
diff --git a/include/consolecolors.h b/include/consolecolors.h
index f7ca1335e..9b7e0670a 100644
--- a/include/consolecolors.h
+++ b/include/consolecolors.h
@@ -14,8 +14,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef CONSOLECOLORS_H
-#define CONSOLECOLORS_H
+
+#pragma once
#include <ostream>
@@ -96,5 +96,3 @@ inline std::ostream& con_reset(std::ostream &s)
}
#endif
-
-#endif
diff --git a/include/ctables.h b/include/ctables.h
index f9cd08cb3..2ccca0f7b 100644
--- a/include/ctables.h
+++ b/include/ctables.h
@@ -21,8 +21,7 @@
*/
-#ifndef CTABLES_H
-#define CTABLES_H
+#pragma once
/** Used to indicate command success codes
*/
@@ -252,5 +251,3 @@ class CoreExport SplitCommand : public Command
translation.push_back(x5);translation.push_back(x6);translation.push_back(x7);
#define TRANSLATE8(x1,x2,x3,x4,x5,x6,x7,x8) translation.push_back(x1);translation.push_back(x2);translation.push_back(x3);translation.push_back(x4);\
translation.push_back(x5);translation.push_back(x6);translation.push_back(x7);translation.push_back(x8);
-
-#endif
diff --git a/include/cull_list.h b/include/cull_list.h
index 75b08b7a3..ac64dced2 100644
--- a/include/cull_list.h
+++ b/include/cull_list.h
@@ -20,8 +20,7 @@
*/
-#ifndef CULL_LIST_H
-#define CULL_LIST_H
+#pragma once
/**
* The CullList class is used to delete objects at the end of the main loop to
@@ -58,6 +57,3 @@ class CoreExport ActionList
void Run();
};
-
-#endif
-
diff --git a/include/dns.h b/include/dns.h
deleted file mode 100644
index 27c3c8848..000000000
--- a/include/dns.h
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2005-2008 Craig Edwards <craigedwards@brainbox.cc>
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *
- * 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
- * License as published by the Free Software Foundation, version 2.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-
-/*
-dns.h - dns library very very loosely based on
-firedns, Copyright (C) 2002 Ian Gulliver
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of version 2 of the GNU General Public License as
-published by the Free Software Foundation.
-
-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
-*/
-
-#ifndef DNS_H
-#define DNS_H
-
-#include "socket.h"
-#include "hashcomp.h"
-
-/**
- * Result status, used internally
- */
-class CoreExport DNSResult
-{
- public:
- /** Result ID
- */
- int id;
- /** Result body, a hostname or IP address
- */
- std::string result;
- /** Time-to-live value of the result
- */
- unsigned long ttl;
- /** The original request, a hostname or IP address
- */
- std::string original;
-
- /** Build a DNS result.
- * @param i The request ID
- * @param res The request result, a hostname or IP
- * @param timetolive The request time-to-live
- * @param orig The original request, a hostname or IP
- */
- DNSResult(int i, const std::string &res, unsigned long timetolive, const std::string &orig) : id(i), result(res), ttl(timetolive), original(orig) { }
-};
-
-/**
- * Information on a completed lookup, used internally
- */
-typedef std::pair<unsigned char*, std::string> DNSInfo;
-
-/** Cached item stored in the query cache.
- */
-class CoreExport CachedQuery
-{
- public:
- /** The cached result data, an IP or hostname
- */
- std::string data;
- /** The time when the item is due to expire
- */
- time_t expires;
-
- /** Build a cached query
- * @param res The result data, an IP or hostname
- * @param ttl The time-to-live value of the query result
- */
- CachedQuery(const std::string &res, unsigned int ttl);
-
- /** Returns the number of seconds remaining before this
- * cache item has expired and should be removed.
- */
- int CalcTTLRemaining();
-};
-
-/** DNS cache information. Holds IPs mapped to hostnames, and hostnames mapped to IPs.
- */
-typedef nspace::hash_map<irc::string, CachedQuery, irc::hash> dnscache;
-
-/**
- * Error types that class Resolver can emit to its error method.
- */
-enum ResolverError
-{
- RESOLVER_NOERROR = 0,
- RESOLVER_NSDOWN = 1,
- RESOLVER_NXDOMAIN = 2,
- RESOLVER_BADIP = 3,
- RESOLVER_TIMEOUT = 4,
- RESOLVER_FORCEUNLOAD = 5
-};
-
-/**
- * Query and resource record types
- */
-enum QueryType
-{
- /** Uninitialized Query */
- DNS_QUERY_NONE = 0,
- /** 'A' record: an ipv4 address */
- DNS_QUERY_A = 1,
- /** 'CNAME' record: An alias */
- DNS_QUERY_CNAME = 5,
- /** 'PTR' record: a hostname */
- DNS_QUERY_PTR = 12,
- /** 'AAAA' record: an ipv6 address */
- DNS_QUERY_AAAA = 28,
-
- /** Force 'PTR' to use IPV4 scemantics */
- DNS_QUERY_PTR4 = 0xFFFD,
- /** Force 'PTR' to use IPV6 scemantics */
- DNS_QUERY_PTR6 = 0xFFFE
-};
-
-/**
- * Used internally to force PTR lookups to use a certain protocol scemantics,
- * e.g. x.x.x.x.in-addr.arpa for v4, and *.ip6.arpa for v6.
- */
-enum ForceProtocol
-{
- /** Forced to use ipv4 */
- PROTOCOL_IPV4 = 0,
- /** Forced to use ipv6 */
- PROTOCOL_IPV6 = 1
-};
-
-/**
- * The Resolver class is a high-level abstraction for resolving DNS entries.
- * It can do forward and reverse IPv4 lookups, and where IPv6 is supported, will
- * also be able to do those, transparent of protocols. Module developers must
- * extend this class via inheritence, and then insert a pointer to their derived
- * class into the core using Server::AddResolver(). Once you have done this,
- * the class will be able to receive callbacks. There are two callbacks which
- * can occur by calling virtual methods, one is a success situation, and the other
- * an error situation.
- */
-class CoreExport Resolver
-{
- protected:
- /**
- * Pointer to creator module (if any, or NULL)
- */
- ModuleRef Creator;
- /**
- * The input data, either a host or an IP address
- */
- std::string input;
- /**
- * True if a forward lookup is being performed, false if otherwise
- */
- QueryType querytype;
- /**
- * The DNS erver being used for lookups. If this is an empty string,
- * the value of ServerConfig::DNSServer is used instead.
- */
- std::string server;
- /**
- * The ID allocated to your lookup. This is a pseudo-random number
- * between 0 and 65535, a value of -1 indicating a failure.
- * The core uses this to route results to the correct objects.
- */
- int myid;
-
- /**
- * Cached result, if there is one
- */
- CachedQuery *CQ;
-
- /**
- * Time left before cache expiry
- */
- int time_left;
-
- public:
- /**
- * Initiate DNS lookup. Your class should not attempt to delete or free these
- * objects, as the core will do this for you. They must always be created upon
- * the heap using new, as you cannot be sure at what time they will be deleted.
- * Allocating them on the stack or attempting to delete them yourself could cause
- * the object to go 'out of scope' and cause a segfault in the core if the result
- * arrives at a later time.
- * @param source The IP or hostname to resolve
- * @param qt The query type to perform. Resolution of 'A', 'AAAA', 'PTR' and 'CNAME' records
- * is supported. Use one of the QueryType enum values to initiate this type of
- * lookup. Resolution of 'AAAA' ipv6 records is always supported, regardless of
- * wether InspIRCd is built with ipv6 support.
- * To look up reverse records, specify one of DNS_QUERY_PTR4 or DNS_QUERY_PTR6 depending
- * on the type of address you are looking up.
- * @param cached The constructor will set this boolean to true or false depending
- * on whether the DNS lookup you are attempting is cached (and not expired) or not.
- * If the value is cached, upon return this will be set to true, otherwise it will
- * be set to false. You should pass this value to InspIRCd::AddResolver(), which
- * will then influence the behaviour of the method and determine whether a cached
- * or non-cached result is obtained. The value in this variable is always correct
- * for the given request when the constructor exits.
- * @param creator See the note below.
- * @throw ModuleException This class may throw an instance of ModuleException, in the
- * event a lookup could not be allocated, or a similar hard error occurs such as
- * the network being down. This will also be thrown if an invalid IP address is
- * passed when resolving a 'PTR' record.
- *
- * NOTE: If you are instantiating your DNS lookup from a module, you should set the
- * value of creator to point at your Module class. This way if your module is unloaded
- * whilst lookups are in progress, they can be safely removed and your module will not
- * crash the server.
- */
- Resolver(const std::string &source, QueryType qt, bool &cached, Module* creator);
-
- /**
- * The default destructor does nothing.
- */
- virtual ~Resolver();
-
- /**
- * When your lookup completes, this method will be called.
- * @param result The resulting DNS lookup, either an IP address or a hostname.
- * @param ttl The time-to-live value of the result, in the instance of a cached
- * result, this is the number of seconds remaining before refresh/expiry.
- * @param cached True if the result is a cached result, false if it was requested
- * from the DNS server.
- */
- virtual void OnLookupComplete(const std::string &result, unsigned int ttl, bool cached) = 0;
-
- /**
- * If an error occurs (such as NXDOMAIN, no domain name found) then this method
- * will be called.
- * @param e A ResolverError enum containing the error type which has occured.
- * @param errormessage The error text of the error that occured.
- */
- virtual void OnError(ResolverError e, const std::string &errormessage);
-
- /**
- * Returns the id value of this class. This is primarily used by the core
- * to determine where in various tables to place a pointer to your class, but it
- * is safe to call and use this method.
- * As specified in RFC1035, each dns request has a 16 bit ID value, ranging
- * from 0 to 65535. If there is an issue and the core cannot send your request,
- * this method will return -1.
- */
- int GetId();
-
- /**
- * Returns the creator module, or NULL
- */
- Module* GetCreator();
-
- /**
- * If the result is a cached result, this triggers the objects
- * OnLookupComplete. This is done because it is not safe to call
- * the abstract virtual method from the constructor.
- */
- void TriggerCachedResult();
-};
-
-/** DNS is a singleton class used by the core to dispatch dns
- * requests to the dns server, and route incoming dns replies
- * back to Resolver objects, based upon the request ID. You
- * should never use this class yourself.
- */
-class CoreExport DNS : public EventHandler
-{
- private:
-
- /**
- * The maximum value of a dns request id,
- * 16 bits wide, 0xFFFF.
- */
- static const int MAX_REQUEST_ID = 0xFFFF;
-
- /**
- * Currently cached items
- */
- dnscache* cache;
-
- /** A timer which ticks every hour to remove expired
- * items from the DNS cache.
- */
- class CacheTimer* PruneTimer;
-
- /**
- * Build a dns packet payload
- */
- int MakePayload(const char* name, const QueryType rr, const unsigned short rr_class, unsigned char* payload);
-
- public:
-
- irc::sockets::sockaddrs myserver;
-
- /**
- * Currently active Resolver classes
- */
- Resolver* Classes[MAX_REQUEST_ID];
-
- /**
- * Requests that are currently 'in flight'
- */
- DNSRequest* requests[MAX_REQUEST_ID];
-
- /**
- * The port number DNS requests are made on,
- * and replies have as a source-port number.
- */
- static const int QUERY_PORT = 53;
-
- /**
- * Fill an rr (resource record) with data from input
- */
- static void FillResourceRecord(ResourceRecord* rr, const unsigned char* input);
-
- /**
- * Fill a header with data from input limited by a length
- */
- static void FillHeader(DNSHeader *header, const unsigned char *input, const int length);
-
- /**
- * Empty out a header into a data stream ready for transmission "on the wire"
- */
- static void EmptyHeader(unsigned char *output, const DNSHeader *header, const int length);
-
- /**
- * Start the lookup of an ipv4 from a hostname
- */
- int GetIP(const char* name);
-
- /**
- * Start lookup of a hostname from an ip, but
- * force a specific protocol to be used for the lookup
- * for example to perform an ipv6 reverse lookup.
- */
- int GetNameForce(const char *ip, ForceProtocol fp);
-
- /**
- * Start lookup of an ipv6 from a hostname
- */
- int GetIP6(const char *name);
-
- /**
- * Start lookup of a CNAME from another hostname
- */
- int GetCName(const char* alias);
-
- /**
- * Fetch the result string (an ip or host)
- * and/or an error message to go with it.
- */
- DNSResult GetResult();
-
- /**
- * Handle a SocketEngine read event
- * Inherited from EventHandler
- */
- void HandleEvent(EventType et, int errornum = 0);
-
- /**
- * Add a Resolver* to the list of active classes
- */
- bool AddResolverClass(Resolver* r);
-
- /**
- * Add a query to the list to be sent
- */
- DNSRequest* AddQuery(DNSHeader *header, int &id, const char* original);
-
- /**
- * The constructor initialises the dns socket,
- * and clears the request lists.
- */
- DNS();
-
- /**
- * Re-initialize the DNS subsystem.
- */
- void Rehash();
-
- /**
- * Destructor
- */
- ~DNS();
-
- /**
- * Turn an in6_addr into a .ip6.arpa domain
- */
- static void MakeIP6Int(char* query, const in6_addr *ip);
-
- /**
- * Clean out all dns resolvers owned by a particular
- * module, to make unloading a module safe if there
- * are dns requests currently in progress.
- */
- void CleanResolvers(Module* module);
-
- /** Return the cached value of an IP or hostname
- * @param source An IP or hostname to find in the cache.
- * @return A pointer to a CachedQuery if the item exists,
- * otherwise NULL.
- */
- CachedQuery* GetCache(const std::string &source);
-
- /** Delete a cached item from the DNS cache.
- * @param source An IP or hostname to remove
- */
- void DelCache(const std::string &source);
-
- /** Clear all items from the DNS cache immediately.
- */
- int ClearCache();
-
- /** Prune the DNS cache, e.g. remove all expired
- * items and rehash the cache buckets, but leave
- * items in the hash which are still valid.
- */
- int PruneCache();
-};
-
-#endif
-
diff --git a/include/dynamic.h b/include/dynamic.h
index 5e66ddbb0..d42cf61bf 100644
--- a/include/dynamic.h
+++ b/include/dynamic.h
@@ -20,8 +20,7 @@
*/
-#ifndef DLL_H
-#define DLL_H
+#pragma once
/** The DLLManager class is able to load a module file by filename,
* and locate its init_module symbol.
@@ -65,6 +64,3 @@ class CoreExport DLLManager : public classbase
/** Get detailed version information from the module file */
std::string GetVersion();
};
-
-#endif
-
diff --git a/include/exitcodes.h b/include/exitcodes.h
index d4890c94d..888431969 100644
--- a/include/exitcodes.h
+++ b/include/exitcodes.h
@@ -19,8 +19,7 @@
*/
-#ifndef EXITCODE_H
-#define EXITCODE_H
+#pragma once
/** Valid exit codes to be used with InspIRCd::Exit()
*/
@@ -52,6 +51,3 @@ enum ExitStatus
* human-readable strings to be shown on shutdown.
*/
extern const char * ExitCodes[];
-
-#endif
-
diff --git a/include/extensible.h b/include/extensible.h
index bcc4992bb..e062f66a5 100644
--- a/include/extensible.h
+++ b/include/extensible.h
@@ -17,8 +17,7 @@
*/
-#ifndef EXTENSIBLE_H
-#define EXTENSIBLE_H
+#pragma once
#include <stdint.h>
@@ -190,5 +189,3 @@ class CoreExport StringExtItem : public ExtensionItem
void unset(Extensible* container);
void free(void* item);
};
-
-#endif
diff --git a/include/filelogger.h b/include/filelogger.h
index 22a94c934..091dc9a03 100644
--- a/include/filelogger.h
+++ b/include/filelogger.h
@@ -18,24 +18,22 @@
*/
-#ifndef FILELOGGER_H
-#define FILELOGGER_H
+#pragma once
#include "logger.h"
-/** Debug levels for use with InspIRCd::Log()
+/** Logging levels for use with InspIRCd::Log()
* */
-enum DebugLevel
+enum LogLevel
{
- RAWIO = 5,
- DEBUG = 10,
- VERBOSE = 20,
- DEFAULT = 30,
- SPARSE = 40,
- NONE = 50
+ LOG_RAWIO = 5,
+ LOG_DEBUG = 10,
+ LOG_VERBOSE = 20,
+ LOG_DEFAULT = 30,
+ LOG_SPARSE = 40,
+ LOG_NONE = 50
};
-
/* Forward declaration -- required */
class InspIRCd;
@@ -52,6 +50,3 @@ class CoreExport FileLogStream : public LogStream
virtual void OnLog(int loglevel, const std::string &type, const std::string &msg);
};
-
-#endif
-
diff --git a/include/hash_map.h b/include/hash_map.h
deleted file mode 100644
index 1b43f0118..000000000
--- a/include/hash_map.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2009 Robin Burchell <robin+git@viroteck.net>
- * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- * Copyright (C) 2006 Oliver Lupton <oliverlupton@gmail.com>
- *
- * 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
- * License as published by the Free Software Foundation, version 2.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef INSPIRCD_HASHMAP_H
-#define INSPIRCD_HASHMAP_H
-
- /** Where hash_map is varies from compiler to compiler
- * as it is not standard unless we have tr1.
- *
- * TODO: in 2.2 if we drop support for libstdc++ older than 3.4.7 and GCC older
- * than 4.1 this can be cleaned up massively.
- */
- #ifndef _WIN32
- #if __GLIBCXX__ > 20060309
- // GCC4+ has deprecated hash_map and uses tr1. But of course, uses a different include to MSVC. FOR FUCKS SAKE.
- #include <tr1/unordered_map>
- #define HAS_TR1_UNORDERED
- #define HASHMAP_DEPRECATED
- #else
- #include <ext/hash_map>
- /** Oddball linux namespace for hash_map */
- #define nspace __gnu_cxx
- #define BEGIN_HASHMAP_NAMESPACE namespace nspace {
- #define END_HASHMAP_NAMESPACE }
- #endif
- #else
- #include <unordered_map>
- #define HAS_TR1_UNORDERED
- #define HASHMAP_DEPRECATED
- #endif
-
- // tr1: restoring sanity to our headers. now if only compiler vendors could agree on a FUCKING INCLUDE FILE.
- #ifdef HAS_TR1_UNORDERED
- #define hash_map unordered_map
- #define nspace std::tr1
- #define BEGIN_HASHMAP_NAMESPACE namespace std { namespace tr1 {
- #define END_HASHMAP_NAMESPACE } }
- #endif
-
-#endif
diff --git a/include/hashcomp.h b/include/hashcomp.h
index 78d7ee878..3c00844be 100644
--- a/include/hashcomp.h
+++ b/include/hashcomp.h
@@ -22,8 +22,7 @@
*/
-#ifndef HASHCOMP_H
-#define HASHCOMP_H
+#pragma once
#include <cstring>
#include <string>
@@ -31,7 +30,7 @@
#include <deque>
#include <map>
#include <set>
-#include "hash_map.h"
+#include "inspircd.h"
/*******************************************************
* This file contains classes and templates that deal
@@ -110,6 +109,11 @@ namespace irc
bool operator()(const std::string& s1, const std::string& s2) const;
};
+ struct insensitive
+ {
+ size_t CoreExport operator()(const std::string &s) const;
+ };
+
/** The irc_char_traits class is used for RFC-style comparison of strings.
* This class is used to implement irc::string, a case-insensitive, RFC-
* comparing string class.
@@ -280,15 +284,7 @@ namespace irc
* mode changes to be obtained.
*/
int GetStackedLine(std::vector<std::string> &result, int max_line_size = 360);
-
- /** deprecated compatability interface - TODO remove */
- int GetStackedLine(std::deque<std::string> &result, int max_line_size = 360) {
- std::vector<std::string> r;
- int n = GetStackedLine(r, max_line_size);
- result.clear();
- result.insert(result.end(), r.begin(), r.end());
- return n;
- }
+
};
/** irc::tokenstream reads a string formatted as per RFC1459 and RFC2812.
@@ -590,72 +586,3 @@ inline std::string& trim(std::string &str)
return str;
}
-
-/** Hashing stuff is totally different on vc++'s hash_map implementation, so to save a buttload of
- * \#ifdefs we'll just do it all at once. Except, of course, with TR1, when it's the same as GCC.
- */
-BEGIN_HASHMAP_NAMESPACE
-
- /** Hashing function to hash irc::string
- */
-#if defined(_WIN32) && !defined(HAS_TR1_UNORDERED)
- template<> class CoreExport hash_compare<irc::string, std::less<irc::string> >
- {
- public:
- enum { bucket_size = 4, min_buckets = 8 }; /* Got these numbers from the CRT source, if anyone wants to change them feel free. */
-
- /** Compare two irc::string values for hashing in hash_map
- */
- bool operator()(const irc::string & s1, const irc::string & s2) const
- {
- if(s1.length() != s2.length()) return true;
- return (irc::irc_char_traits::compare(s1.c_str(), s2.c_str(), (size_t)s1.length()) < 0);
- }
-
- /** Hash an irc::string value for hash_map
- */
- size_t operator()(const irc::string & s) const;
- };
-
- template<> class CoreExport hash_compare<std::string, std::less<std::string> >
- {
- public:
- enum { bucket_size = 4, min_buckets = 8 }; /* Again, from the CRT source */
-
- /** Compare two std::string values for hashing in hash_map
- */
- bool operator()(const std::string & s1, const std::string & s2) const
- {
- if(s1.length() != s2.length()) return true;
- return (irc::irc_char_traits::compare(s1.c_str(), s2.c_str(), (size_t)s1.length()) < 0);
- }
-
- /** Hash a std::string using RFC1459 case sensitivity rules
- * @param s A string to hash
- * @return The hash value
- */
- size_t operator()(const std::string & s) const;
- };
-#else
-
- /* XXX FIXME: Implement a hash function overriding std::string's that works with TR1! */
-
-#ifdef HASHMAP_DEPRECATED
- struct insensitive
-#else
- CoreExport template<> struct hash<std::string>
-#endif
- {
- size_t CoreExport operator()(const std::string &s) const;
- };
-
-#endif
-
- /** Convert a string to lower case respecting RFC1459
- * @param n A string to lowercase
- */
- void strlower(char *n);
-
-END_HASHMAP_NAMESPACE
-
-#endif
diff --git a/include/inspircd.h b/include/inspircd.h
index 86853a94f..bc0b9cd1b 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -23,8 +23,7 @@
*/
-#ifndef INSPIRCD_H
-#define INSPIRCD_H
+#pragma once
#define _FILE_OFFSET_BITS 64
#ifndef _LARGEFILE_SOURCE
@@ -46,6 +45,15 @@
#define CUSTOM_PRINTF(STRING, FIRST)
#endif
+#if defined __clang__ || defined __GNUC__
+# define DEPRECATED_METHOD(function) function __attribute__((deprecated))
+#elif defined _MSC_VER
+# define DEPRECATED_METHOD(function) __declspec(deprecated) function
+#else
+# pragma message ("Warning! DEPRECATED_METHOD() does not work on your compiler!")
+# define DEPRECATED_METHOD(function) function
+#endif
+
// Required system headers.
#include <ctime>
#include <cstdarg>
@@ -58,6 +66,13 @@
#include <unistd.h>
#endif
+#if defined _LIBCPP_VERSION || defined _WIN32
+# define TR1NS std
+# include <unordered_map>
+#else
+# define TR1NS std::tr1
+# include <tr1/unordered_map>
+#endif
#include <sstream>
#include <string>
#include <vector>
@@ -67,8 +82,7 @@
#include <bitset>
#include <set>
#include <time.h>
-#include "inspircd_config.h"
-#include "inspircd_version.h"
+#include "config.h"
#include "typedefs.h"
#include "consolecolors.h"
@@ -112,11 +126,6 @@ CoreExport extern InspIRCd* ServerInstance;
*/
#define ERROR -1
-/** Support for librodent -
- * see http://www.chatspike.net/index.php?z=64
- */
-#define ETIREDHAMSTERS EAGAIN
-
/** Template function to convert any input type to std::string
*/
template<typename T> inline std::string ConvNumeric(const T &in)
@@ -259,17 +268,34 @@ class serverstats
}
};
-DEFINE_HANDLER2(IsNickHandler, bool, const char*, size_t);
+/** This class manages the generation and transmission of ISUPPORT. */
+class CoreExport ISupportManager
+{
+private:
+ /** The generated lines which are sent to clients. */
+ std::vector<std::string> Lines;
+
+public:
+ /** (Re)build the ISUPPORT vector. */
+ void Build();
+
+ /** Returns the std::vector of ISUPPORT lines. */
+ const std::vector<std::string>& GetLines()
+ {
+ return this->Lines;
+ }
+
+ /** Send the 005 numerics (ISUPPORT) to a user. */
+ void SendTo(LocalUser* user);
+};
+
+DEFINE_HANDLER2(IsNickHandler, bool, const std::string&, size_t);
DEFINE_HANDLER2(GenRandomHandler, void, char*, size_t);
-DEFINE_HANDLER1(IsIdentHandler, bool, const char*);
-DEFINE_HANDLER1(FloodQuitUserHandler, void, User*);
-DEFINE_HANDLER2(IsChannelHandler, bool, const char*, size_t);
-DEFINE_HANDLER1(IsSIDHandler, bool, const std::string&);
+DEFINE_HANDLER1(IsIdentHandler, bool, const std::string&);
+DEFINE_HANDLER2(IsChannelHandler, bool, const std::string&, size_t);
DEFINE_HANDLER1(RehashHandler, void, const std::string&);
DEFINE_HANDLER3(OnCheckExemptionHandler, ModResult, User*, Channel*, const std::string&);
-class TestSuite;
-
/** 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
@@ -279,10 +305,6 @@ class TestSuite;
class CoreExport InspIRCd
{
private:
- /** Holds the current UID. Used to generate the next one.
- */
- char current_uid[UUID_LENGTH];
-
/** Set up the signal handlers
*/
void SetSignals();
@@ -297,10 +319,6 @@ class CoreExport InspIRCd
*/
void DoSocketTimeouts(time_t TIME);
- /** Increments the current UID by one.
- */
- void IncrementUID(int pos);
-
/** Perform background user events such as PING checks
*/
void DoBackgroundUserStuff();
@@ -322,6 +340,8 @@ class CoreExport InspIRCd
public:
+ UIDGenerator UIDGen;
+
/** Global cull list, will be processed on next iteration
*/
CullList GlobalCulls;
@@ -332,10 +352,8 @@ class CoreExport InspIRCd
IsNickHandler HandleIsNick;
IsIdentHandler HandleIsIdent;
- FloodQuitUserHandler HandleFloodQuitUser;
OnCheckExemptionHandler HandleOnCheckExemption;
IsChannelHandler HandleIsChannel;
- IsSIDHandler HandleIsSID;
RehashHandler HandleRehash;
GenRandomHandler HandleGenRandom;
@@ -349,10 +367,6 @@ class CoreExport InspIRCd
*/
FakeUser* FakeClient;
- /** Returns the next available UID for this server.
- */
- std::string GetUID();
-
static const char LogHeader[];
/** Find a user in the UUID hash
@@ -361,16 +375,6 @@ class CoreExport InspIRCd
*/
User* FindUUID(const std::string &uid);
- /** Find a user in the UUID hash
- * @param uid The UUID to find
- * @return A pointer to the user, or NULL if the user does not exist
- */
- User* FindUUID(const char *uid);
-
- /** Build the ISUPPORT string by triggering all modules On005Numeric events
- */
- void BuildISupport();
-
/** Time this ircd was booted
*/
time_t startup_time;
@@ -428,10 +432,6 @@ class CoreExport InspIRCd
*/
SnomaskManager* SNO;
- /** DNS class, provides resolver facilities to the core and modules
- */
- DNS* Res;
-
/** Timer manager class, triggers Timer timer events
*/
TimerManager* Timers;
@@ -468,6 +468,9 @@ class CoreExport InspIRCd
*/
LocalStringExt OperQuit;
+ /** Manages the generation and transmission of ISUPPORT. */
+ ISupportManager ISupport;
+
/** Get the current time
* Because this only calls time() once every time around the mainloop,
* it is much faster than calling time() directly.
@@ -523,17 +526,6 @@ class CoreExport InspIRCd
*/
User* FindNick(const std::string &nick);
- /** 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
- * @return A pointer to the user, or NULL if the user does not exist
- */
- User* FindNick(const char* nick);
-
- /** Find a user in the nick hash ONLY
- */
- User* FindNickOnly(const char* nick);
-
/** Find a user in the nick hash ONLY
*/
User* FindNickOnly(const std::string &nick);
@@ -544,12 +536,6 @@ class CoreExport InspIRCd
*/
Channel* FindChan(const std::string &chan);
- /** Find a channel in the channels hash
- * @param chan The channel to find
- * @return A pointer to the channel, or NULL if the channel does not exist
- */
- Channel* FindChan(const char* chan);
-
/** Check we aren't running as root, and exit if we are
* @return Depending on the configuration, this function may never return
*/
@@ -566,12 +552,12 @@ class CoreExport InspIRCd
* @param chname A channel name to verify
* @return True if the name is valid
*/
- caller2<bool, const char*, size_t> IsChannel;
+ caller2<bool, const std::string&, size_t> IsChannel;
/** Return true if str looks like a server ID
* @param string to check against
*/
- caller1<bool, const std::string&> IsSID;
+ static bool IsSID(const std::string& sid);
/** Rehash the local server
*/
@@ -614,31 +600,13 @@ class CoreExport InspIRCd
* @param n A nickname to verify
* @return True if the nick is valid
*/
- caller2<bool, const char*, size_t> IsNick;
+ caller2<bool, const std::string&, size_t> IsNick;
/** Return true if an ident is valid
* @param An ident to verify
* @return True if the ident is valid
*/
- caller1<bool, const char*> IsIdent;
-
- /** Add a dns Resolver class to this server's active set
- * @param r The resolver to add
- * @param cached If this value is true, then the cache will
- * be searched for the DNS result, immediately. If the value is
- * false, then a request will be sent to the nameserver, and the
- * result will not be immediately available. You should usually
- * use the boolean value which you passed to the Resolver
- * constructor, which Resolver will set appropriately depending
- * on if cached results are available and haven't expired. It is
- * however safe to force this value to false, forcing a remote DNS
- * lookup, but not an update of the cache.
- * @return True if the operation completed successfully. Note that
- * if this method returns true, you should not attempt to access
- * the resolver class you pass it after this call, as depending upon
- * the request given, the object may be deleted!
- */
- bool AddResolver(Resolver* r, bool cached);
+ caller1<bool, const std::string&> IsIdent;
/** Add a command to this server's command parser
* @param f A Command command handler object to add
@@ -684,22 +652,6 @@ class CoreExport InspIRCd
static bool MatchCIDR(const std::string &str, const std::string &mask, unsigned const char *map = NULL);
static bool MatchCIDR(const char *str, const char *mask, unsigned const char *map = NULL);
- /** Call the handler for a given command.
- * @param commandname The command whos handler you wish to call
- * @param parameters The mode parameters
- * @param user The user to execute the command as
- * @return True if the command handler was called successfully
- */
- CmdResult CallCommandHandler(const std::string &commandname, const std::vector<std::string>& parameters, User* user);
-
- /** Return true if the command is a module-implemented command and the given parameters are valid for it
- * @param commandname The command name to check
- * @param pcnt The parameter count
- * @param user The user to test-execute the command as
- * @return True if the command handler is a module command, and there are enough parameters and the user has permission to the command
- */
- bool IsValidModuleCommand(const std::string &commandname, int pcnt, User* user);
-
/** Return true if the given parameter is a valid nick!user\@host mask
* @param mask A nick!user\@host masak to match against
* @return True i the mask is valid
@@ -746,7 +698,7 @@ class CoreExport InspIRCd
* (one year, two weeks, three days, four hours, six minutes and five seconds)
* @return The total number of seconds
*/
- long Duration(const std::string &str);
+ static unsigned long Duration(const std::string& str);
/** Attempt to compare a password to a string from the config file.
* This will be passed to handling modules which will compare the data
@@ -808,16 +760,6 @@ class CoreExport InspIRCd
*/
void SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...) CUSTOM_PRINTF(5, 6);
- /** Handle /WHOIS
- */
- void DoWhois(User* user, User* dest,unsigned long signon, unsigned long idle, const char* nick);
-
- /** Quit a user for excess flood, and if they are not
- * fully registered yet, temporarily zline their IP.
- * @param current user to quit
- */
- caller1<void, User*> FloodQuitUser;
-
/** 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
@@ -839,17 +781,6 @@ class CoreExport InspIRCd
*/
void Cleanup();
- /** This copies the user and channel hash_maps into new hash maps.
- * This frees memory used by the hash_map allocator (which it neglects
- * to free, most of the time, using tons of ram)
- */
- void RehashUsersAndChans();
-
- /** Resets the cached max bans value on all channels.
- * Called by rehash.
- */
- void ResetMaxBans();
-
/** Return a time_t as a human-readable string.
*/
std::string TimeString(time_t curtime);
@@ -861,16 +792,10 @@ class CoreExport InspIRCd
*/
int Run();
- /** Adds an extban char to the 005 token.
- */
- void AddExtBanChar(char c);
-
char* GetReadBuffer()
{
return this->ReadBuffer;
}
-
- friend class TestSuite;
};
ENTRYPOINT;
@@ -894,5 +819,3 @@ class CommandModule : public Module
return Version(cmd.name, VF_VENDOR|VF_CORE);
}
};
-
-#endif
diff --git a/include/inspsocket.h b/include/inspsocket.h
index c62c5a250..ccc2301ed 100644
--- a/include/inspsocket.h
+++ b/include/inspsocket.h
@@ -21,8 +21,7 @@
*/
-#ifndef INSPSOCKET_H
-#define INSPSOCKET_H
+#pragma once
#include "timer.h"
@@ -93,7 +92,7 @@ class CoreExport SocketTimeout : public Timer
/** Handle tick event
*/
- virtual void Tick(time_t now);
+ virtual bool Tick(time_t now);
};
/**
@@ -234,4 +233,3 @@ class CoreExport BufferedSocket : public StreamSocket
inline Module* StreamSocket::GetIOHook() { return IOHook; }
inline void StreamSocket::AddIOHook(Module* m) { IOHook = m; }
inline void StreamSocket::DelIOHook() { IOHook = NULL; }
-#endif
diff --git a/include/inspstring.h b/include/inspstring.h
index a6ef5e552..7a433427a 100644
--- a/include/inspstring.h
+++ b/include/inspstring.h
@@ -18,13 +18,11 @@
*/
-#ifndef INSPSTRING_H
-#define INSPSTRING_H
+#pragma once
-// This (inspircd_config) is needed as inspstring doesn't pull in the central header
-#include "inspircd_config.h"
+// This (config) is needed as inspstring doesn't pull in the central header
+#include "config.h"
#include <cstring>
-//#include <cstddef>
#ifndef HAS_STRLCPY
/** strlcpy() implementation for systems that don't have it (linux) */
@@ -52,6 +50,3 @@ CoreExport std::string BinToHex(const std::string& data);
CoreExport std::string BinToBase64(const std::string& data, const char* table = NULL, char pad = 0);
/** Base64 decode */
CoreExport std::string Base64ToBin(const std::string& data, const char* table = NULL);
-
-#endif
-
diff --git a/include/listmode.h b/include/listmode.h
new file mode 100644
index 000000000..1c6f70d6f
--- /dev/null
+++ b/include/listmode.h
@@ -0,0 +1,218 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+/** The base class for list modes, should be inherited.
+ */
+class CoreExport ListModeBase : public ModeHandler
+{
+ public:
+ /** An item in a listmode's list
+ */
+ struct ListItem
+ {
+ std::string setter;
+ std::string mask;
+ time_t time;
+ ListItem(const std::string& Mask, const std::string& Setter, time_t Time)
+ : setter(Setter), mask(Mask), time(Time) { }
+ };
+
+ /** Items stored in the channel's list
+ */
+ typedef std::list<ListItem> ModeList;
+
+ private:
+ class ChanData
+ {
+ public:
+ ModeList list;
+ int maxitems;
+
+ ChanData() : maxitems(-1) { }
+ };
+
+ /** The number of items a listmode's list may contain
+ */
+ struct ListLimit
+ {
+ std::string mask;
+ unsigned int limit;
+ ListLimit(const std::string& Mask, unsigned int Limit) : mask(Mask), limit(Limit) { }
+ bool operator==(const ListLimit& other) const { return (this->mask == other.mask && this->limit == other.limit); }
+ };
+
+ /** Max items per channel by name
+ */
+ typedef std::vector<ListLimit> limitlist;
+
+ /** Finds the limit of modes that can be placed on the given channel name according to the config
+ * @param channame The channel name to find the limit for
+ * @return The maximum number of modes of this type that we allow to be set on the given channel name
+ */
+ unsigned int FindLimit(const std::string& channame);
+
+ /** Returns the limit on the given channel for this mode.
+ * If the limit is cached then the cached value is returned,
+ * otherwise the limit is determined using FindLimit() and cached
+ * for later queries before it is returned
+ * @param channame The channel name to find the limit for
+ * @param cd The ChanData associated with channel channame
+ * @return The maximum number of modes of this type that we allow to be set on the given channel
+ */
+ unsigned int GetLimitInternal(const std::string& channame, ChanData* cd);
+
+ protected:
+ /** Numeric to use when outputting the list
+ */
+ unsigned int listnumeric;
+ /** Numeric to indicate end of list
+ */
+ unsigned int endoflistnumeric;
+ /** String to send for end of list
+ */
+ std::string endofliststring;
+ /** Automatically tidy up entries
+ */
+ bool tidy;
+ /** Config tag to check for max items per channel
+ */
+ std::string configtag;
+ /** Limits on a per-channel basis read from the tag
+ * specified in ListModeBase::configtag
+ */
+ limitlist chanlimits;
+
+ /** Storage key
+ */
+ SimpleExtItem<ChanData> extItem;
+
+ public:
+ /** Constructor.
+ * @param Instance The creator of this class
+ * @param modechar Mode character
+ * @param eolstr End of list string
+ * @param lnum List numeric
+ * @param eolnum End of list numeric
+ * @param autotidy Automatically tidy list entries on add
+ * @param ctag Configuration tag to get limits from
+ */
+ ListModeBase(Module* Creator, const std::string& Name, char modechar, const std::string &eolstr, unsigned int lnum, unsigned int eolnum, bool autotidy, const std::string &ctag = "banlist");
+
+ /** Get limit of this mode on a channel
+ * @param channel The channel to inspect
+ * @return Maximum number of modes of this type that can be placed on the given channel
+ */
+ unsigned int GetLimit(Channel* channel);
+
+ /** Retrieves the list of all modes set on the given channel
+ * @param channel Channel to get the list from
+ * @return A list with all modes of this type set on the given channel, can be NULL
+ */
+ ModeList* GetList(Channel* channel);
+
+ /** Display the list for this mode
+ * See mode.h
+ * @param user The user to send the list to
+ * @param channel The channel the user is requesting the list for
+ */
+ virtual void DisplayList(User* user, Channel* channel);
+
+ /** Tell a user that a list contains no elements.
+ * Sends 'eolnum' numeric with text 'eolstr', unless overridden (see constructor)
+ * @param user The user issuing the command
+ * @param channel The channel that has the empty list
+ * See mode.h
+ */
+ virtual void DisplayEmptyList(User* user, Channel* channel);
+
+ /** Remove all instances of the mode from a channel.
+ * See mode.h
+ * @param channel The channel to remove all instances of the mode from
+ */
+ virtual void RemoveMode(Channel* channel, irc::modestacker* stack);
+
+ /** Listmodes don't get set on users, no-op
+ */
+ virtual void RemoveMode(User*, irc::modestacker* stack);
+
+ /** Perform a rehash of this mode's configuration data
+ */
+ virtual void DoRehash();
+
+ /** Populate the Implements list with the correct events for a List Mode
+ */
+ virtual void DoImplements(Module* m);
+
+ /** Handle the list mode.
+ * See mode.h
+ */
+ virtual ModeAction OnModeChange(User* source, User*, Channel* channel, std::string &parameter, bool adding);
+
+ /** Syncronize channel item list with another server.
+ * See modules.h
+ * @param chan Channel to syncronize
+ * @param proto Protocol module pointer
+ * @param opaque Opaque connection handle
+ */
+ virtual void DoSyncChannel(Channel* chan, Module* proto, void* opaque);
+
+ /** Validate parameters.
+ * Overridden by implementing module.
+ * @param source Source user adding the parameter
+ * @param channel Channel the parameter is being added to
+ * @param parameter The actual parameter being added
+ * @return true if the parameter is valid
+ */
+ virtual bool ValidateParam(User* user, Channel* channel, std::string& parameter);
+
+ /** Tell the user the list is too long.
+ * Overridden by implementing module.
+ * @param source Source user adding the parameter
+ * @param channel Channel the parameter is being added to
+ * @param parameter The actual parameter being added
+ */
+ virtual void TellListTooLong(User* source, Channel* channel, std::string& parameter);
+
+ /** Tell the user an item is already on the list.
+ * Overridden by implementing module.
+ * @param source Source user adding the parameter
+ * @param channel Channel the parameter is being added to
+ * @param parameter The actual parameter being added
+ */
+ virtual void TellAlreadyOnList(User* source, Channel* channel, std::string& parameter);
+
+ /** Tell the user that the parameter is not in the list.
+ * Overridden by implementing module.
+ * @param source Source user removing the parameter
+ * @param channel Channel the parameter is being removed from
+ * @param parameter The actual parameter being removed
+ */
+ virtual void TellNotSet(User* source, Channel* channel, std::string& parameter);
+};
+
+inline ListModeBase::ModeList* ListModeBase::GetList(Channel* channel)
+{
+ ChanData* cd = extItem.get(channel);
+ if (!cd)
+ return NULL;
+
+ return &cd->list;
+}
diff --git a/include/logger.h b/include/logger.h
index 0fa4bc7cd..7b4c45f1c 100644
--- a/include/logger.h
+++ b/include/logger.h
@@ -18,8 +18,7 @@
*/
-#ifndef LOGGER_H
-#define LOGGER_H
+#pragma once
/** Simple wrapper providing periodic flushing to a disk-backed file.
*/
@@ -199,17 +198,15 @@ class CoreExport LogManager
/** Logs an event, sending it to all LogStreams registered for the type.
* @param type Log message type (ex: "USERINPUT", "MODULE", ...)
- * @param loglevel Log message level (DEBUG, VERBOSE, DEFAULT, SPARSE, NONE)
+ * @param loglevel Log message level (LOG_DEBUG, LOG_VERBOSE, LOG_DEFAULT, LOG_SPARSE, LOG_NONE)
* @param msg The message to be logged (literal).
*/
void Log(const std::string &type, int loglevel, const std::string &msg);
/** Logs an event, sending it to all LogStreams registered for the type.
* @param type Log message type (ex: "USERINPUT", "MODULE", ...)
- * @param loglevel Log message level (DEBUG, VERBOSE, DEFAULT, SPARSE, NONE)
+ * @param loglevel Log message level (LOG_DEBUG, LOG_VERBOSE, LOG_DEFAULT, LOG_SPARSE, LOG_NONE)
* @param fmt The format of the message to be logged. See your C manual on printf() for details.
*/
void Log(const std::string &type, int loglevel, const char *fmt, ...) CUSTOM_PRINTF(4, 5);
};
-
-#endif
diff --git a/include/membership.h b/include/membership.h
index 436a9371c..5850e0ae0 100644
--- a/include/membership.h
+++ b/include/membership.h
@@ -17,8 +17,7 @@
*/
-#ifndef MEMBERSHIP_H
-#define MEMBERSHIP_H
+#pragma once
class CoreExport Membership : public Extensible
{
@@ -46,7 +45,7 @@ class CoreExport InviteBase
friend class Invitation;
};
-class Invitation : public classbase
+class CoreExport Invitation : public classbase
{
Invitation(Channel* c, LocalUser* u, time_t timeout) : user(u), chan(c), expiry(timeout) {}
@@ -59,5 +58,3 @@ class Invitation : public classbase
static void Create(Channel* c, LocalUser* u, time_t timeout);
static Invitation* Find(Channel* c, LocalUser* u, bool check_expired = true);
};
-
-#endif
diff --git a/include/mode.h b/include/mode.h
index 1dab442d4..57f1b0669 100644
--- a/include/mode.h
+++ b/include/mode.h
@@ -20,8 +20,7 @@
*/
-#ifndef MODE_H
-#define MODE_H
+#pragma once
#include "ctables.h"
@@ -445,9 +444,6 @@ class CoreExport ModeParser
unsigned int seq;
public:
-
- /** The constructor initializes all the RFC basic modes by using ModeParserAddMode().
- */
ModeParser();
~ModeParser();
@@ -455,6 +451,11 @@ class CoreExport ModeParser
* for example, should 'user A' be able to 'op' on 'channel B'.
*/
User* SanityChecks(User *user,const char *dest,Channel *chan,int status);
+
+ /** Initialize all built-in modes
+ */
+ static void InitBuiltinModes();
+
/** Tidy a banmask. This makes a banmask 'acceptable' if fields are left out.
* E.g.
*
@@ -561,5 +562,3 @@ class CoreExport ModeParser
*/
std::string BuildPrefixes(bool lettersAndModes = true);
};
-
-#endif
diff --git a/include/modes/cmode_b.h b/include/modes/cmode_b.h
deleted file mode 100644
index afd5cd13b..000000000
--- a/include/modes/cmode_b.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *
- * 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
- * License as published by the Free Software Foundation, version 2.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "mode.h"
-#include "channels.h"
-
-class InspIRCd;
-
-/** Channel mode +b
- */
-class ModeChannelBan : public ModeHandler
-{
- private:
- BanItem b;
- public:
- ModeChannelBan();
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
- std::string& AddBan(User *user,std::string& dest,Channel *chan,int status);
- std::string& DelBan(User *user,std::string& dest,Channel *chan,int status);
- void DisplayList(User* user, Channel* channel);
- void DisplayEmptyList(User* user, Channel* channel);
- void RemoveMode(User* user, irc::modestacker* stack = NULL);
- void RemoveMode(Channel* channel, irc::modestacker* stack = NULL);
-};
-
diff --git a/include/modes/cmode_l.h b/include/modes/cmode_l.h
deleted file mode 100644
index 3018a0d67..000000000
--- a/include/modes/cmode_l.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *
- * 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
- * License as published by the Free Software Foundation, version 2.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "mode.h"
-
-/** Channel mode +l
- */
-class ModeChannelLimit : public ParamChannelModeHandler
-{
- public:
- ModeChannelLimit();
- bool ParamValidate(std::string& parameter);
- bool ResolveModeConflict(std::string &their_param, const std::string &our_param, Channel* channel);
-};
diff --git a/include/modes/cmode_v.h b/include/modes/cmode_v.h
deleted file mode 100644
index ab037f33f..000000000
--- a/include/modes/cmode_v.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *
- * 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
- * License as published by the Free Software Foundation, version 2.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "mode.h"
-#include "channels.h"
-
-class InspIRCd;
-
-/** Channel mode +v
- */
-class ModeChannelVoice : public ModeHandler
-{
- private:
- public:
- ModeChannelVoice();
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
- unsigned int GetPrefixRank();
- void RemoveMode(User* user, irc::modestacker* stack = NULL);
- void RemoveMode(Channel* channel, irc::modestacker* stack = NULL);
-};
-
diff --git a/include/modes/simplemodes.h b/include/modes/simplemodes.h
deleted file mode 100644
index 661bba400..000000000
--- a/include/modes/simplemodes.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- * Copyright (C) 2006 Craig Edwards <craigedwards@brainbox.cc>
- *
- * 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
- * License as published by the Free Software Foundation, version 2.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "mode.h"
-
-/** Channel mode +i
- */
-class ModeChannelInviteOnly : public SimpleChannelModeHandler
-{
- public:
- ModeChannelInviteOnly() : SimpleChannelModeHandler(NULL, "inviteonly", 'i')
- {
- }
-};
-
-/** Channel mode +m
- */
-class ModeChannelModerated : public SimpleChannelModeHandler
-{
- public:
- ModeChannelModerated() : SimpleChannelModeHandler(NULL, "moderated", 'm')
- {
- }
-};
-
-/** Channel mode +n
- */
-class ModeChannelNoExternal : public SimpleChannelModeHandler
-{
- public:
- ModeChannelNoExternal() : SimpleChannelModeHandler(NULL, "noextmsg", 'n')
- {
- }
-};
-
-/** Channel mode +p
- */
-class ModeChannelPrivate : public SimpleChannelModeHandler
-{
- public:
- ModeChannelPrivate() : SimpleChannelModeHandler(NULL, "private", 'p')
- {
- }
-};
-
-/** Channel mode +s
- */
-class ModeChannelSecret : public SimpleChannelModeHandler
-{
- public:
- ModeChannelSecret() : SimpleChannelModeHandler(NULL, "secret", 's')
- {
- }
-};
-
-/** Channel mode +t
- */
-class ModeChannelTopicOps : public SimpleChannelModeHandler
-{
- public:
- ModeChannelTopicOps() : SimpleChannelModeHandler(NULL, "topiclock", 't')
- {
- }
-};
-
-/** User mode +i
- */
-class ModeUserInvisible : public SimpleUserModeHandler
-{
- public:
- ModeUserInvisible() : SimpleUserModeHandler(NULL, "invisible", 'i')
- {
- }
-};
-
-/** User mode +w
- */
-class ModeUserWallops : public SimpleUserModeHandler
-{
- public:
- ModeUserWallops() : SimpleUserModeHandler(NULL, "wallops", 'w')
- {
- }
-};
diff --git a/include/modes/umode_s.h b/include/modes/umode_s.h
deleted file mode 100644
index 8ac8fa31a..000000000
--- a/include/modes/umode_s.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *
- * 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
- * License as published by the Free Software Foundation, version 2.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "mode.h"
-
-class InspIRCd;
-
-/** User mode +n
- */
-class ModeUserServerNoticeMask : public ModeHandler
-{
- public:
- ModeUserServerNoticeMask();
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
- void OnParameterMissing(User* user, User* dest, Channel* channel);
- std::string GetUserParameter(User* user);
-};
diff --git a/include/modules.h b/include/modules.h
index 8aedaabdd..72ee2683d 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -23,8 +23,7 @@
*/
-#ifndef MODULES_H
-#define MODULES_H
+#pragma once
#include "dynamic.h"
#include "base.h"
@@ -35,7 +34,6 @@
#include <sstream>
#include "timer.h"
#include "mode.h"
-#include "dns.h"
/** Used to define a set of behavior bits for a module
*/
@@ -109,14 +107,14 @@ struct ModResult {
/** InspIRCd major version.
* 1.2 -> 102; 2.1 -> 201; 2.12 -> 212
*/
-#define INSPIRCD_VERSION_MAJ 200
+#define INSPIRCD_VERSION_MAJ 202
/** InspIRCd API version.
* If you change any API elements, increment this value. This counter should be
* reset whenever the major version is changed. Modules can use these two values
* and numerical comparisons in preprocessor macros if they wish to support
* multiple versions of InspIRCd in one file.
*/
-#define INSPIRCD_VERSION_API 5
+#define INSPIRCD_VERSION_API 1
/**
* This #define allows us to call a method in all
@@ -135,7 +133,7 @@ struct ModResult {
} \
catch (CoreException& modexcept) \
{ \
- ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ ServerInstance->Logs->Log("MODULE",LOG_DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \
@@ -162,7 +160,7 @@ do { \
} \
catch (CoreException& except_ ## n) \
{ \
- ServerInstance->Logs->Log("MODULE",DEFAULT,"Exception caught: %s", (except_ ## n).GetReason()); \
+ ServerInstance->Logs->Log("MODULE",LOG_DEFAULT,"Exception caught: %s", (except_ ## n).GetReason()); \
(void) mod_ ## n; /* catch mismatched pairs */ \
} \
} \
@@ -286,32 +284,68 @@ class CoreExport dynamic_reference_base : public interfacebase
{
private:
std::string name;
+ void resolve();
protected:
- DataProvider* value;
+ ServiceProvider* value;
public:
ModuleRef creator;
dynamic_reference_base(Module* Creator, const std::string& Name);
~dynamic_reference_base();
- inline void ClearCache() { value = NULL; }
inline const std::string& GetProvider() { return name; }
void SetProvider(const std::string& newname);
- void lookup();
- operator bool();
+ void check();
+ operator bool() { return (value != NULL); }
static void reset_all();
};
+inline void dynamic_reference_base::check()
+{
+ if (!value)
+ throw ModuleException("Dynamic reference to '" + name + "' failed to resolve");
+}
+
template<typename T>
class dynamic_reference : public dynamic_reference_base
{
public:
dynamic_reference(Module* Creator, const std::string& Name)
: dynamic_reference_base(Creator, Name) {}
+
inline T* operator->()
{
- if (!value)
- lookup();
+ check();
return static_cast<T*>(value);
}
+
+ T* operator*()
+ {
+ return operator->();
+ }
+};
+
+template<typename T>
+class dynamic_reference_nocheck : public dynamic_reference_base
+{
+ public:
+ dynamic_reference_nocheck(Module* Creator, const std::string& Name)
+ : dynamic_reference_base(Creator, Name) {}
+
+ T* operator->()
+ {
+ return static_cast<T*>(value);
+ }
+
+ T* operator*()
+ {
+ return operator->();
+ }
+};
+
+class ModeReference : public dynamic_reference_nocheck<ModeHandler>
+{
+ public:
+ ModeReference(Module* mod, const std::string& modename)
+ : dynamic_reference_nocheck<ModeHandler>(mod, "mode/" + modename) {}
};
/** Priority types which can be used by Module::Prioritize()
@@ -333,8 +367,8 @@ enum Implementation
I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite,
I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck,
I_OnStats, I_OnChangeLocalUserHost, I_OnPreTopicChange,
- I_OnPostTopicChange, I_OnEvent, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan,
- I_OnDelBan, I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
+ I_OnPostTopicChange, I_OnEvent, I_OnGlobalOper, I_OnPostConnect,
+ I_OnChangeLocalUserGECOS, I_OnUserRegister, I_OnChannelPreDelete, I_OnChannelDelete,
I_OnPostOper, I_OnSyncNetwork, I_OnSetAway, I_OnPostCommand, I_OnPostJoin,
I_OnWhoisLine, I_OnBuildNeighborList, I_OnGarbageCollect, I_OnSetConnectClass,
I_OnText, I_OnPassCompare, I_OnRunTestSuite, I_OnNamesListItem, I_OnNumeric, I_OnHookIO,
@@ -514,7 +548,7 @@ class CoreExport Module : public classbase, public usecountbase
* @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 ModResult OnUserPreJoin(User* user, Channel* chan, const char* cname, std::string &privs, const std::string &keygiven);
+ virtual ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& 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
@@ -741,8 +775,6 @@ class CoreExport Module : public classbase, public usecountbase
* (see below). This function will be called for every user visible on your side
* of the burst, allowing you to for example set modes, etc.
*
- * For a good example of how to use this function, please see src/modules/m_chanprotect.cpp
- *
* @param chan The channel being syncronized
* @param proto A pointer to the module handling network protocol
* @param opaque An opaque pointer set by the protocol module, should not be modified!
@@ -775,9 +807,6 @@ class CoreExport Module : public classbase, public usecountbase
* down the network link as a broadcast, without a module calling it having to know the format
* of the MODE command before the actual mode string.
*
- * More documentation to follow soon. Please see src/modules/m_chanprotect.cpp for examples
- * of how to use this function.
- *
* @param opaque An opaque pointer set by the protocol module, should not be modified!
* @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
@@ -885,9 +914,9 @@ class CoreExport Module : public classbase, public usecountbase
/** Called when a 005 numeric is about to be output.
* The module should modify the 005 numeric if needed to indicate its features.
- * @param output The 005 string to be modified if neccessary.
- */
- virtual void On005Numeric(std::string &output);
+ * @param output The 005 map to be modified if neccessary.
+ */
+ virtual void On005Numeric(std::map<std::string, std::string>& tokens);
/** Called when a client is disconnected by KILL.
* If a client is killed by a server, e.g. a nickname collision or protocol error,
@@ -1162,24 +1191,6 @@ class CoreExport Module : public classbase, public usecountbase
*/
virtual void OnPostConnect(User* user);
- /** Called whenever a ban is added to a channel's list.
- * Return a non-zero value to 'eat' the mode change and prevent the ban from being added.
- * @param source The user adding the ban
- * @param channel The channel the ban is being added to
- * @param banmask The ban mask being added
- * @return 1 to block the ban, 0 to continue as normal
- */
- virtual ModResult OnAddBan(User* source, Channel* channel,const std::string &banmask);
-
- /** Called whenever a ban is removed from a channel's list.
- * Return a non-zero value to 'eat' the mode change and prevent the ban from being removed.
- * @param source The user deleting the ban
- * @param channel The channel the ban is being deleted from
- * @param banmask The ban mask being deleted
- * @return 1 to block the unban, 0 to continue as normal
- */
- virtual ModResult OnDelBan(User* source, Channel* channel,const std::string &banmask);
-
/** Called to install an I/O hook on an event handler
* @param user The socket to possibly install the I/O hook on
* @param via The port that the user connected on
@@ -1301,101 +1312,6 @@ class CoreExport Module : public classbase, public usecountbase
virtual void OnSetUserIP(LocalUser* user);
};
-
-#define CONF_NO_ERROR 0x000000
-#define CONF_NOT_A_NUMBER 0x000010
-#define CONF_INT_NEGATIVE 0x000080
-#define CONF_VALUE_NOT_FOUND 0x000100
-#define CONF_FILE_NOT_FOUND 0x000200
-
-
-/** Allows reading of values from configuration files
- * This class allows a module to read from either the main configuration file (inspircd.conf) or from
- * a module-specified configuration file. It may either be instantiated with one parameter or none.
- * Constructing the class using one parameter allows you to specify a path to your own configuration
- * file, otherwise, inspircd.conf is read.
- */
-class CoreExport ConfigReader : public interfacebase
-{
- protected:
- /** Error code
- */
- long error;
-
- public:
- /** Default constructor.
- * This constructor initialises the ConfigReader class to read the inspircd.conf file
- * as specified when running ./configure.
- */
- ConfigReader();
- /** Default destructor.
- * This method destroys the ConfigReader class.
- */
- ~ConfigReader();
-
- /** Retrieves a value from the config file.
- * This method retrieves a value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve.
- */
- std::string ReadValue(const std::string &tag, const std::string &name, int index, bool allow_linefeeds = false);
- /** Retrieves a value from the config file.
- * This method retrieves a value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. If the
- * tag is not found the default value is returned instead.
- */
- std::string ReadValue(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool allow_linefeeds = false);
-
- /** Retrieves a boolean value from the config file.
- * This method retrieves a boolean value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes"
- * and "true" in the config file count as true to ReadFlag, and any other value counts as false.
- */
- bool ReadFlag(const std::string &tag, const std::string &name, int index);
- /** Retrieves a boolean value from the config file.
- * This method retrieves a boolean value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes"
- * and "true" in the config file count as true to ReadFlag, and any other value counts as false.
- * If the tag is not found, the default value is used instead.
- */
- bool ReadFlag(const std::string &tag, const std::string &name, const std::string &default_value, int index);
-
- /** Retrieves an integer value from the config file.
- * This method retrieves an integer value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. Any invalid integer
- * values in the tag will cause the objects error value to be set, and any call to GetError() will
- * return CONF_INVALID_NUMBER to be returned. need_positive is set if the number must be non-negative.
- * If a negative number is placed into a tag which is specified positive, 0 will be returned and GetError()
- * will return CONF_INT_NEGATIVE. Note that need_positive is not suitable to get an unsigned int - you
- * should cast the result to achieve that effect.
- */
- int ReadInteger(const std::string &tag, const std::string &name, int index, bool need_positive);
- /** Retrieves an integer value from the config file.
- * This method retrieves an integer value from the config file. Where multiple copies of the tag
- * exist in the config file, index indicates which of the values to retrieve. Any invalid integer
- * values in the tag will cause the objects error value to be set, and any call to GetError() will
- * return CONF_INVALID_NUMBER to be returned. needs_unsigned is set if the number must be unsigned.
- * If a signed number is placed into a tag which is specified unsigned, 0 will be returned and GetError()
- * will return CONF_NOT_UNSIGNED. If the tag is not found, the default value is used instead.
- */
- int ReadInteger(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool need_positive);
-
- /** Returns the last error to occur.
- * Valid errors can be found by looking in modules.h. Any nonzero value indicates an error condition.
- * A call to GetError() resets the error flag back to 0.
- */
- long GetError();
-
- /** Counts the number of times a given tag appears in the config file.
- * This method counts the number of times a tag appears in a config file, for use where
- * there are several tags of the same kind, e.g. with opers and connect types. It can be
- * used with the index value of ConfigReader::ReadValue to loop through all copies of a
- * multiple instance tag.
- */
- int Enumerate(const std::string &tag);
-};
-
-
-
/** Caches a text file into memory and can be used to retrieve lines from it.
* This class contains methods for read-only manipulation of a text file in memory.
* Either use the constructor type with one parameter to load a file into memory
@@ -1732,5 +1648,3 @@ struct AllModuleList {
#define COMMAND_INIT(c) MODULE_INIT(CommandModule<c>)
#endif
-
-#endif
diff --git a/include/modes/cmode_o.h b/include/modules/account.h
index c5f1764c1..c00b044e4 100644
--- a/include/modes/cmode_o.h
+++ b/include/modules/account.h
@@ -1,7 +1,7 @@
/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
*
* 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
@@ -17,21 +17,25 @@
*/
-#include "mode.h"
-#include "channels.h"
+#pragma once
-class InspIRCd;
+#include <map>
+#include <string>
-/** Channel mode +o
- */
-class ModeChannelOp : public ModeHandler
+class AccountEvent : public Event
{
- private:
public:
- ModeChannelOp();
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
- unsigned int GetPrefixRank();
- void RemoveMode(Channel* channel, irc::modestacker* stack = NULL);
- void RemoveMode(User* user, irc::modestacker* stack = NULL);
+ User* const user;
+ const std::string account;
+ AccountEvent(Module* me, User* u, const std::string& name)
+ : Event(me, "account_login"), user(u), account(name)
+ {
+ }
};
+typedef StringExtItem AccountExtItem;
+
+inline AccountExtItem* GetAccountExtItem()
+{
+ return static_cast<AccountExtItem*>(ServerInstance->Extensions.GetItem("accountname"));
+}
diff --git a/include/modules/cap.h b/include/modules/cap.h
new file mode 100644
index 000000000..2ed8df494
--- /dev/null
+++ b/include/modules/cap.h
@@ -0,0 +1,90 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+class CapEvent : public Event
+{
+ public:
+ enum CapEventType
+ {
+ CAPEVENT_REQ,
+ CAPEVENT_LS,
+ CAPEVENT_LIST,
+ CAPEVENT_CLEAR
+ };
+
+ CapEventType type;
+ std::vector<std::string> wanted;
+ std::vector<std::string> ack;
+ User* user;
+ CapEvent(Module* sender, User* u, CapEventType capevtype) : Event(sender, "cap_request"), type(capevtype), user(u) {}
+};
+
+class GenericCap
+{
+ public:
+ LocalIntExt ext;
+ const std::string cap;
+ GenericCap(Module* parent, const std::string &Cap) : ext("cap_" + Cap, parent), cap(Cap)
+ {
+ ServerInstance->Modules->AddService(ext);
+ }
+
+ void HandleEvent(Event& ev)
+ {
+ if (ev.id != "cap_request")
+ return;
+
+ CapEvent *data = static_cast<CapEvent*>(&ev);
+ if (data->type == CapEvent::CAPEVENT_REQ)
+ {
+ for (std::vector<std::string>::iterator it = data->wanted.begin(); it != data->wanted.end(); ++it)
+ {
+ if (it->empty())
+ continue;
+ bool enablecap = ((*it)[0] != '-');
+ if (((enablecap) && (*it == cap)) || (*it == "-" + cap))
+ {
+ // we can handle this, so ACK it, and remove it from the wanted list
+ data->ack.push_back(*it);
+ data->wanted.erase(it);
+ ext.set(data->user, enablecap ? 1 : 0);
+ break;
+ }
+ }
+ }
+ else if (data->type == CapEvent::CAPEVENT_LS)
+ {
+ data->wanted.push_back(cap);
+ }
+ else if (data->type == CapEvent::CAPEVENT_LIST)
+ {
+ if (ext.get(data->user))
+ data->wanted.push_back(cap);
+ }
+ else if (data->type == CapEvent::CAPEVENT_CLEAR)
+ {
+ data->ack.push_back("-" + cap);
+ ext.set(data->user, 0);
+ }
+ }
+};
+
diff --git a/include/modules/dns.h b/include/modules/dns.h
new file mode 100644
index 000000000..65a1762b3
--- /dev/null
+++ b/include/modules/dns.h
@@ -0,0 +1,193 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2013 Adam <Adam@anope.org>
+ * Copyright (C) 2003-2013 Anope Team <team@anope.org>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+namespace DNS
+{
+ /** Valid query types
+ */
+ enum QueryType
+ {
+ /* Nothing */
+ QUERY_NONE,
+ /* A simple A lookup */
+ QUERY_A = 1,
+ /* A CNAME lookup */
+ QUERY_CNAME = 5,
+ /* Reverse DNS lookup */
+ QUERY_PTR = 12,
+ /* IPv6 AAAA lookup */
+ QUERY_AAAA = 28
+ };
+
+ /** Flags that can be AND'd into DNSPacket::flags to receive certain values
+ */
+ enum
+ {
+ QUERYFLAGS_QR = 0x8000,
+ QUERYFLAGS_OPCODE = 0x7800,
+ QUERYFLAGS_AA = 0x400,
+ QUERYFLAGS_TC = 0x200,
+ QUERYFLAGS_RD = 0x100,
+ QUERYFLAGS_RA = 0x80,
+ QUERYFLAGS_Z = 0x70,
+ QUERYFLAGS_RCODE = 0xF
+ };
+
+ enum Error
+ {
+ ERROR_NONE,
+ ERROR_UNKNOWN,
+ ERROR_UNLOADED,
+ ERROR_TIMEDOUT,
+ ERROR_NOT_AN_ANSWER,
+ ERROR_NONSTANDARD_QUERY,
+ ERROR_FORMAT_ERROR,
+ ERROR_SERVER_FAILURE,
+ ERROR_DOMAIN_NOT_FOUND,
+ ERROR_NOT_IMPLEMENTED,
+ ERROR_REFUSED,
+ ERROR_NO_RECORDS,
+ ERROR_INVALIDTYPE
+ };
+
+ const int PORT = 53;
+
+ /**
+ * The maximum value of a dns request id,
+ * 16 bits wide, 0xFFFF.
+ */
+ const int MAX_REQUEST_ID = 0xFFFF;
+
+ class Exception : public ModuleException
+ {
+ public:
+ Exception(const std::string& message) : ModuleException(message) { }
+ };
+
+ struct Question
+ {
+ std::string name;
+ QueryType type;
+ unsigned short qclass;
+
+ Question() : type(QUERY_NONE), qclass(0) { }
+ Question(const std::string& n, QueryType t, unsigned short c = 1) : name(n), type(t), qclass(c) { }
+ inline bool operator==(const Question& other) const { return name == other.name && type == other.type && qclass == other.qclass; }
+
+ struct hash
+ {
+ size_t operator()(const Question& question) const
+ {
+ return irc::insensitive()(question.name);
+ }
+ };
+ };
+
+ struct ResourceRecord : Question
+ {
+ unsigned int ttl;
+ std::string rdata;
+ time_t created;
+
+ ResourceRecord(const std::string& n, QueryType t, unsigned short c = 1) : Question(n, t, c), ttl(0), created(ServerInstance->Time()) { }
+ ResourceRecord(const Question& question) : Question(question), ttl(0), created(ServerInstance->Time()) { }
+ };
+
+ struct Query
+ {
+ std::vector<Question> questions;
+ std::vector<ResourceRecord> answers;
+ Error error;
+ bool cached;
+
+ Query() : error(ERROR_NONE), cached(false) { }
+ Query(const Question& question) : error(ERROR_NONE), cached(false) { questions.push_back(question); }
+ };
+
+ class ReplySocket;
+ class Request;
+
+ /** DNS manager
+ */
+ class Manager : public DataProvider
+ {
+ public:
+ Manager(Module* mod) : DataProvider(mod, "DNS") { }
+
+ virtual void Process(Request* req) = 0;
+ virtual void RemoveRequest(Request* req) = 0;
+ virtual std::string GetErrorStr(Error) = 0;
+ };
+
+ /** A DNS query.
+ */
+ class Request : public Timer, public Question
+ {
+ protected:
+ Manager* const manager;
+ public:
+ /* Use result cache if available */
+ bool use_cache;
+ /* Request id */
+ unsigned short id;
+ /* Creator of this request */
+ Module* const creator;
+
+ Request(Manager* mgr, Module* mod, const std::string& addr, QueryType qt, bool usecache = true)
+ : Timer((ServerInstance->Config->dns_timeout ? ServerInstance->Config->dns_timeout : 5), ServerInstance->Time())
+ , Question(addr, qt)
+ , manager(mgr)
+ , use_cache(usecache)
+ , id(0)
+ , creator(mod)
+ {
+ ServerInstance->Timers->AddTimer(this);
+ }
+
+ virtual ~Request()
+ {
+ manager->RemoveRequest(this);
+ }
+
+ /** Called when this request succeeds
+ * @param r The query sent back from the nameserver
+ */
+ virtual void OnLookupComplete(const Query* req) = 0;
+
+ /** Called when this request fails or times out.
+ * @param r The query sent back from the nameserver, check the error code.
+ */
+ virtual void OnError(const Query* req) { }
+
+ /** Used to time out the query, calls OnError and asks the TimerManager
+ * to delete this request
+ */
+ bool Tick(time_t now)
+ {
+ Query rr(*this);
+ rr.error = ERROR_TIMEDOUT;
+ this->OnError(&rr);
+ return false;
+ }
+ };
+
+} // namespace DNS
+
diff --git a/include/modules/hash.h b/include/modules/hash.h
new file mode 100644
index 000000000..da04c45ba
--- /dev/null
+++ b/include/modules/hash.h
@@ -0,0 +1,58 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+#include "modules.h"
+
+class HashProvider : public DataProvider
+{
+ public:
+ const unsigned int out_size;
+ const unsigned int block_size;
+ HashProvider(Module* mod, const std::string& Name, int osiz, int bsiz)
+ : DataProvider(mod, Name), out_size(osiz), block_size(bsiz) {}
+ virtual std::string sum(const std::string& data) = 0;
+ inline std::string hexsum(const std::string& data)
+ {
+ return BinToHex(sum(data));
+ }
+
+ inline std::string b64sum(const std::string& data)
+ {
+ return BinToBase64(sum(data), NULL, 0);
+ }
+
+ /** HMAC algorithm, RFC 2104 */
+ std::string hmac(const std::string& key, const std::string& msg)
+ {
+ std::string hmac1, hmac2;
+ std::string kbuf = key.length() > block_size ? sum(key) : key;
+ kbuf.resize(block_size);
+
+ for (size_t n = 0; n < block_size; n++)
+ {
+ hmac1.push_back(static_cast<char>(kbuf[n] ^ 0x5C));
+ hmac2.push_back(static_cast<char>(kbuf[n] ^ 0x36));
+ }
+ hmac2.append(msg);
+ hmac1.append(sum(hmac2));
+ return sum(hmac1);
+ }
+};
diff --git a/include/modules/httpd.h b/include/modules/httpd.h
new file mode 100644
index 000000000..d1746e862
--- /dev/null
+++ b/include/modules/httpd.h
@@ -0,0 +1,203 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2008 Pippijn van Steenhoven <pip88nl@gmail.com>
+ * Copyright (C) 2007 John Brooks <john.brooks@dereferenced.net>
+ * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2006 Craig Edwards <craigedwards@brainbox.cc>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+#include "base.h"
+
+#include <string>
+#include <sstream>
+#include <map>
+
+/** A modifyable list of HTTP header fields
+ */
+class HTTPHeaders
+{
+ protected:
+ std::map<std::string,std::string> headers;
+ public:
+
+ /** Set the value of a header
+ * Sets the value of the named header. If the header is already present, it will be replaced
+ */
+ void SetHeader(const std::string &name, const std::string &data)
+ {
+ headers[name] = data;
+ }
+
+ /** Set the value of a header, only if it doesn't exist already
+ * Sets the value of the named header. If the header is already present, it will NOT be updated
+ */
+ void CreateHeader(const std::string &name, const std::string &data)
+ {
+ if (!IsSet(name))
+ SetHeader(name, data);
+ }
+
+ /** Remove the named header
+ */
+ void RemoveHeader(const std::string &name)
+ {
+ headers.erase(name);
+ }
+
+ /** Remove all headers
+ */
+ void Clear()
+ {
+ headers.clear();
+ }
+
+ /** Get the value of a header
+ * @return The value of the header, or an empty string
+ */
+ std::string GetHeader(const std::string &name)
+ {
+ std::map<std::string,std::string>::iterator it = headers.find(name);
+ if (it == headers.end())
+ return std::string();
+
+ return it->second;
+ }
+
+ /** Check if the given header is specified
+ * @return true if the header is specified
+ */
+ bool IsSet(const std::string &name)
+ {
+ std::map<std::string,std::string>::iterator it = headers.find(name);
+ return (it != headers.end());
+ }
+
+ /** Get all headers, formatted by the HTTP protocol
+ * @return Returns all headers, formatted according to the HTTP protocol. There is no request terminator at the end
+ */
+ std::string GetFormattedHeaders()
+ {
+ std::string re;
+
+ for (std::map<std::string,std::string>::iterator i = headers.begin(); i != headers.end(); i++)
+ re += i->first + ": " + i->second + "\r\n";
+
+ return re;
+ }
+};
+
+class HttpServerSocket;
+
+/** This class represents a HTTP request.
+ */
+class HTTPRequest : public Event
+{
+ protected:
+ std::string type;
+ std::string document;
+ std::string ipaddr;
+ std::string postdata;
+
+ public:
+
+ HTTPHeaders *headers;
+ int errorcode;
+
+ /** A socket pointer, which you must return in your HTTPDocument class
+ * if you reply to this request.
+ */
+ HttpServerSocket* sock;
+
+ /** Initialize HTTPRequest.
+ * This constructor is called by m_httpd.so to initialize the class.
+ * @param request_type The request type, e.g. GET, POST, HEAD
+ * @param uri The URI, e.g. /page
+ * @param hdr The headers sent with the request
+ * @param opaque An opaque pointer used internally by m_httpd, which you must pass back to the module in your reply.
+ * @param ip The IP address making the web request.
+ * @param pdata The post data (content after headers) received with the request, up to Content-Length in size
+ */
+ HTTPRequest(Module* me, const std::string &eventid, const std::string &request_type, const std::string &uri,
+ HTTPHeaders* hdr, HttpServerSocket* socket, const std::string &ip, const std::string &pdata)
+ : Event(me, eventid), type(request_type), document(uri), ipaddr(ip), postdata(pdata), headers(hdr), sock(socket)
+ {
+ }
+
+ /** Get the post data (request content).
+ * All post data will be returned, including carriage returns and linefeeds.
+ * @return The postdata
+ */
+ std::string& GetPostData()
+ {
+ return postdata;
+ }
+
+ /** Get the request type.
+ * Any request type can be intercepted, even ones which are invalid in the HTTP/1.1 spec.
+ * @return The request type, e.g. GET, POST, HEAD
+ */
+ std::string& GetType()
+ {
+ return type;
+ }
+
+ /** Get URI.
+ * The URI string (URL minus hostname and scheme) will be provided by this function.
+ * @return The URI being requested
+ */
+ std::string& GetURI()
+ {
+ return document;
+ }
+
+ /** Get IP address of requester.
+ * The requesting system's ip address will be returned.
+ * @return The IP address as a string
+ */
+ std::string& GetIP()
+ {
+ return ipaddr;
+ }
+};
+
+/** You must return a HTTPDocument to the httpd module by using the Request class.
+ * When you initialize this class you may initialize it with all components required to
+ * form a valid HTTP response, including document data, headers, and a response code.
+ */
+class HTTPDocumentResponse : public Request
+{
+ public:
+ std::stringstream* document;
+ int responsecode;
+ HTTPHeaders headers;
+ HTTPRequest& src;
+
+ /** Initialize a HTTPRequest ready for sending to m_httpd.so.
+ * @param opaque The socket pointer you obtained from the HTTPRequest at an earlier time
+ * @param doc A stringstream containing the document body
+ * @param response A valid HTTP/1.0 or HTTP/1.1 response code. The response text will be determined for you
+ * based upon the response code.
+ * @param extra Any extra headers to include with the defaults, seperated by carriage return and linefeed.
+ */
+ HTTPDocumentResponse(Module* me, HTTPRequest& req, std::stringstream* doc, int response)
+ : Request(me, req.source, "HTTP-DOC"), document(doc), responsecode(response), src(req)
+ {
+ }
+};
diff --git a/include/modules/regex.h b/include/modules/regex.h
new file mode 100644
index 000000000..875f942bc
--- /dev/null
+++ b/include/modules/regex.h
@@ -0,0 +1,55 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+#include "inspircd.h"
+
+class Regex : public classbase
+{
+protected:
+ std::string regex_string; // The raw uncompiled regex string.
+
+ // Constructor may as well be protected, as this class is abstract.
+ Regex(const std::string& rx) : regex_string(rx)
+ {
+ }
+
+public:
+
+ virtual ~Regex()
+ {
+ }
+
+ virtual bool Matches(const std::string& text) = 0;
+
+ const std::string& GetRegexString() const
+ {
+ return regex_string;
+ }
+};
+
+class RegexFactory : public DataProvider
+{
+ public:
+ RegexFactory(Module* Creator, const std::string& Name) : DataProvider(Creator, Name) {}
+
+ virtual Regex* Create(const std::string& expr) = 0;
+};
diff --git a/include/modes/umode_o.h b/include/modules/sasl.h
index f9644a097..321711a68 100644
--- a/include/modes/umode_o.h
+++ b/include/modules/sasl.h
@@ -1,7 +1,7 @@
/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org>
*
* 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
@@ -17,15 +17,15 @@
*/
-#include "mode.h"
+#pragma once
-class InspIRCd;
-
-/** User mode +o
- */
-class ModeUserOperator : public ModeHandler
+class SASLFallback : public Event
{
public:
- ModeUserOperator();
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
+ const parameterlist& params;
+ SASLFallback(Module* me, const parameterlist& p)
+ : Event(me, "sasl_fallback"), params(p)
+ {
+ Send();
+ }
};
diff --git a/include/modes/cmode_k.h b/include/modules/spanningtree.h
index 000667f72..99f4f9fc4 100644
--- a/include/modes/cmode_k.h
+++ b/include/modules/spanningtree.h
@@ -1,7 +1,7 @@
/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
*
* 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
@@ -17,17 +17,24 @@
*/
-#include "mode.h"
+#pragma once
-class InspIRCd;
+struct AddServerEvent : public Event
+{
+ const std::string servername;
+ AddServerEvent(Module* me, const std::string& name)
+ : Event(me, "new_server"), servername(name)
+ {
+ Send();
+ }
+};
-/** Channel mode +k
- */
-class ModeChannelKey : public ModeHandler
+struct DelServerEvent : public Event
{
- public:
- ModeChannelKey();
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding);
- void RemoveMode(Channel* channel, irc::modestacker* stack = NULL);
- void RemoveMode(User* user, irc::modestacker* stack = NULL);
+ const std::string servername;
+ DelServerEvent(Module* me, const std::string& name)
+ : Event(me, "lost_server"), servername(name)
+ {
+ Send();
+ }
};
diff --git a/include/modules/sql.h b/include/modules/sql.h
new file mode 100644
index 000000000..a671cc95c
--- /dev/null
+++ b/include/modules/sql.h
@@ -0,0 +1,184 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+/** Defines the error types which SQLerror may be set to
+ */
+enum SQLerrorNum { SQL_NO_ERROR, SQL_BAD_DBID, SQL_BAD_CONN, SQL_QSEND_FAIL, SQL_QREPLY_FAIL };
+
+/** A list of format parameters for an SQLquery object.
+ */
+typedef std::vector<std::string> ParamL;
+
+typedef std::map<std::string, std::string> ParamM;
+
+class SQLEntry
+{
+ public:
+ std::string value;
+ bool nul;
+ SQLEntry() : nul(true) {}
+ SQLEntry(const std::string& v) : value(v), nul(false) {}
+ inline operator std::string&() { return value; }
+};
+
+typedef std::vector<SQLEntry> SQLEntries;
+
+/**
+ * Result of an SQL query. Only valid inside OnResult
+ */
+class SQLResult : public classbase
+{
+ public:
+ /**
+ * Return the number of rows in the result.
+ *
+ * Note that if you have perfomed an INSERT or UPDATE query or other
+ * query which will not return rows, this will return the number of
+ * affected rows. In this case you SHOULD NEVER access any of the result
+ * set rows, as there aren't any!
+ * @returns Number of rows in the result set.
+ */
+ virtual int Rows() = 0;
+
+ /**
+ * Return a single row (result of the query). The internal row counter
+ * is incremented by one.
+ *
+ * @param result Storage for the result data.
+ * @returns true if there was a row, false if no row exists (end of
+ * iteration)
+ */
+ virtual bool GetRow(SQLEntries& result) = 0;
+
+ /** Returns column names for the items in this row
+ */
+ virtual void GetCols(std::vector<std::string>& result) = 0;
+};
+
+/** SQLerror holds the error state of a request.
+ * The error string varies from database software to database software
+ * and should be used to display informational error messages to users.
+ */
+class SQLerror
+{
+ public:
+ /** The error id
+ */
+ SQLerrorNum id;
+
+ /** The error string
+ */
+ std::string str;
+
+ /** Initialize an SQLerror
+ * @param i The error ID to set
+ * @param s The (optional) error string to set
+ */
+ SQLerror(SQLerrorNum i, const std::string &s = "")
+ : id(i), str(s)
+ {
+ }
+
+ /** Return the error string for an error
+ */
+ const char* Str()
+ {
+ if(str.length())
+ return str.c_str();
+
+ switch(id)
+ {
+ case SQL_BAD_DBID:
+ return "Invalid database ID";
+ case SQL_BAD_CONN:
+ return "Invalid connection";
+ case SQL_QSEND_FAIL:
+ return "Sending query failed";
+ case SQL_QREPLY_FAIL:
+ return "Getting query result failed";
+ default:
+ return "Unknown error";
+ }
+ }
+};
+
+/**
+ * Object representing an SQL query. This should be allocated on the heap and
+ * passed to an SQLProvider, which will free it when the query is complete or
+ * when the querying module is unloaded.
+ *
+ * You should store whatever information is needed to have the callbacks work in
+ * this object (UID of user, channel name, etc).
+ */
+class SQLQuery : public classbase
+{
+ public:
+ ModuleRef creator;
+
+ SQLQuery(Module* Creator) : creator(Creator) {}
+ virtual ~SQLQuery() {}
+
+ virtual void OnResult(SQLResult& result) = 0;
+ /**
+ * Called when the query fails
+ */
+ virtual void OnError(SQLerror& error) { }
+};
+
+/**
+ * Provider object for SQL servers
+ */
+class SQLProvider : public DataProvider
+{
+ public:
+ SQLProvider(Module* Creator, const std::string& Name) : DataProvider(Creator, Name) {}
+ /** Submit an asynchronous SQL request
+ * @param callback The result reporting point
+ * @param query The hardcoded query string. If you have parameters to substitute, see below.
+ */
+ virtual void submit(SQLQuery* callback, const std::string& query) = 0;
+
+ /** Submit an asynchronous SQL request
+ * @param callback The result reporting point
+ * @param format The simple parameterized query string ('?' parameters)
+ * @param p Parameters to fill in for the '?' entries
+ */
+ virtual void submit(SQLQuery* callback, const std::string& format, const ParamL& p) = 0;
+
+ /** Submit an asynchronous SQL request.
+ * @param callback The result reporting point
+ * @param format The parameterized query string ('$name' parameters)
+ * @param p Parameters to fill in for the '$name' entries
+ */
+ virtual void submit(SQLQuery* callback, const std::string& format, const ParamM& p) = 0;
+
+ /** Convenience function to prepare a map from a User* */
+ void PopulateUserInfo(User* user, ParamM& userinfo)
+ {
+ userinfo["nick"] = user->nick;
+ userinfo["host"] = user->host;
+ userinfo["ip"] = user->GetIPString();
+ userinfo["gecos"] = user->fullname;
+ userinfo["ident"] = user->ident;
+ userinfo["server"] = user->server;
+ userinfo["uuid"] = user->uuid;
+ }
+};
diff --git a/include/modules/ssl.h b/include/modules/ssl.h
new file mode 100644
index 000000000..a79dcc9ef
--- /dev/null
+++ b/include/modules/ssl.h
@@ -0,0 +1,172 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2006 Craig Edwards <craigedwards@brainbox.cc>
+ *
+ * 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
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+#include <map>
+#include <string>
+
+/** ssl_cert is a class which abstracts SSL certificate
+ * and key information.
+ *
+ * Because gnutls and openssl represent key information in
+ * wildly different ways, this class allows it to be accessed
+ * in a unified manner. These classes are attached to ssl-
+ * connected local users using SSLCertExt
+ */
+class ssl_cert : public refcountbase
+{
+ public:
+ std::string dn;
+ std::string issuer;
+ std::string error;
+ std::string fingerprint;
+ bool trusted, invalid, unknownsigner, revoked;
+
+ ssl_cert() : trusted(false), invalid(true), unknownsigner(true), revoked(false) {}
+
+ /** Get certificate distinguished name
+ * @return Certificate DN
+ */
+ const std::string& GetDN()
+ {
+ return dn;
+ }
+
+ /** Get Certificate issuer
+ * @return Certificate issuer
+ */
+ const std::string& GetIssuer()
+ {
+ return issuer;
+ }
+
+ /** Get error string if an error has occured
+ * @return The error associated with this users certificate,
+ * or an empty string if there is no error.
+ */
+ const std::string& GetError()
+ {
+ return error;
+ }
+
+ /** Get key fingerprint.
+ * @return The key fingerprint as a hex string.
+ */
+ const std::string& GetFingerprint()
+ {
+ return fingerprint;
+ }
+
+ /** Get trust status
+ * @return True if this is a trusted certificate
+ * (the certificate chain validates)
+ */
+ bool IsTrusted()
+ {
+ return trusted;
+ }
+
+ /** Get validity status
+ * @return True if the certificate itself is
+ * correctly formed.
+ */
+ bool IsInvalid()
+ {
+ return invalid;
+ }
+
+ /** Get signer status
+ * @return True if the certificate appears to be
+ * self-signed.
+ */
+ bool IsUnknownSigner()
+ {
+ return unknownsigner;
+ }
+
+ /** Get revokation status.
+ * @return True if the certificate is revoked.
+ * Note that this only works properly for GnuTLS
+ * right now.
+ */
+ bool IsRevoked()
+ {
+ return revoked;
+ }
+
+ bool IsCAVerified()
+ {
+ return trusted && !invalid && !revoked && !unknownsigner && error.empty();
+ }
+
+ std::string GetMetaLine()
+ {
+ std::stringstream value;
+ bool hasError = !error.empty();
+ value << (IsInvalid() ? "v" : "V") << (IsTrusted() ? "T" : "t") << (IsRevoked() ? "R" : "r")
+ << (IsUnknownSigner() ? "s" : "S") << (hasError ? "E" : "e") << " ";
+ if (hasError)
+ value << GetError();
+ else
+ value << GetFingerprint() << " " << GetDN() << " " << GetIssuer();
+ return value.str();
+ }
+};
+
+/** Get certificate from a socket (only useful with an SSL module) */
+struct SocketCertificateRequest : public Request
+{
+ StreamSocket* const sock;
+ ssl_cert* cert;
+
+ SocketCertificateRequest(StreamSocket* ss, Module* Me)
+ : Request(Me, ss->GetIOHook(), "GET_SSL_CERT"), sock(ss), cert(NULL)
+ {
+ Send();
+ }
+
+ std::string GetFingerprint()
+ {
+ if (cert)
+ return cert->GetFingerprint();
+ return "";
+ }
+};
+
+/** Get certificate from a user (requires m_sslinfo) */
+struct UserCertificateRequest : public Request
+{
+ User* const user;
+ ssl_cert* cert;
+
+ UserCertificateRequest(User* u, Module* Me, Module* info = ServerInstance->Modules->Find("m_sslinfo.so"))
+ : Request(Me, info, "GET_USER_CERT"), user(u), cert(NULL)
+ {
+ Send();
+ }
+
+ std::string GetFingerprint()
+ {
+ if (cert)
+ return cert->GetFingerprint();
+ return "";
+ }
+};
diff --git a/include/numerics.h b/include/numerics.h
index 4fce4cb6d..997a71d3a 100644
--- a/include/numerics.h
+++ b/include/numerics.h
@@ -18,8 +18,7 @@
*/
-#ifndef NUMERICS_H
-#define NUMERICS_H
+#pragma once
/*
* This file is aimed providing a string that is easier to use than using the numeric
@@ -157,5 +156,3 @@ enum Numerics
ERR_CANTLOADMODULE = 974, // insp-specific
RPL_LOADEDMODULE = 975 // insp-specific
};
-
-#endif
diff --git a/include/protocol.h b/include/protocol.h
index aabb5b022..4488fcea4 100644
--- a/include/protocol.h
+++ b/include/protocol.h
@@ -18,8 +18,7 @@
*/
-#ifndef PROTOCOL_H
-#define PROTOCOL_H
+#pragma once
#include "hashcomp.h"
@@ -135,6 +134,3 @@ class ProtocolInterface
*/
virtual void GetServerList(ProtoServerList &sl) { }
};
-
-#endif
-
diff --git a/include/snomasks.h b/include/snomasks.h
index 85ad26f71..c5d594eeb 100644
--- a/include/snomasks.h
+++ b/include/snomasks.h
@@ -20,8 +20,7 @@
*/
-#ifndef SNOMASKS_H
-#define SNOMASKS_H
+#pragma once
class Snomask
{
@@ -106,5 +105,3 @@ class CoreExport SnomaskManager
*/
void FlushSnotices();
};
-
-#endif
diff --git a/include/socket.h b/include/socket.h
index 5f6705124..3abbeef32 100644
--- a/include/socket.h
+++ b/include/socket.h
@@ -22,8 +22,7 @@
*/
-#ifndef INSPIRCD_SOCKET_H
-#define INSPIRCD_SOCKET_H
+#pragma once
#ifndef _WIN32
@@ -110,9 +109,6 @@ namespace irc
*/
CoreExport bool MatchCIDR(const std::string &address, const std::string &cidr_mask, bool match_with_username);
- /** Return the size of the structure for syscall passing */
- inline int sa_size(const irc::sockets::sockaddrs& sa) { return sa.sa_size(); }
-
/** Convert an address-port pair into a binary sockaddr
* @param addr The IP address, IPv4 or IPv6
* @param port The port, 0 for unspecified
@@ -165,6 +161,3 @@ class CoreExport ListenSocket : public EventHandler
*/
void AcceptInternal();
};
-
-#endif
-
diff --git a/include/socketengine.h b/include/socketengine.h
index 2fc3cdbfd..8e4c3dfc9 100644
--- a/include/socketengine.h
+++ b/include/socketengine.h
@@ -20,13 +20,12 @@
*/
-#ifndef SOCKETENGINE_H
-#define SOCKETENGINE_H
+#pragma once
#include <vector>
#include <string>
#include <map>
-#include "inspircd_config.h"
+#include "config.h"
#include "socket.h"
#include "base.h"
@@ -128,7 +127,7 @@ enum EventMask
/** Add a trial write. During the next DispatchEvents invocation, this
* will call HandleEvent with EVENT_WRITE unless writes are known to be
* blocking.
- *
+ *
* This could be used to group several writes together into a single
* send() syscall, or to ensure that writes are blocking when attempting
* to use FD_WANT_FAST_WRITE.
@@ -137,7 +136,7 @@ enum EventMask
/** Assert that writes are known to block. This cancels FD_ADD_TRIAL_WRITE.
* Reset by SE before running EVENT_WRITE
*/
- FD_WRITE_WILL_BLOCK = 0x8000,
+ FD_WRITE_WILL_BLOCK = 0x8000,
/** Mask for trial read/trial write */
FD_TRIAL_NOTE_MASK = 0x5000
@@ -418,7 +417,7 @@ public:
* @param buf The buffer in which the data that is sent is stored.
* @param len The size of the buffer.
* @param flags A flag value that controls the sending of the data.
- * @param to The remote IP address and port.
+ * @param to The remote IP address and port.
* @param tolen The size of the to parameter.
* @return This method should return exactly the same values as the system call it emulates.
*/
@@ -510,6 +509,3 @@ inline bool SocketEngine::IgnoreError()
}
SocketEngine* CreateSocketEngine();
-
-#endif
-
diff --git a/include/testsuite.h b/include/testsuite.h
index f91e508c9..7f0b2236a 100644
--- a/include/testsuite.h
+++ b/include/testsuite.h
@@ -16,12 +16,10 @@
*/
-#ifndef TESTSUITE_H
-#define TESTSUITE_H
+#pragma once
class TestSuite
{
- bool RealGenerateUIDTests();
public:
TestSuite();
~TestSuite();
@@ -32,5 +30,3 @@ class TestSuite
bool DoSpaceSepStreamTests();
bool DoGenerateUIDTests();
};
-
-#endif
diff --git a/include/threadengine.h b/include/threadengine.h
index 4bf5a48f3..39f150566 100644
--- a/include/threadengine.h
+++ b/include/threadengine.h
@@ -18,13 +18,12 @@
*/
-#ifndef THREADENGINE_H
-#define THREADENGINE_H
+#pragma once
#include <vector>
#include <string>
#include <map>
-#include "inspircd_config.h"
+#include "config.h"
#include "base.h"
class ThreadData;
@@ -172,6 +171,3 @@ class CoreExport SocketThread : public Thread
*/
virtual void OnNotify() = 0;
};
-
-#endif
-
diff --git a/include/threadengines/threadengine_pthread.h b/include/threadengines/threadengine_pthread.h
index 5168ed238..253e8d223 100644
--- a/include/threadengines/threadengine_pthread.h
+++ b/include/threadengines/threadengine_pthread.h
@@ -18,8 +18,7 @@
*/
-#ifndef THREADENGINE_PTHREAD_H
-#define THREADENGINE_PTHREAD_H
+#pragma once
#include <pthread.h>
#include "typedefs.h"
@@ -153,6 +152,3 @@ class ThreadSignalData
public:
ThreadSignalSocket* sock;
};
-
-
-#endif
diff --git a/include/threadengines/threadengine_win32.h b/include/threadengines/threadengine_win32.h
index f068ac707..59848bd44 100644
--- a/include/threadengines/threadengine_win32.h
+++ b/include/threadengines/threadengine_win32.h
@@ -18,10 +18,9 @@
*/
-#ifndef THREADENGINE_WIN32_H
-#define THREADENGINE_WIN32_H
+#pragma once
-#include "inspircd_config.h"
+#include "config.h"
#include "base.h"
class Thread;
@@ -152,6 +151,3 @@ class ThreadSignalData
connFD = -1;
}
};
-
-#endif
-
diff --git a/include/timer.h b/include/timer.h
index 9bb7128b8..6f1834178 100644
--- a/include/timer.h
+++ b/include/timer.h
@@ -19,8 +19,9 @@
*/
-#ifndef INSPIRCD_TIMER_H
-#define INSPIRCD_TIMER_H
+#pragma once
+
+class Module;
/** Timer class for one-second resolution timers
* Timer provides a facility which allows module
@@ -29,61 +30,70 @@
* resolution. To use Timer, inherit a class from
* Timer, then insert your inherited class into the
* queue using Server::AddTimer(). The Tick() method of
- * your object (which you should override) will be called
+ * your object (which you have to override) will be called
* at the given time.
*/
class CoreExport Timer
{
- private:
/** The triggering time
*/
time_t trigger;
+
/** Number of seconds between triggers
*/
- long secs;
+ unsigned int secs;
+
/** True if this is a repeating timer
*/
bool repeat;
+
public:
/** Default constructor, initializes the triggering time
+ * @param mod The module that created this timer
* @param secs_from_now The number of seconds from now to trigger the timer
* @param now The time now
* @param repeating Repeat this timer every secs_from_now seconds if set to true
*/
- Timer(long secs_from_now, time_t now, bool repeating = false)
+ Timer(unsigned int secs_from_now, time_t now, bool repeating = false)
{
trigger = now + secs_from_now;
secs = secs_from_now;
repeat = repeating;
}
- /** Default destructor, does nothing.
+ /** Default destructor, removes the timer from the timer manager
*/
- virtual ~Timer() { }
+ virtual ~Timer();
/** Retrieve the current triggering time
*/
- virtual time_t GetTimer()
+ time_t GetTrigger() const
{
return trigger;
}
/** Sets the trigger timeout to a new value
+ * This does not update the bookkeeping in TimerManager, use SetInterval()
+ * to change the interval between ticks while keeping TimerManager updated
*/
- virtual void SetTimer(time_t t)
+ void SetTrigger(time_t nexttrigger)
{
- trigger = t;
+ trigger = nexttrigger;
}
+ /** Sets the interval between two ticks.
+ */
+ void SetInterval(time_t interval);
+
/** Called when the timer ticks.
* You should override this method with some useful code to
* handle the tick event.
*/
- virtual void Tick(time_t TIME) = 0;
+ virtual bool Tick(time_t TIME) = 0;
/** Returns true if this timer is set to repeat
*/
- bool GetRepeat()
+ bool GetRepeat() const
{
return repeat;
}
@@ -91,7 +101,7 @@ class CoreExport Timer
/** Returns the interval (number of seconds between ticks)
* of this timer object.
*/
- long GetSecs()
+ unsigned int GetInterval() const
{
return secs;
}
@@ -99,12 +109,6 @@ class CoreExport Timer
/** Cancels the repeat state of a repeating timer.
* If you call this method, then the next time your
* timer ticks, it will be removed immediately after.
- * You should use this method call to remove a recurring
- * timer if you wish to do so within the timer's Tick
- * event, as calling TimerManager::DelTimer() from within
- * the Timer::Tick() method is dangerous and may
- * cause a segmentation fault. Calling CancelRepeat()
- * is safe in this case.
*/
void CancelRepeat()
{
@@ -112,6 +116,7 @@ class CoreExport Timer
}
};
+typedef std::multimap<time_t, Timer*> TimerMap;
/** This class manages sets of Timers, and triggers them at their defined times.
* This will ensure timers are not missed, as well as removing timers that have
@@ -119,17 +124,11 @@ class CoreExport Timer
*/
class CoreExport TimerManager
{
- protected:
/** A list of all pending timers
*/
- std::vector<Timer *> Timers;
+ TimerMap Timers;
public:
- /** Constructor
- */
- TimerManager();
- ~TimerManager();
-
/** Tick all pending Timers
* @param TIME the current system time
*/
@@ -140,15 +139,8 @@ class CoreExport TimerManager
*/
void AddTimer(Timer *T);
- /** Delete an Timer
- * @param T an Timer derived class to delete
+ /** Remove a Timer
+ * @param T an Timer derived class to remove
*/
void DelTimer(Timer* T);
-
- /** Compares two timers
- */
- static bool TimerComparison( Timer *one, Timer*two);
};
-
-#endif
-
diff --git a/include/typedefs.h b/include/typedefs.h
index 06f704120..404175ddb 100644
--- a/include/typedefs.h
+++ b/include/typedefs.h
@@ -19,8 +19,7 @@
*/
-#ifndef TYPEDEFS_H
-#define TYPEDEFS_H
+#pragma once
class BanCacheManager;
class BanItem;
@@ -29,8 +28,6 @@ class Channel;
class Command;
class ConfigReader;
class ConfigTag;
-class DNSHeader;
-class DNSRequest;
class Extensible;
class FakeUser;
class InspIRCd;
@@ -45,24 +42,17 @@ class ServerConfig;
class ServerLimits;
class Thread;
class User;
-class UserResolver;
class XLine;
class XLineManager;
class XLineFactory;
struct ConnectClass;
struct ModResult;
-struct ResourceRecord;
#include "hashcomp.h"
#include "base.h"
-#ifdef HASHMAP_DEPRECATED
- typedef nspace::hash_map<std::string, User*, nspace::insensitive, irc::StrHashComp> user_hash;
- typedef nspace::hash_map<std::string, Channel*, nspace::insensitive, irc::StrHashComp> chan_hash;
-#else
- typedef nspace::hash_map<std::string, User*, nspace::hash<std::string>, irc::StrHashComp> user_hash;
- typedef nspace::hash_map<std::string, Channel*, nspace::hash<std::string>, irc::StrHashComp> chan_hash;
-#endif
+typedef TR1NS::unordered_map<std::string, User*, irc::insensitive, irc::StrHashComp> user_hash;
+typedef TR1NS::unordered_map<std::string, Channel*, irc::insensitive, irc::StrHashComp> chan_hash;
/** A list holding local users, this is the type of UserManager::local_users
*/
@@ -120,7 +110,7 @@ typedef std::map<std::string, file_cache> ConfigFileCache;
/** A hash of commands used by the core
*/
-typedef nspace::hash_map<std::string,Command*> Commandtable;
+typedef TR1NS::unordered_map<std::string, Command*> Commandtable;
/** Membership list of a channel */
typedef std::map<User*, Membership*> UserMembList;
@@ -159,7 +149,3 @@ typedef XLineContainer::iterator ContainerIter;
/** An interator in an XLineLookup
*/
typedef XLineLookup::iterator LookupIter;
-
-
-#endif
-
diff --git a/include/uid.h b/include/uid.h
index 17061bdee..772c8a716 100644
--- a/include/uid.h
+++ b/include/uid.h
@@ -16,12 +16,44 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#pragma once
-/**
- * This is the maximum length of a UUID (unique user identifier).
- * This length is set in compliance with TS6 protocol, and really should not be changed. Ever.
- * It allows for a lot of clients as-is. -- w00t.
- */
-#define UUID_LENGTH 10
+class TestSuite;
+
+class CoreExport UIDGenerator
+{
+ friend class TestSuite;
+
+ /** Holds the current UID. Used to generate the next one.
+ */
+ std::string current_uid;
+
+ /** Increments the current UID by one.
+ */
+ void IncrementUID(unsigned int pos);
+
+ public:
+ /**
+ * This is the maximum length of a UUID (unique user identifier).
+ * This length is set in compliance with TS6 protocol, and really should not be changed. Ever.
+ * It allows for a lot of clients as-is. -- w00t.
+ */
+ static const unsigned int UUID_LENGTH = 9;
+
+ /** Initializes this UID generator with the given SID
+ * @param sid SID that conforms to InspIRCd::IsSID()
+ */
+ void init(const std::string& sid);
+ /** Returns the next available UID for this server.
+ */
+ std::string GetUID();
+ /** Generates a pseudorandom SID based on a servername and a description
+ * Guaranteed to return the same if invoked with the same parameters
+ * @param servername The server name to use as seed
+ * @param serverdesc The server description to use as seed
+ * @return A valid SID
+ */
+ static std::string GenerateSID(const std::string& servername, const std::string& serverdesc);
+};
diff --git a/include/usermanager.h b/include/usermanager.h
index 3d7fe88fb..560db17f2 100644
--- a/include/usermanager.h
+++ b/include/usermanager.h
@@ -17,8 +17,7 @@
*/
-#ifndef USERMANAGER_H
-#define USERMANAGER_H
+#pragma once
#include <list>
@@ -70,6 +69,12 @@ class CoreExport UserManager
*/
clonemap global_clones;
+ /**
+ * Reset the already_sent IDs so we don't wrap it around and drop a message
+ * Also removes all expired invites
+ */
+ void GarbageCollect();
+
/** Add a client to the system.
* This will create a new User, insert it into the user_hash,
* initialize it as not yet registered, and add it to the socket engine.
@@ -162,5 +167,3 @@ class CoreExport UserManager
*/
void ServerPrivmsgAll(const char* text, ...) CUSTOM_PRINTF(2, 3);
};
-
-#endif
diff --git a/include/users.h b/include/users.h
index 88abfbcd1..0f57074b2 100644
--- a/include/users.h
+++ b/include/users.h
@@ -22,12 +22,10 @@
*/
-#ifndef USERS_H
-#define USERS_H
+#pragma once
#include "socket.h"
#include "inspsocket.h"
-#include "dns.h"
#include "mode.h"
#include "membership.h"
@@ -146,6 +144,10 @@ struct CoreExport ConnectClass : public refcountbase
*/
unsigned long limit;
+ /** If set to true, no user DNS lookups are to be performed
+ */
+ bool nouserdns;
+
/** Create a new connect class with no settings.
*/
ConnectClass(ConfigTag* tag, char type, const std::string& mask);
@@ -267,10 +269,6 @@ class CoreExport User : public Extensible
*/
time_t signon;
- /** Time that the connection last sent a message, used to calculate idle time
- */
- time_t idle_lastmsg;
-
/** Client address that the user is connected from.
* Do not modify this value directly, use SetClientIP() to change it.
* Port is not valid for remote users.
@@ -333,7 +331,7 @@ class CoreExport User : public Extensible
std::string awaymsg;
/** Time the user last went away.
- * This is ONLY RELIABLE if user IS_AWAY()!
+ * This is ONLY RELIABLE if user IsAway()!
*/
time_t awaytime;
@@ -347,12 +345,6 @@ class CoreExport User : public Extensible
*/
unsigned int registered:3;
- /** True when DNS lookups are completed.
- * The UserResolver classes res_forward and res_reverse will
- * set this value once they complete.
- */
- unsigned int dns_done:1;
-
/** Whether or not to send an snotice about this user's quitting
*/
unsigned int quietquit:1;
@@ -364,27 +356,13 @@ class CoreExport User : public Extensible
*/
unsigned int quitting:1;
- /** Recursion fix: user is out of SendQ and will be quit as soon as possible.
- * This can't be handled normally because QuitUser itself calls Write on other
- * users, which could trigger their SendQ to overrun.
- */
- unsigned int quitting_sendq:1;
-
- /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks.
- */
- unsigned int exempt:1;
-
- /** has the user responded to their previous ping?
- */
- unsigned int lastping:1;
-
/** What type of user is this? */
const unsigned int usertype:2;
/** Get client IP string from sockaddr, using static internal buffer
* @return The IP string
*/
- const char* GetIPString();
+ const std::string& GetIPString();
/** Get CIDR mask, using default range, for this user
*/
@@ -402,12 +380,6 @@ class CoreExport User : public Extensible
*/
User(const std::string &uid, const std::string& srv, int objtype);
- /** Check if the user matches a G or K line, and disconnect them if they do.
- * @param doZline True if ZLines should be checked (if IP has changed since initial connect)
- * Returns true if the user matched a ban, false else.
- */
- bool CheckLines(bool doZline = false);
-
/** Returns the full displayed host of the user
* This member function returns the hostname of the user as seen by other users
* on the server, in nick!ident\@host form.
@@ -441,6 +413,18 @@ class CoreExport User : public Extensible
*/
std::string ProcessNoticeMasks(const char *sm);
+ /** Returns whether this user is currently away or not. If true,
+ * further information can be found in User::awaymsg and User::awaytime
+ * @return True if the user is away, false otherwise
+ */
+ bool IsAway() const { return (!awaymsg.empty()); }
+
+ /** Returns whether this user is an oper or not. If true,
+ * oper information can be obtained from User::oper
+ * @return True if the user is an oper, false otherwise
+ */
+ bool IsOper() const { return oper; }
+
/** Returns true if a notice mask is set
* @param sm A notice mask character to check
* @return True if the notice mask is set
@@ -515,10 +499,6 @@ class CoreExport User : public Extensible
*/
const std::string& MakeHostIP();
- /** Add the user to WHOWAS system
- */
- void AddToWhoWas();
-
/** Oper up the user using the given opertype.
* This will also give the +o usermode.
*/
@@ -691,20 +671,6 @@ class CoreExport User : public Extensible
*/
void SendAll(const char* command, const char* text, ...) CUSTOM_PRINTF(3, 4);
- /** Compile a channel list for this user. Used internally by WHOIS
- * @param source The user to prepare the channel list for
- * @param spy Whether to return the spy channel list rather than the normal one
- * @return This user's channel list
- */
- std::string ChannelList(User* source, bool spy);
-
- /** Split the channel list in cl which came from dest, and spool it to this user
- * Used internally by WHOIS
- * @param dest The user the original channel list came from
- * @param cl The channel list as a string obtained from User::ChannelList()
- */
- void SplitChanList(User* dest, const std::string &cl);
-
/** Remove this user from all channels they are on, and delete any that are now empty.
* This is used by QUIT, and will not send part messages!
*/
@@ -792,10 +758,28 @@ class CoreExport LocalUser : public User, public InviteBase
*/
int GetServerPort();
+ /** Recursion fix: user is out of SendQ and will be quit as soon as possible.
+ * This can't be handled normally because QuitUser itself calls Write on other
+ * users, which could trigger their SendQ to overrun.
+ */
+ unsigned int quitting_sendq:1;
+
+ /** has the user responded to their previous ping?
+ */
+ unsigned int lastping:1;
+
+ /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks.
+ */
+ unsigned int exempt:1;
+
/** Used by PING checking code
*/
time_t nping;
+ /** Time that the connection last sent a message, used to calculate idle time
+ */
+ time_t idle_lastmsg;
+
/** This value contains how far into the penalty threshold the user is.
* This is used either to enable fake lag or for excess flood quits
*/
@@ -804,15 +788,11 @@ class CoreExport LocalUser : public User, public InviteBase
static already_sent_t already_sent_id;
already_sent_t already_sent;
- /** Stored reverse lookup from res_forward. Should not be used after resolution.
- */
- std::string stored_host;
-
- /** Starts a DNS lookup of the user's IP.
- * This will cause two UserResolver classes to be instantiated.
- * When complete, these objects set User::dns_done to true.
+ /** Check if the user matches a G or K line, and disconnect them if they do.
+ * @param doZline True if ZLines should be checked (if IP has changed since initial connect)
+ * Returns true if the user matched a ban, false else.
*/
- void StartDNSLookup();
+ bool CheckLines(bool doZline = false);
/** Use this method to fully connect a user.
* This will send the message of the day, check G/K/E lines, etc.
@@ -839,23 +819,18 @@ class CoreExport LocalUser : public User, public InviteBase
InviteList& GetInviteList();
/** Returns true if a user is invited to a channel.
- * @param channel A channel name to look up
+ * @param channel A channel to look up
* @return True if the user is invited to the given channel
*/
- bool IsInvited(const irc::string &channel);
-
- /** Adds a channel to a users invite list (invites them to a channel)
- * @param channel A channel name to add
- * @param timeout When the invite should expire (0 == never)
- */
- void InviteTo(const irc::string &channel, time_t timeout);
+ bool IsInvited(Channel* chan) { return (Invitation::Find(chan, this) != NULL); }
/** Removes a channel from a users invite list.
* This member function is called on successfully joining an invite only channel
* to which the user has previously been invited, to clear the invitation.
* @param channel The channel to remove the invite to
+ * @return True if the user was invited to the channel and the invite was erased, false if the user wasn't invited
*/
- void RemoveInvite(const irc::string &channel);
+ bool RemoveInvite(Channel* chan);
void RemoveExpiredInvites();
@@ -926,42 +901,4 @@ inline FakeUser* IS_SERVER(User* u)
{
return u->usertype == USERTYPE_SERVER ? static_cast<FakeUser*>(u) : NULL;
}
-/** Is an oper */
-#define IS_OPER(x) (x->oper)
-/** Is away */
-#define IS_AWAY(x) (!x->awaymsg.empty())
-/** Derived from Resolver, and performs user forward/reverse lookups.
- */
-class CoreExport UserResolver : public Resolver
-{
- private:
- /** UUID we are looking up */
- std::string uuid;
- /** True if the lookup is forward, false if is a reverse lookup
- */
- bool fwd;
- public:
- /** Create a resolver.
- * @param user The user to begin lookup on
- * @param to_resolve The IP or host to resolve
- * @param qt The query type
- * @param cache Modified by the constructor if the result was cached
- */
- UserResolver(LocalUser* user, std::string to_resolve, QueryType qt, bool &cache);
-
- /** Called on successful lookup
- * @param result Result string
- * @param ttl Time to live for result
- * @param cached True if the result was found in the cache
- */
- void OnLookupComplete(const std::string &result, unsigned int ttl, bool cached);
-
- /** Called on failed lookup
- * @param e Error code
- * @param errormessage Error message string
- */
- void OnError(ResolverError e, const std::string &errormessage);
-};
-
-#endif
diff --git a/include/xline.h b/include/xline.h
index 2a49d8b80..119e29dc1 100644
--- a/include/xline.h
+++ b/include/xline.h
@@ -20,8 +20,7 @@
*/
-#ifndef XLINE_H
-#define XLINE_H
+#pragma once
/** XLine is the base class for ban lines such as G lines and K lines.
* Modules may derive from this, and their xlines will automatically be
@@ -101,7 +100,7 @@ class CoreExport XLine : public classbase
* line. Usually a line in the form 'expiring Xline blah, set by...'
* see the DisplayExpiry methods of GLine, ELine etc.
*/
- virtual void DisplayExpiry() = 0;
+ virtual void DisplayExpiry();
/** Returns the displayable form of the pattern for this xline,
* e.g. '*\@foo' or '*baz*'. This must always return the full pattern
@@ -177,8 +176,6 @@ class CoreExport KLine : public XLine
virtual void Apply(User* u);
- virtual void DisplayExpiry();
-
virtual const char* Displayable();
virtual bool IsBurstable();
@@ -225,8 +222,6 @@ class CoreExport GLine : public XLine
virtual void Apply(User* u);
- virtual void DisplayExpiry();
-
virtual const char* Displayable();
/** Ident mask (ident part only)
@@ -269,8 +264,6 @@ class CoreExport ELine : public XLine
virtual void Unset();
- virtual void DisplayExpiry();
-
virtual void OnAdd();
virtual const char* Displayable();
@@ -314,8 +307,6 @@ class CoreExport ZLine : public XLine
virtual void Apply(User* u);
- virtual void DisplayExpiry();
-
virtual const char* Displayable();
/** IP mask (no ident part)
@@ -351,8 +342,6 @@ class CoreExport QLine : public XLine
virtual void Apply(User* u);
- virtual void DisplayExpiry();
-
virtual const char* Displayable();
/** Nickname mask
@@ -537,4 +526,3 @@ class CoreExport XLineManager
void InvokeStats(const std::string &type, int numeric, User* user, string_list &results);
};
-#endif