]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/configreader.h
Add irc::dynamicbitmask class. Feel free to take a look and offer suggestions, as...
[user/henk/code/inspircd.git] / include / configreader.h
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *                <omster@gmail.com>
10  *     
11  * Written by Craig Edwards, Craig McLure, and others.
12  * This program is free but copyrighted software; see
13  *            the file COPYING for details.
14  *
15  * ---------------------------------------------------
16  */
17
18 #ifndef INSPIRCD_CONFIGREADER
19 #define INSPIRCD_CONFIGREADER
20
21 #include <sstream>
22 #include <string>
23 #include <vector>
24 #include <map>
25 #include "inspircd.h"
26 #include "globals.h"
27 #include "modules.h"
28 #include "socketengine.h"
29 #include "socket.h"
30
31 class ServerConfig;
32 class InspIRCd;
33
34 /** Types of data in the core config
35  */
36 enum ConfigDataType { DT_NOTHING, DT_INTEGER, DT_CHARPTR, DT_BOOLEAN };
37
38 /** Holds a config value, either string, integer or boolean.
39  * Callback functions receive one or more of these, either on
40  * their own as a reference, or in a reference to a deque of them.
41  * The callback function can then alter the values of the ValueItem
42  * classes to validate the settings.
43  */
44 class ValueItem
45 {
46         std::string v;
47  public:
48         ValueItem(int value);
49         ValueItem(bool value);
50         ValueItem(char* value);
51         void Set(char* value);
52         void Set(const char* val);
53         void Set(int value);
54         int GetInteger();
55         char* GetString();
56         bool GetBool();
57 };
58
59 /** The base class of the container 'ValueContainer'
60  * used internally by the core to hold core values.
61  */
62 class ValueContainerBase
63 {
64  public:
65         ValueContainerBase() { }
66         virtual ~ValueContainerBase() { }
67 };
68
69 /** ValueContainer is used to contain pointers to different
70  * core values such as the server name, maximum number of
71  * clients etc.
72  * It is specialized to hold a data type, then pointed at
73  * a value in the ServerConfig class. When the value has been
74  * read and validated, the Set method is called to write the
75  * value safely in a type-safe manner.
76  */
77 template<typename T> class ValueContainer : public ValueContainerBase
78 {
79         T val;
80
81  public:
82
83         ValueContainer()
84         {
85                 val = NULL;
86         }
87
88         ValueContainer(T Val)
89         {
90                 val = Val;
91         }
92
93         void Set(T newval, size_t s)
94         {
95                 memcpy(val, newval, s);
96         }
97 };
98
99 /** A specialization of ValueContainer to hold a pointer to a bool
100  */
101 typedef ValueContainer<bool*> ValueContainerBool;
102
103 /** A specialization of ValueContainer to hold a pointer to
104  * an unsigned int
105  */
106 typedef ValueContainer<unsigned int*> ValueContainerUInt;
107
108 /** A specialization of ValueContainer to hold a pointer to
109  * a char array.
110  */
111 typedef ValueContainer<char*> ValueContainerChar;
112
113 /** A specialization of ValueContainer to hold a pointer to
114  * an int
115  */
116 typedef ValueContainer<int*> ValueContainerInt;
117
118 /** A set of ValueItems used by multi-value validator functions
119  */
120 typedef std::deque<ValueItem> ValueList;
121
122 /** A callback for validating a single value
123  */
124 typedef bool (*Validator)(ServerConfig* conf, const char*, const char*, ValueItem&);
125 /** A callback for validating multiple value entries
126  */
127 typedef bool (*MultiValidator)(ServerConfig* conf, const char*, char**, ValueList&, int*);
128 /** A callback indicating the end of a group of entries
129  */
130 typedef bool (*MultiNotify)(ServerConfig* conf, const char*);
131
132 /** Holds a core configuration item and its callbacks
133  */
134 struct InitialConfig
135 {
136         char* tag;
137         char* value;
138         ValueContainerBase* val;
139         ConfigDataType datatype;
140         Validator validation_function;
141 };
142
143 /** Holds a core configuration item and its callbacks
144  * where there may be more than one item
145  */
146 struct MultiConfig
147 {
148         const char*     tag;
149         char*           items[12];
150         int             datatype[12];
151         MultiNotify     init_function;
152         MultiValidator  validation_function;
153         MultiNotify     finish_function;
154 };
155
156 /** A set of oper types
157  */
158 typedef std::map<irc::string,char*> opertype_t;
159
160 /** A Set of oper classes
161  */
162 typedef std::map<irc::string,char*> operclass_t;
163
164
165 /** This class holds the bulk of the runtime configuration for the ircd.
166  * It allows for reading new config values, accessing configuration files,
167  * and storage of the configuration data needed to run the ircd, such as
168  * the servername, connect classes, /ADMIN data, MOTDs and filenames etc.
169  */
170 class ServerConfig : public Extensible
171 {
172   private:
173         /** Creator/owner
174          */
175         InspIRCd* ServerInstance;
176
177         /** This variable holds the names of all
178          * files included from the main one. This
179          * is used to make sure that no files are
180          * recursively included.
181          */
182         std::vector<std::string> include_stack;
183
184         /** This private method processes one line of
185          * configutation, appending errors to errorstream
186          * and setting error if an error has occured.
187          */
188         bool ParseLine(ConfigDataHash &target, std::string &line, long linenumber, std::ostringstream &errorstream);
189   
190         /** Process an include directive
191          */
192         bool DoInclude(ConfigDataHash &target, const std::string &file, std::ostringstream &errorstream);
193
194         /** Check that there is only one of each configuration item
195          */
196         bool CheckOnce(char* tag, bool bail, userrec* user);
197   
198   public:
199
200         InspIRCd* GetInstance();
201           
202         /** This holds all the information in the config file,
203          * it's indexed by tag name to a vector of key/values.
204          */
205         ConfigDataHash config_data;
206
207         /** Max number of WhoWas entries per user.
208          */
209         int WhoWasGroupSize;
210
211         /** Max number of cumulative user-entries in WhoWas.
212          *  When max reached and added to, push out oldest entry FIFO style.
213          */
214         int WhoWasMaxGroups;
215
216         /** Max seconds a user is kept in WhoWas before being pruned.
217          */
218         int WhoWasMaxKeep;
219
220         /** Holds the server name of the local server
221          * as defined by the administrator.
222          */
223         char ServerName[MAXBUF];
224         
225         /* Holds the network name the local server
226          * belongs to. This is an arbitary field defined
227          * by the administrator.
228          */
229         char Network[MAXBUF];
230
231         /** Holds the description of the local server
232          * as defined by the administrator.
233          */
234         char ServerDesc[MAXBUF];
235
236         /** Holds the admin's name, for output in
237          * the /ADMIN command.
238          */
239         char AdminName[MAXBUF];
240
241         /** Holds the email address of the admin,
242          * for output in the /ADMIN command.
243          */
244         char AdminEmail[MAXBUF];
245
246         /** Holds the admin's nickname, for output
247          * in the /ADMIN command
248          */
249         char AdminNick[MAXBUF];
250
251         /** The admin-configured /DIE password
252          */
253         char diepass[MAXBUF];
254
255         /** The admin-configured /RESTART password
256          */
257         char restartpass[MAXBUF];
258
259         /** The pathname and filename of the message of the
260          * day file, as defined by the administrator.
261          */
262         char motd[MAXBUF];
263
264         /** The pathname and filename of the rules file,
265          * as defined by the administrator.
266          */
267         char rules[MAXBUF];
268
269         /** The quit prefix in use, or an empty string
270          */
271         char PrefixQuit[MAXBUF];
272
273         /** The last string found within a <die> tag, or
274          * an empty string.
275          */
276         char DieValue[MAXBUF];
277
278         /** The DNS server to use for DNS queries
279          */
280         char DNSServer[MAXBUF];
281
282         /** This variable contains a space-seperated list
283          * of commands which are disabled by the
284          * administrator of the server for non-opers.
285          */
286         char DisabledCommands[MAXBUF];
287
288         /** The full path to the modules directory.
289          * This is either set at compile time, or
290          * overridden in the configuration file via
291          * the <options> tag.
292          */
293         char ModPath[1024];
294
295         /** The temporary directory where modules are copied
296          */
297         char TempDir[1024];
298
299         /** The full pathname to the executable, as
300          * given in argv[0] when the program starts.
301          */
302         char MyExecutable[1024];
303
304         /** The file handle of the logfile. If this
305          * value is NULL, the log file is not open,
306          * probably due to a permissions error on
307          * startup (this should not happen in normal
308          * operation!).
309          */
310         FILE *log_file;
311
312         /** If this value is true, the owner of the
313          * server specified -nofork on the command
314          * line, causing the daemon to stay in the
315          * foreground.
316          */
317         bool nofork;
318         
319         /** If this value if true then all log
320          * messages will be output, regardless of
321          * the level given in the config file.
322          * This is set with the -debug commandline
323          * option.
324          */
325         bool forcedebug;
326         
327         /** If this is true then log output will be
328          * written to the logfile. This is the default.
329          * If you put -nolog on the commandline then
330          * the logfile will not be written.
331          * This is meant to be used in conjunction with
332          * -debug for debugging without filling up the
333          * hard disk.
334          */
335         bool writelog;
336
337         /** If this value is true, halfops have been
338          * enabled in the configuration file.
339          */
340         bool AllowHalfop;
341
342         /** The number of seconds the DNS subsystem
343          * will wait before timing out any request.
344          */
345         int dns_timeout;
346
347         /** The size of the read() buffer in the user
348          * handling code, used to read data into a user's
349          * recvQ.
350          */
351         int NetBufferSize;
352
353         /** The value to be used for listen() backlogs
354          * as default.
355          */
356         int MaxConn;
357
358         /** The soft limit value assigned to the irc server.
359          * The IRC server will not allow more than this
360          * number of local users.
361          */
362         unsigned int SoftLimit;
363
364         /** Maximum number of targets for a multi target command
365          * such as PRIVMSG or KICK
366          */
367         unsigned int MaxTargets;
368
369         /** The maximum number of /WHO results allowed
370          * in any single /WHO command.
371          */
372         int MaxWhoResults;
373
374         /** True if the DEBUG loglevel is selected.
375          */
376         int debugging;
377
378         /** The loglevel in use by the IRC server
379          */
380         int LogLevel;
381
382         /** How many seconds to wait before exiting
383          * the program when /DIE is correctly issued.
384          */
385         int DieDelay;
386
387         /** True if we're going to hide netsplits as *.net *.split for non-opers
388          */
389         bool HideSplits;
390
391         /** True if we're going to hide ban reasons for non-opers (e.g. G-Lines,
392          * K-Lines, Z-Lines)
393          */
394         bool HideBans;
395
396         /** If this is enabled then operators will
397          * see invisible (+i) channels in /whois.
398          */
399         bool OperSpyWhois;
400
401         /** Set to a non-empty string to obfuscate the server name of users in WHOIS
402          */
403         char HideWhoisServer[MAXBUF];
404
405         /** A list of IP addresses the server is listening
406          * on.
407          */
408         char addrs[MAXBUF][255];
409
410         /** The MOTD file, cached in a file_cache type.
411          */
412         file_cache MOTD;
413
414         /** The RULES file, cached in a file_cache type.
415          */
416         file_cache RULES;
417
418         /** The full pathname and filename of the PID
419          * file as defined in the configuration.
420          */
421         char PID[1024];
422
423         /** The connect classes in use by the IRC server.
424          */
425         ClassVector Classes;
426
427         /** A list of module names (names only, no paths)
428          * which are currently loaded by the server.
429          */
430         std::vector<std::string> module_names;
431
432         /** A list of ports which the server is listening on
433          */
434         int ports[255];
435
436         /** A list of the file descriptors for the listening client ports
437          */
438         ListenSocket* openSockfd[255];
439
440         /** Boolean sets of which modules implement which functions
441          */
442         char implement_lists[255][255];
443
444         /** Global implementation list
445          */
446         char global_implementation[255];
447
448         /** A list of ports claimed by IO Modules
449          */
450         std::map<int,Module*> IOHookModule;
451
452         /** The 005 tokens of this server (ISUPPORT)
453          * populated/repopulated upon loading or unloading
454          * modules.
455          */
456         std::string data005;
457
458         /** STATS characters in this list are available
459          * only to operators.
460          */
461         char UserStats[MAXBUF];
462         
463         /** The path and filename of the ircd.log file
464          */
465         std::string logpath;
466
467         /** Custom version string, which if defined can replace the system info in VERSION.
468          */
469         char CustomVersion[MAXBUF];
470
471         /** List of u-lined servers
472          */
473         std::vector<irc::string> ulines;
474
475         /** Max banlist sizes for channels (the std::string is a glob)
476          */
477         std::map<std::string,int> maxbans;
478
479         /** If set to true, no user DNS lookups are to be performed
480          */
481         bool NoUserDns;
482
483         /** If set to true, provide syntax hints for unknown commands
484          */
485         bool SyntaxHints;
486
487         /** If set to true, users appear to quit then rejoin when their hosts change.
488          * This keeps clients synchronized properly.
489          */
490         bool CycleHosts;
491
492         /** All oper type definitions from the config file
493          */
494         opertype_t opertypes;
495
496         /** All oper class definitions from the config file
497          */
498         operclass_t operclass;
499
500         /** Construct a new ServerConfig
501          */
502         ServerConfig(InspIRCd* Instance);
503
504         /** Clears the include stack in preperation for a Read() call.
505          */
506         void ClearStack();
507
508         /** Read the entire configuration into memory
509          * and initialize this class. All other methods
510          * should be used only by the core.
511          */
512         void Read(bool bail, userrec* user);
513
514         /** Read a file into a file_cache object
515          */
516         bool ReadFile(file_cache &F, const char* fname);
517
518         /** Load 'filename' into 'target', with the new config parser everything is parsed into
519          * tag/key/value at load-time rather than at read-value time.
520          */
521         bool LoadConf(ConfigDataHash &target, const char* filename, std::ostringstream &errorstream);
522         /** Load 'filename' into 'target', with the new config parser everything is parsed into
523          * tag/key/value at load-time rather than at read-value time.
524          */
525         bool LoadConf(ConfigDataHash &target, const std::string &filename, std::ostringstream &errorstream);
526         
527         /* Both these return true if the value existed or false otherwise */
528         
529         /** Writes 'length' chars into 'result' as a string
530          */
531         bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, int index, char* result, int length);
532         /** Writes 'length' chars into 'result' as a string
533          */
534         bool ConfValue(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, std::string &result);
535         
536         /** Tries to convert the value to an integer and write it to 'result'
537          */
538         bool ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, int index, int &result);
539         /** Tries to convert the value to an integer and write it to 'result'
540          */
541         bool ConfValueInteger(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, int &result);
542         
543         /** Returns true if the value exists and has a true value, false otherwise
544          */
545         bool ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, int index);
546         /** Returns true if the value exists and has a true value, false otherwise
547          */
548         bool ConfValueBool(ConfigDataHash &target, const std::string &tag, const std::string &var, int index);
549         
550         /** Returns the number of occurences of tag in the config file
551          */
552         int ConfValueEnum(ConfigDataHash &target, const char* tag);
553         /** Returns the number of occurences of tag in the config file
554          */
555         int ConfValueEnum(ConfigDataHash &target, const std::string &tag);
556         
557         /** Returns the numbers of vars inside the index'th 'tag in the config file
558          */
559         int ConfVarEnum(ConfigDataHash &target, const char* tag, int index);
560         /** Returns the numbers of vars inside the index'th 'tag in the config file
561          */
562         int ConfVarEnum(ConfigDataHash &target, const std::string &tag, int index);
563         
564         Module* GetIOHook(int port);
565         bool AddIOHook(int port, Module* iomod);
566         bool DelIOHook(int port);
567
568         static std::string GetFullProgDir(char** argv, int argc);
569         static bool DirValid(const char* dirandfile);
570         static char* CleanFilename(char* name);
571         static bool FileExists(const char* file);
572         
573 };
574
575 bool InitializeDisabledCommands(const char* data, InspIRCd* ServerInstance);
576
577 bool InitTypes(ServerConfig* conf, const char* tag);
578 bool InitClasses(ServerConfig* conf, const char* tag);
579 bool DoType(ServerConfig* conf, const char* tag, char** entries, ValueList &values, int* types);
580 bool DoClass(ServerConfig* conf, const char* tag, char** entries, ValueList &values, int* types);
581 bool DoneClassesAndTypes(ServerConfig* conf, const char* tag);
582
583 #endif