mirror of
https://github.com/anope/anope.git
synced 2026-06-30 18:26:38 +02:00
Added in new plaintext databases. Note: This currently has no automatic backup feature. Big thanks to Phil on this for mass scale testing
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2722 5417fbe8-f217-4b02-8779-1006273d7864
This commit is contained in:
@@ -3,11 +3,22 @@ Anope Version 1.9.2
|
||||
** ADDED CONFIGURATION DIRECTIVES **
|
||||
options:enablelogchannel added to auto turn on the logchannel on startup
|
||||
options:mlock added to configure the default mlock modes on new channels
|
||||
options:database added for the database modules
|
||||
|
||||
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||
chanserv:modules added cs_unban
|
||||
|
||||
** DELETED CONFIGURATION DIRECTIVES **
|
||||
nickserv:database deleted because of new database system
|
||||
nickserv:prenickdatabase deleted because of new database system
|
||||
chanserv:database deleted because of the new database system
|
||||
botserv:database deleted because of the new database system
|
||||
hostserv:database deleted because of the new database system
|
||||
operserv:database deleted because of the new database system
|
||||
operserv:newsdatabase deleted because of the new database system
|
||||
operserv:exceptiondatabase deleted because of the new database system
|
||||
hs_request:database deleted because of the new database system
|
||||
os_ignore:database deleted because of the new database system
|
||||
|
||||
Anope Version 1.9.1
|
||||
-------------------
|
||||
|
||||
+13
-79
@@ -238,7 +238,7 @@ networkinfo
|
||||
options
|
||||
{
|
||||
/*
|
||||
* The encryption module to use when dealing with passwords. This determines how
|
||||
* The encryption modules are used when dealing with passwords. This determines how
|
||||
* the passwords are stored in the databases, and does not add any security as
|
||||
* far as transmitting passwords over the network goes.
|
||||
*
|
||||
@@ -263,6 +263,12 @@ options
|
||||
*/
|
||||
encryption = "enc_none enc_sha1 enc_md5 enc_old"
|
||||
|
||||
/*
|
||||
* The database modules are used for saving and loading databases for Anope.
|
||||
* Currently, there is only one database module - db_plain
|
||||
*/
|
||||
database = "db_plain"
|
||||
|
||||
/*
|
||||
* These keys are used to initiate the random number generator. These numbers
|
||||
* MUST be random as you want your passcodes to be random. Don't give these
|
||||
@@ -701,19 +707,6 @@ nickserv
|
||||
*/
|
||||
description = "Nickname Registration Service"
|
||||
|
||||
/*
|
||||
* The filename of the NickServ database. The path is relative to the services
|
||||
* executable. If not given, defaults to "nick.db".
|
||||
*/
|
||||
database = "nick.db"
|
||||
|
||||
/*
|
||||
* The filename of the NickServ Pre-Nick database. The path is relative to the
|
||||
* services executable. This directive is only required if the e-mail registration
|
||||
* option is enabled.
|
||||
*/
|
||||
#prenickdatabase = "prenick.db"
|
||||
|
||||
/*
|
||||
* The core modules to load for NickServ. This is a space separated list that corresponds
|
||||
* to the base names of the modules for NickServ. This directive is optional, but highly recommended.
|
||||
@@ -889,12 +882,6 @@ chanserv
|
||||
*/
|
||||
description = "Channel Registration Service"
|
||||
|
||||
/*
|
||||
* The filename of the ChanServ database. The path is relative to the services
|
||||
* executable. If not given, defaults to "chan.db".
|
||||
*/
|
||||
database = "chan.db"
|
||||
|
||||
/*
|
||||
* The core modules to load for ChanServ. This is a space separated list that corresponds
|
||||
* to the base names of the modules for ChanServ. This directive is optional, but highly recommended.
|
||||
@@ -1072,12 +1059,6 @@ botserv
|
||||
*/
|
||||
description = "Bot Service"
|
||||
|
||||
/*
|
||||
* The filename of the BotServ database. The path is relative to the services
|
||||
* executable. If not given, defaults to "bot.db".
|
||||
*/
|
||||
database = "bot.db"
|
||||
|
||||
/*
|
||||
* The core modules to load for BotServ. This is a space separated list that corresponds
|
||||
* to the base names of the modules for BotServ. This directive is optional, but highly recommended.
|
||||
@@ -1171,12 +1152,6 @@ hostserv
|
||||
*/
|
||||
description = "vHost Service"
|
||||
|
||||
/*
|
||||
* The filename of the HostServ database. The path is relative to the services
|
||||
* executable. If not given, defaults to "hosts.db".
|
||||
*/
|
||||
database = "hosts.db"
|
||||
|
||||
/*
|
||||
* The core modules to load for HostServ. This is a space separated list that corresponds
|
||||
* to the base names of the modules for HostServ. This directive is optional, but highly recommended.
|
||||
@@ -1214,24 +1189,6 @@ operserv
|
||||
*/
|
||||
globaldescription = "Global Noticer"
|
||||
|
||||
/*
|
||||
* The filename of the OperServ database. The path is relative to the services
|
||||
* executable. If not given, defaults to "oper.db".
|
||||
*/
|
||||
database = "oper.db"
|
||||
|
||||
/*
|
||||
* The filename of OperServ's News database. The path is relative to the services
|
||||
* executable. If not given, defaults to "news.db".
|
||||
*/
|
||||
newsdatabase = "news.db"
|
||||
|
||||
/*
|
||||
* The filename of OperServ's Session Exception database. The path is relative to the services
|
||||
* executable. If not given, defaults to "exception.db".
|
||||
*/
|
||||
exceptiondatabase = "exception.db"
|
||||
|
||||
/*
|
||||
* The core modules to load for OperServ. This is a space separated list that corresponds
|
||||
* to the base names of the modules for OperServ. This directive is optional, but highly recommended.
|
||||
@@ -1529,12 +1486,15 @@ hs_request
|
||||
* If set, Services will send a memo to all Host Setters when a new vHost is requested.
|
||||
*/
|
||||
#memosetters = yes
|
||||
}
|
||||
|
||||
ns_noop_convert
|
||||
{
|
||||
/*
|
||||
* The filename of the vHost request database. The path is relative to the services
|
||||
* executable. If not given, defaults to "hs_request.db".
|
||||
* The filename of the NickServ AUTOOP convert database. The path is relative to the services
|
||||
* executable. If not given, defaults to "autoop.db".
|
||||
*/
|
||||
#database = "hs_request.db"
|
||||
#database = "autoop.db"
|
||||
}
|
||||
|
||||
ns_maxemail
|
||||
@@ -1547,29 +1507,3 @@ ns_maxemail
|
||||
#maxemails = 1
|
||||
}
|
||||
|
||||
ns_noop_convert
|
||||
{
|
||||
/*
|
||||
* The filename of the NickServ AUTOOP convert database. The path is relative to the services
|
||||
* executable. If not given, defaults to "autoop.db".
|
||||
*/
|
||||
#database = "autoop.db"
|
||||
}
|
||||
|
||||
os_ignore
|
||||
{
|
||||
/*
|
||||
* The filename of the Services' ignore database. The path is relative to the services
|
||||
* executable. If not given, defaults to "os_ignore.db".
|
||||
*/
|
||||
#database = "os_ignore.db"
|
||||
}
|
||||
|
||||
os_info
|
||||
{
|
||||
/*
|
||||
* The filename of the oper information database. The path is relative to the services
|
||||
* executable. If not given, defaults to "os_info.db".
|
||||
*/
|
||||
#database = "os_info.db"
|
||||
}
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ services.h: sysconf.h config.h extern.h
|
||||
extern.h: slist.h
|
||||
touch $@
|
||||
|
||||
pseudo.h: commands.h timers.h datafiles.h slist.h
|
||||
pseudo.h: commands.h timers.h slist.h
|
||||
touch $@
|
||||
|
||||
clean:
|
||||
|
||||
+2
-2
@@ -58,8 +58,8 @@ enum NickCoreFlag
|
||||
NI_SUSPENDED,
|
||||
/* Autoop nickname in channels */
|
||||
NI_AUTOOP,
|
||||
/* Nick won't expire */
|
||||
NI_NOEXPIRE,
|
||||
/* This nickcore is forbidden, which means the nickalias for it is aswell */
|
||||
NI_FORBIDDEN,
|
||||
|
||||
NI_END
|
||||
};
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
/* Name of configuration file (in Services directory) */
|
||||
#define SERVICES_CONF "services.conf"
|
||||
|
||||
/* Name of anope datbase */
|
||||
#define DATABASE_FILE "anope.db"
|
||||
|
||||
/* Name of log file (in Services directory) */
|
||||
#define LOG_FILENAME "services.log"
|
||||
|
||||
|
||||
+2
-16
@@ -432,8 +432,6 @@ class ServerConfig
|
||||
/* Global realname */
|
||||
char *desc_GlobalNoticer;
|
||||
|
||||
/* Name of the hostserv database */
|
||||
char *HostDBName;
|
||||
/* HostServ Name */
|
||||
char *s_HostServ;
|
||||
/* HostServ realname */
|
||||
@@ -443,18 +441,6 @@ class ServerConfig
|
||||
char *PIDFilename;
|
||||
/* MOTD filename */
|
||||
char *MOTDFilename;
|
||||
/* NickServ DB name */
|
||||
char *NickDBName;
|
||||
/* DB name for nicks being registered */
|
||||
char *PreNickDBName;
|
||||
/* Channel DB name */
|
||||
char *ChanDBName;
|
||||
/* Botserv DB name */
|
||||
char *BotDBName;
|
||||
/* OperServ db name */
|
||||
char *OperDBName;
|
||||
/* News DB name */
|
||||
char *NewsDBName;
|
||||
|
||||
/* True if its ok to not be able to save backs */
|
||||
bool NoBackupOkay;
|
||||
@@ -695,8 +681,6 @@ class ServerConfig
|
||||
unsigned MaxSessionLimit;
|
||||
/* How long session akills should last */
|
||||
time_t SessionAutoKillExpiry;
|
||||
/* DB name for exceptions */
|
||||
char *ExceptionDBName;
|
||||
/* Reason to use for session kills */
|
||||
char *SessionLimitExceeded;
|
||||
/* Optional second reason */
|
||||
@@ -708,6 +692,8 @@ class ServerConfig
|
||||
std::list<std::string> ModulesAutoLoad;
|
||||
/* Encryption modules */
|
||||
std::list<std::string> EncModuleList;
|
||||
/* Database modules */
|
||||
std::list<std::string> DBModuleList;
|
||||
/* HostServ Core Modules */
|
||||
std::list<std::string> HostServCoreModules;
|
||||
/* MemoServ Core Modules */
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
/* Database file descriptor structure and file handling routine prototypes.
|
||||
*
|
||||
* (C) 2003-2009 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for furhter details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DATAFILES_H
|
||||
#define DATAFILES_H
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <sys/param.h>
|
||||
#define DeleteFile unlink
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* DATAFILES_H */
|
||||
@@ -393,8 +393,6 @@ E void SetDefaultMLock();
|
||||
|
||||
/**** modules.c ****/
|
||||
E void modules_unload_all(bool unload_proto); /* Read warnings near function source */
|
||||
E void ModuleDatabaseBackup(const char *dbname);
|
||||
E void ModuleRemoveBackups(const char *dbname);
|
||||
|
||||
/**** nickserv.c ****/
|
||||
|
||||
|
||||
+98
-7
@@ -186,7 +186,7 @@ enum CommandReturn
|
||||
const char *ano_moderr();
|
||||
#endif
|
||||
|
||||
typedef enum { CORE,PROTOCOL,THIRD,SUPPORTED,QATESTED,ENCRYPTION } MODType;
|
||||
typedef enum { CORE,PROTOCOL,THIRD,SUPPORTED,QATESTED,ENCRYPTION,DATABASE } MODType;
|
||||
typedef enum { MOD_OP_LOAD, MOD_OP_UNLOAD } ModuleOperation;
|
||||
|
||||
/*************************************************************************/
|
||||
@@ -561,11 +561,15 @@ class CoreExport Module
|
||||
*/
|
||||
virtual void OnPostLoadDatabases() { }
|
||||
|
||||
/** Called when anope saves databases.
|
||||
* NOTE: This event is deprecated pending new database handling.
|
||||
* XXX.
|
||||
/** Called when the databases are saved
|
||||
* @return EVENT_CONTINUE to let other modules continue saving, EVENT_STOP to stop
|
||||
*/
|
||||
virtual void OnSaveDatabase() MARK_DEPRECATED { }
|
||||
virtual EventReturn OnSaveDatabase() { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when the databases are loaded
|
||||
* @return EVENT_CONTINUE to let other modules continue saving, EVENT_STOP to stop
|
||||
*/
|
||||
virtual EventReturn OnLoadDatabase() { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when anope backs up databases.
|
||||
* NOTE: This event is deprecated pending new database handling.
|
||||
@@ -684,6 +688,73 @@ class CoreExport Module
|
||||
*/
|
||||
virtual void OnDatabaseExpire() MARK_DEPRECATED { }
|
||||
|
||||
/** Called when the flatfile dbs are being written
|
||||
* @param Write A callback to the function used to insert a line into the database
|
||||
*/
|
||||
virtual void OnDatabaseWrite(void (*Write)(const std::string &)) { }
|
||||
|
||||
/** Called when a line is read from the database
|
||||
* @param params The params from the database
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to stop processing
|
||||
*/
|
||||
virtual EventReturn OnDatabaseRead(const std::vector<std::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when nickcore metadata is read from the database
|
||||
* @param nc The nickcore
|
||||
* @param key The metadata key
|
||||
* @param params The params from the database
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to stop processing
|
||||
*/
|
||||
virtual EventReturn OnDatabaseReadMetadata(NickCore *nc, const std::string &key, const std::vector<std::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when nickcore metadata is read from the database
|
||||
* @param na The nickalias
|
||||
* @param key The metadata key
|
||||
* @param params The params from the database
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to stop processing
|
||||
*/
|
||||
virtual EventReturn OnDatabaseReadMetadata(NickAlias *na, const std::string &key, const std::vector<std::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when botinfo metadata is read from the database
|
||||
* @param bi The botinfo
|
||||
* @param key The metadata key
|
||||
* @param params The params from the database
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to stop processing
|
||||
*/
|
||||
virtual EventReturn OnDatabaseReadMetadata(BotInfo *bi, const std::string &key, const std::vector<std::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when chaninfo metadata is read from the database
|
||||
* @param ci The chaninfo
|
||||
* @param key The metadata key
|
||||
* @param params The params from the database
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to stop processing
|
||||
*/
|
||||
virtual EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const std::string &key, const std::vector<std::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when we are writing metadata for a nickcore
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param nc The nickcore
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const std::string &, const std::string &), NickCore *nc) { }
|
||||
|
||||
/** Called when we are wrting metadata for a nickalias
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param na The nick alias
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const std::string &, const std::string &), NickAlias *na) { }
|
||||
|
||||
/** Called when we are writing metadata for a botinfo
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param bi The botinfo
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const std::string &, const std::string &), BotInfo *bi) { }
|
||||
|
||||
/** Called when are are writing metadata for a channelinfo
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param bi The channelinfo
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const std::string &, const std::string &), ChannelInfo *ci) { }
|
||||
|
||||
/** Called before services restart
|
||||
*/
|
||||
virtual void OnPreRestart() { }
|
||||
@@ -983,6 +1054,18 @@ class CoreExport Module
|
||||
*/
|
||||
virtual EventReturn OnUnMLock(ChannelModeName Name) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called after a module is loaded
|
||||
* @param u The user loading the module, can be NULL
|
||||
* @param m The module
|
||||
*/
|
||||
virtual void OnModuleLoad(User *u, Module *m) { }
|
||||
|
||||
/** Called before a module is unloaded
|
||||
* @param u The user, can be NULL
|
||||
* @param m The module
|
||||
*/
|
||||
virtual void OnModuleUnload(User *u, Module *m) { }
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -1019,9 +1102,17 @@ enum Implementation
|
||||
/* OperServ */
|
||||
I_OnOperServHelp, I_OnDefconLevel,
|
||||
|
||||
/* Database */
|
||||
I_OnPostLoadDatabases, I_OnSaveDatabase, I_OnLoadDatabase, I_OnBackupDatabase,
|
||||
I_OnDatabaseExpire,
|
||||
I_OnDatabaseWrite, I_OnDatabaseRead, I_OnDatabaseReadMetadata, I_OnDatabaseWriteMetadata,
|
||||
|
||||
/* Modules */
|
||||
I_OnModuleLoad, I_OnModuleUnload,
|
||||
|
||||
/* Other */
|
||||
I_OnReload, I_OnPreServerConnect, I_OnNewServer, I_OnServerConnect, I_OnPreCommandRun, I_OnPreCommand, I_OnPostCommand, I_OnPostLoadDatabases, I_OnSaveDatabase, I_OnBackupDatabase,
|
||||
I_OnPreDatabaseExpire, I_OnDatabaseExpire, I_OnPreRestart, I_OnRestart, I_OnPreShutdown, I_OnShutdown, I_OnSignal,
|
||||
I_OnReload, I_OnPreServerConnect, I_OnNewServer, I_OnServerConnect, I_OnPreCommandRun, I_OnPreCommand, I_OnPostCommand,
|
||||
I_OnPreDatabaseExpire, I_OnPreRestart, I_OnRestart, I_OnPreShutdown, I_OnShutdown, I_OnSignal,
|
||||
I_OnServerQuit, I_OnTopicUpdated,
|
||||
I_OnEncrypt, I_OnEncryptInPlace, I_OnEncryptCheckLen, I_OnDecrypt, I_OnCheckPassword,
|
||||
I_OnChannelModeSet, I_OnChannelModeUnset, I_OnUserModeSet, I_OnUserModeUnset, I_OnChannelModeAdd, I_OnUserModeAdd,
|
||||
|
||||
@@ -15,5 +15,4 @@
|
||||
#include "commands.h"
|
||||
#include "language.h"
|
||||
#include "timers.h"
|
||||
#include "datafiles.h"
|
||||
#include "slist.h"
|
||||
|
||||
+2
-3
@@ -1,5 +1,5 @@
|
||||
OBJS = actions.o base64.o bots.o botserv.o channels.o chanserv.o command.o commands.o compat.o \
|
||||
config.o datafiles.o encrypt.o hashcomp.o hostserv.o init.o ircd.o language.o log.o mail.o main.o \
|
||||
config.o encrypt.o hashcomp.o hostserv.o init.o ircd.o language.o log.o mail.o main.o \
|
||||
memory.o memoserv.o messages.o misc.o modules.o nickserv.o operserv.o \
|
||||
process.o protocol.o send.o servers.o sessions.o slist.o sockutil.o opertype.o users.o module.o modulemanager.o configreader.o \
|
||||
wildcard.o nickcore.o nickalias.o timers.o modes.o regchannel.o
|
||||
@@ -7,7 +7,7 @@ OBJS = actions.o base64.o bots.o botserv.o channels.o chanserv.o command.o comm
|
||||
INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \
|
||||
../include/pseudo.h ../include/sysconf.h ../include/config.h \
|
||||
../include/messages.h ../include/services.h \
|
||||
../include/timers.h ../include/datafiles.h ../include/extern.h \
|
||||
../include/timers.h ../include/extern.h \
|
||||
../include/modules.h ../include/slist.h ../include/hashcomp.h
|
||||
|
||||
MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
|
||||
@@ -47,7 +47,6 @@ command.o: command.cpp $(INCLUDES)
|
||||
commands.o: commands.c $(INCLUDES)
|
||||
compat.o: compat.c $(INCLUDES)
|
||||
config.o: config.c $(INCLUDES)
|
||||
datafiles.o: datafiles.c $(INCLUDES)
|
||||
encrypt.o: encrypt.c $(INCLUDES)
|
||||
init.o: init.c $(INCLUDES)
|
||||
ircd.o: ircd.c $(INCLUDES)
|
||||
|
||||
+2
-5
@@ -719,12 +719,9 @@ int check_kick(User * user, const char *chan, time_t chants)
|
||||
|
||||
if (c)
|
||||
{
|
||||
c->RemoveMode(NULL, CMODE_BAN, mask);
|
||||
}
|
||||
|
||||
c->SetMode(NULL, CMODE_BAN, mask);
|
||||
if (c)
|
||||
c->SetMode(NULL, CMODE_BAN, mask);
|
||||
ircdproto->SendKick(whosends(ci), c, user, "%s", reason);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
+6
-28
@@ -22,6 +22,7 @@ ServerConfig Config;
|
||||
|
||||
static std::string Modules;
|
||||
static std::string EncModules;
|
||||
static std::string DBModules;
|
||||
static std::string HostCoreModules;
|
||||
static std::string MemoCoreModules;
|
||||
static std::string BotCoreModules;
|
||||
@@ -180,12 +181,7 @@ bool ValidateEmailReg(ServerConfig *, const char *tag, const char *value, ValueI
|
||||
{
|
||||
if (Config.NSEmailReg)
|
||||
{
|
||||
if (std::string(value) == "prenickdatabase")
|
||||
{
|
||||
if (data.GetValue().empty())
|
||||
throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty when e-mail registrations are enabled!");
|
||||
}
|
||||
else if (std::string(value) == "preregexpire")
|
||||
if (std::string(value) == "preregexpire")
|
||||
{
|
||||
if (!data.GetInteger())
|
||||
throw ConfigException(std::string("The value for <") + tag + ":" + value + "> must be non-zero when e-mail registration are enabled!");
|
||||
@@ -240,7 +236,7 @@ bool ValidateBotServ(ServerConfig *, const char *tag, const char *value, ValueIt
|
||||
{
|
||||
if (Config.s_BotServ)
|
||||
{
|
||||
if (std::string(value) == "description" || std::string(value) == "database")
|
||||
if (std::string(value) == "description")
|
||||
{
|
||||
if (data.GetValue().empty())
|
||||
throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty when BotServ is enabled!");
|
||||
@@ -258,7 +254,7 @@ bool ValidateHostServ(ServerConfig *, const char *tag, const char *value, ValueI
|
||||
{
|
||||
if (Config.s_HostServ)
|
||||
{
|
||||
if (std::string(value) == "description" || std::string(value) == "database")
|
||||
if (std::string(value) == "description")
|
||||
{
|
||||
if (data.GetValue().empty())
|
||||
throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty when HostServ is enabled!");
|
||||
@@ -613,6 +609,7 @@ int ServerConfig::Read(bool bail)
|
||||
{"networkinfo", "networkname", "", new ValueContainerChar(&Config.NetworkName), DT_CHARPTR, ValidateNotEmpty},
|
||||
{"networkinfo", "nicklen", "0", new ValueContainerUInt(&Config.NickLen), DT_UINTEGER | DT_NORELOAD, ValidateNickLen},
|
||||
{"options", "encryption", "", new ValueContainerString(&EncModules), DT_STRING | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"options", "database", "", new ValueContainerString(&DBModules), DT_STRING | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"options", "userkey1", "0", new ValueContainerLUInt(&Config.UserKey1), DT_LUINTEGER, NoValidation},
|
||||
{"options", "userkey2", "0", new ValueContainerLUInt(&Config.UserKey2), DT_LUINTEGER, NoValidation},
|
||||
{"options", "userkey3", "0", new ValueContainerLUInt(&Config.UserKey3), DT_LUINTEGER, NoValidation},
|
||||
@@ -645,9 +642,7 @@ int ServerConfig::Read(bool bail)
|
||||
{"options", "mlock", "+nrt", new ValueContainerString(&Config.MLock), DT_STRING, NoValidation},
|
||||
{"nickserv", "nick", "NickServ", new ValueContainerChar(&Config.s_NickServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"nickserv", "description", "Nickname Registration Service", new ValueContainerChar(&Config.desc_NickServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"nickserv", "database", "nick.db", new ValueContainerChar(&Config.NickDBName), DT_CHARPTR, ValidateNotEmpty},
|
||||
{"nickserv", "emailregistration", "no", new ValueContainerBool(&Config.NSEmailReg), DT_BOOLEAN, NoValidation},
|
||||
{"nickserv", "prenickdatabase", "", new ValueContainerChar(&Config.PreNickDBName), DT_CHARPTR, ValidateEmailReg},
|
||||
{"nickserv", "modules", "", new ValueContainerString(&NickCoreModules), DT_STRING, NoValidation},
|
||||
{"nickserv", "forceemail", "no", new ValueContainerBool(&Config.NSForceEmail), DT_BOOLEAN, ValidateEmailReg},
|
||||
{"nickserv", "defaults", "secure memosignon memoreceive", new ValueContainerString(&NSDefaults), DT_STRING, NoValidation},
|
||||
@@ -677,7 +672,6 @@ int ServerConfig::Read(bool bail)
|
||||
{"mail", "dontquoteaddresses", "no", new ValueContainerBool(&Config.DontQuoteAddresses), DT_BOOLEAN, NoValidation},
|
||||
{"chanserv", "nick", "ChanServ", new ValueContainerChar(&Config.s_ChanServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"chanserv", "description", "Channel Registration Service", new ValueContainerChar(&Config.desc_ChanServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"chanserv", "database", "chan.db", new ValueContainerChar(&Config.ChanDBName), DT_CHARPTR, ValidateNotEmpty},
|
||||
{"chanserv", "modules", "", new ValueContainerString(&ChanCoreModules), DT_STRING, NoValidation},
|
||||
{"chanserv", "defaults", "keeptopic secure securefounder signkick", new ValueContainerString(&CSDefaults), DT_STRING, NoValidation},
|
||||
{"chanserv", "maxregistered", "0", new ValueContainerUInt(&Config.CSMaxReg), DT_UINTEGER, NoValidation},
|
||||
@@ -699,7 +693,6 @@ int ServerConfig::Read(bool bail)
|
||||
{"memoserv", "memoreceipt", "0", new ValueContainerUInt(&Config.MSMemoReceipt), DT_UINTEGER, NoValidation},
|
||||
{"botserv", "nick", "", new ValueContainerChar(&Config.s_BotServ), DT_CHARPTR | DT_NORELOAD, NoValidation},
|
||||
{"botserv", "description", "Bot Service", new ValueContainerChar(&Config.desc_BotServ), DT_CHARPTR | DT_NORELOAD, ValidateBotServ},
|
||||
{"botserv", "database", "bot.db", new ValueContainerChar(&Config.BotDBName), DT_CHARPTR, ValidateBotServ},
|
||||
{"botserv", "modules", "", new ValueContainerString(&BotCoreModules), DT_STRING, NoValidation},
|
||||
{"botserv", "defaults", "", new ValueContainerString(&BSDefaults), DT_STRING, NoValidation},
|
||||
{"botserv", "minusers", "0", new ValueContainerUInt(&Config.BSMinUsers), DT_UINTEGER, ValidateBotServ},
|
||||
@@ -711,15 +704,11 @@ int ServerConfig::Read(bool bail)
|
||||
{"botserv", "fantasycharacter", "!", new ValueContainerChar(&Config.BSFantasyCharacter), DT_CHARPTR, NoValidation},
|
||||
{"hostserv", "nick", "", new ValueContainerChar(&Config.s_HostServ), DT_CHARPTR | DT_NORELOAD, NoValidation},
|
||||
{"hostserv", "description", "vHost Service", new ValueContainerChar(&Config.desc_HostServ), DT_CHARPTR | DT_NORELOAD, ValidateHostServ},
|
||||
{"hostserv", "database", "hosts.db", new ValueContainerChar(&Config.HostDBName), DT_CHARPTR, ValidateHostServ},
|
||||
{"hostserv", "modules", "", new ValueContainerString(&HostCoreModules), DT_STRING, NoValidation},
|
||||
{"operserv", "nick", "OperServ", new ValueContainerChar(&Config.s_OperServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"operserv", "description", "Operator Service", new ValueContainerChar(&Config.desc_OperServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"operserv", "globalnick", "Global", new ValueContainerChar(&Config.s_GlobalNoticer), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"operserv", "globaldescription", "Global Noticer", new ValueContainerChar(&Config.desc_GlobalNoticer), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
|
||||
{"operserv", "database", "oper.db", new ValueContainerChar(&Config.OperDBName), DT_CHARPTR, ValidateNotEmpty},
|
||||
{"operserv", "newsdatabase", "news.db", new ValueContainerChar(&Config.NewsDBName), DT_CHARPTR, ValidateNotEmpty},
|
||||
{"operserv", "exceptiondatabase", "exception.db", new ValueContainerChar(&Config.ExceptionDBName), DT_CHARPTR, ValidateNotEmpty},
|
||||
{"operserv", "modules", "", new ValueContainerString(&OperCoreModules), DT_STRING, NoValidation},
|
||||
{"operserv", "superadmin", "no", new ValueContainerBool(&Config.SuperAdmin), DT_BOOLEAN, NoValidation},
|
||||
{"operserv", "logmaxusers", "no", new ValueContainerBool(&Config.LogMaxUsers), DT_BOOLEAN, NoValidation},
|
||||
@@ -1689,6 +1678,7 @@ int read_config(int reload)
|
||||
/* Modules Autoload building... :P */
|
||||
Config.ModulesAutoLoad = BuildStringList(!Modules.empty() ? Modules : "");
|
||||
Config.EncModuleList = BuildStringList(!EncModules.empty() ? EncModules : "");
|
||||
Config.DBModuleList = BuildStringList(!DBModules.empty() ? DBModules : "");
|
||||
Config.HostServCoreModules = BuildStringList(!HostCoreModules.empty() ? HostCoreModules : "");
|
||||
Config.MemoServCoreModules = BuildStringList(!MemoCoreModules.empty() ? MemoCoreModules : "");
|
||||
Config.BotServCoreModules = BuildStringList(!BotCoreModules.empty() ? BotCoreModules : "");
|
||||
@@ -1775,18 +1765,6 @@ int read_config(int reload)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If they try to enable any email registration option,
|
||||
* make sure they have everything else they need too...
|
||||
*
|
||||
* rob
|
||||
**/
|
||||
if (!Config.NSEmailReg) {
|
||||
delete [] Config.PreNickDBName;
|
||||
Config.PreNickDBName = NULL;
|
||||
Config.NSRExpire = 0;
|
||||
}
|
||||
|
||||
SetDefaultMLock();
|
||||
|
||||
if (!retval) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -50,7 +50,9 @@ class CommandNSForbid : public Command
|
||||
}
|
||||
delete na;
|
||||
}
|
||||
na = new NickAlias(nick, new NickCore(nick));
|
||||
NickCore *nc = new NickCore(nick);
|
||||
nc->SetFlag(NI_FORBIDDEN);
|
||||
na = new NickAlias(nick, nc);
|
||||
if (na)
|
||||
{
|
||||
na->SetFlag(NS_FORBIDDEN);
|
||||
|
||||
@@ -65,7 +65,6 @@ class CommandNSIdentify : public Command
|
||||
alog("%s: %s!%s@%s logged out of account %s", Config.s_NickServ, u->nick, u->GetIdent().c_str(), u->host, u->nc->display);
|
||||
}
|
||||
|
||||
u->UpdateHost();
|
||||
if (na->last_realname)
|
||||
delete [] na->last_realname;
|
||||
na->last_realname = sstrdup(u->realname);
|
||||
@@ -75,6 +74,8 @@ class CommandNSIdentify : public Command
|
||||
ircdproto->SendAccountLogin(u, u->nc);
|
||||
ircdproto->SetAutoIdentificationToken(u);
|
||||
|
||||
u->UpdateHost();
|
||||
|
||||
FOREACH_MOD(I_OnNickIdentify, OnNickIdentify(u));
|
||||
|
||||
alog("%s: %s!%s@%s identified for nick %s", Config.s_NickServ, u->nick, u->GetIdent().c_str(), u->host, u->nick);
|
||||
|
||||
+57
-1
@@ -140,12 +140,68 @@ class OSIgnore : public Module
|
||||
this->SetType(CORE);
|
||||
this->AddCommand(OPERSERV, new CommandOSIgnore());
|
||||
|
||||
ModuleManager::Attach(I_OnOperServHelp, this);
|
||||
Implementation i[] = { I_OnOperServHelp, I_OnDatabaseRead, I_OnDatabaseWrite };
|
||||
ModuleManager::Attach(i, this, 3);
|
||||
}
|
||||
|
||||
void OnOperServHelp(User *u)
|
||||
{
|
||||
notice_lang(Config.s_OperServ, u, OPER_HELP_CMD_IGNORE);
|
||||
}
|
||||
|
||||
EventReturn OnDatabaseRead(const std::vector<std::string> ¶ms)
|
||||
{
|
||||
std::string buf;
|
||||
|
||||
if (params[0] == "OS" && params.size() >= 4 && params[1] == "IGNORE")
|
||||
{
|
||||
IgnoreData *ign = new IgnoreData;
|
||||
ign->mask = sstrdup(params[2].c_str());
|
||||
ign->time = strtol(params[3].c_str(), NULL, 10);
|
||||
ign->prev = NULL;
|
||||
ign->next = ignore;
|
||||
if (ignore)
|
||||
ignore->prev = ign;
|
||||
ignore = ign;
|
||||
|
||||
return EVENT_STOP;
|
||||
}
|
||||
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnDatabaseWrite(void (*Write)(const std::string &))
|
||||
{
|
||||
IgnoreData *ign, *next;
|
||||
time_t now = time(NULL);
|
||||
|
||||
for (ign = ignore; ign; ign = next)
|
||||
{
|
||||
next = ign->next;
|
||||
|
||||
if (ign->time != 0 && ign->time <= now)
|
||||
{
|
||||
if (debug)
|
||||
alog("[os_ignore] debug: Expiring ignore entry %s", ign->mask);
|
||||
if (ign->prev)
|
||||
ign->prev->next = ign->next;
|
||||
else if (ignore == ign)
|
||||
ignore = ign->next;
|
||||
if (ign->next)
|
||||
ign->next->prev = ign->prev;
|
||||
delete [] ign->mask;
|
||||
delete ign;
|
||||
ign = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string buf = "OS IGNORE ";
|
||||
buf += ign->mask;
|
||||
buf += " " + ign->time;
|
||||
Write(buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(OSIgnore)
|
||||
|
||||
@@ -32,6 +32,7 @@ class CommandOSModList : public Command
|
||||
int showEnc = 1;
|
||||
int showSupported = 1;
|
||||
int showQA = 1;
|
||||
int showDB = 1;
|
||||
|
||||
ci::string param = params.size() ? params[0] : "";
|
||||
ModuleHash *current = NULL;
|
||||
@@ -42,6 +43,7 @@ class CommandOSModList : public Command
|
||||
char enc[] = "Encryption";
|
||||
char supported[] = "Supported";
|
||||
char qa[] = "QATested";
|
||||
char db[] = "Database";
|
||||
|
||||
if (!param.empty())
|
||||
{
|
||||
@@ -53,6 +55,7 @@ class CommandOSModList : public Command
|
||||
showEnc = 0;
|
||||
showSupported = 0;
|
||||
showQA = 0;
|
||||
showDB = 0;
|
||||
}
|
||||
else if (param == third)
|
||||
{
|
||||
@@ -62,6 +65,7 @@ class CommandOSModList : public Command
|
||||
showQA = 0;
|
||||
showProto = 0;
|
||||
showEnc = 0;
|
||||
showDB = 0;
|
||||
}
|
||||
else if (param == proto)
|
||||
{
|
||||
@@ -71,6 +75,7 @@ class CommandOSModList : public Command
|
||||
showEnc = 0;
|
||||
showSupported = 0;
|
||||
showQA = 0;
|
||||
showDB = 0;
|
||||
}
|
||||
else if (param == supported)
|
||||
{
|
||||
@@ -80,6 +85,7 @@ class CommandOSModList : public Command
|
||||
showSupported = 1;
|
||||
showEnc = 0;
|
||||
showQA = 0;
|
||||
showDB = 0;
|
||||
}
|
||||
else if (param == qa)
|
||||
{
|
||||
@@ -89,6 +95,7 @@ class CommandOSModList : public Command
|
||||
showSupported = 0;
|
||||
showEnc = 0;
|
||||
showQA = 1;
|
||||
showDB = 0;
|
||||
}
|
||||
else if (param == enc)
|
||||
{
|
||||
@@ -98,6 +105,17 @@ class CommandOSModList : public Command
|
||||
showSupported = 0;
|
||||
showEnc = 1;
|
||||
showQA = 0;
|
||||
showDB = 0;
|
||||
}
|
||||
else if (param == db)
|
||||
{
|
||||
showCore = 0;
|
||||
showThird = 0;
|
||||
showProto = 0;
|
||||
showSupported = 0;
|
||||
showEnc = 0;
|
||||
showQA = 0;
|
||||
showDB = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,6 +168,13 @@ class CommandOSModList : public Command
|
||||
notice_lang(Config.s_OperServ, u, OPER_MODULE_LIST, current->name, current->m->version.c_str(), enc);
|
||||
++count;
|
||||
}
|
||||
break;
|
||||
case DATABASE:
|
||||
if (showDB)
|
||||
{
|
||||
notice_lang(Config.s_OperServ, u, OPER_MODULE_LIST, current->name, current->m->version.c_str(), enc);
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+39
-3
@@ -401,12 +401,15 @@ class OSNews : public Module
|
||||
this->AddCommand(OPERSERV, new CommandOSOperNews());
|
||||
this->AddCommand(OPERSERV, new CommandOSRandomNews());
|
||||
|
||||
Implementation i[] = { I_OnOperServHelp, I_OnUserModeSet, I_OnUserConnect, I_OnSaveDatabase, I_OnPostLoadDatabases };
|
||||
Implementation i[] = { I_OnOperServHelp, I_OnUserModeSet, I_OnUserConnect, I_OnDatabaseRead, I_OnDatabaseWrite };
|
||||
ModuleManager::Attach(i, this, 5);
|
||||
}
|
||||
|
||||
~OSNews()
|
||||
{
|
||||
for (std::vector<NewsItem *>::iterator it = News.begin(); it != News.end(); ++it)
|
||||
delete *it;
|
||||
News.clear();
|
||||
}
|
||||
|
||||
void OnOperServHelp(User *u)
|
||||
@@ -430,12 +433,45 @@ class OSNews : public Module
|
||||
DisplayNews(u, NEWS_RANDOM);
|
||||
}
|
||||
|
||||
void OnSaveDatabase()
|
||||
EventReturn OnDatabaseRead(const std::vector<std::string> ¶ms)
|
||||
{
|
||||
if (params[0] == "OS" && params.size() >= 7 && params[1] == "NEWS")
|
||||
{
|
||||
NewsItem *n = new NewsItem;
|
||||
n->num = atoi(params[2].c_str());
|
||||
n->time = strtol(params[3].c_str(), NULL, 10);
|
||||
strscpy(n->who, params[4].c_str(), NICKMAX);
|
||||
if (params[5] == "LOGON")
|
||||
n->type = NEWS_LOGON;
|
||||
else if (params[5] == "RANDOM")
|
||||
n->type = NEWS_RANDOM;
|
||||
else if (params[5] == "OPER")
|
||||
n->type = NEWS_OPER;
|
||||
n->Text = params[6];
|
||||
News.push_back(n);
|
||||
|
||||
return EVENT_STOP;
|
||||
}
|
||||
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnPostLoadDatabases()
|
||||
void OnDatabaseWrite(void (*Write)(const std::string &))
|
||||
{
|
||||
for (std::vector<NewsItem *>::iterator it = News.begin(); it != News.end(); ++it)
|
||||
{
|
||||
NewsItem *n = *it;
|
||||
|
||||
char buf[512], *ntype;
|
||||
if (n->type == NEWS_LOGON)
|
||||
ntype = "LOGON";
|
||||
else if (n->type == NEWS_RANDOM)
|
||||
ntype = "RANDOM";
|
||||
else if (n->type == NEWS_OPER)
|
||||
ntype = "OPER";
|
||||
snprintf(buf, sizeof(buf), "OS NEWS %d %ld %s %s :%s", n->num, n->time, n->who, ntype, n->Text.c_str());
|
||||
Write(buf);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
-203
@@ -1,203 +0,0 @@
|
||||
/* Database file handling routines.
|
||||
*
|
||||
* (C) 2003-2009 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "services.h"
|
||||
#include "datafiles.h"
|
||||
#include "modules.h"
|
||||
#include <fcntl.h>
|
||||
|
||||
static int curday = 0;
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/**
|
||||
* Renames a database
|
||||
*
|
||||
* @param name Database to name
|
||||
* @param ext Extention
|
||||
* @return void
|
||||
*/
|
||||
static void rename_database(const char *name, char *ext)
|
||||
{
|
||||
|
||||
char destpath[PATH_MAX];
|
||||
|
||||
snprintf(destpath, sizeof(destpath), "backups/%s.%s", name, ext);
|
||||
if (rename(name, destpath) != 0) {
|
||||
alog("Backup of %s failed.", name);
|
||||
ircdproto->SendGlobops(findbot(Config.s_OperServ), "WARNING! Backup of %s failed.",
|
||||
name);
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/**
|
||||
* Removes old databases
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
static void remove_backups()
|
||||
{
|
||||
|
||||
char ext[9];
|
||||
char path[PATH_MAX];
|
||||
|
||||
time_t t;
|
||||
struct tm tm;
|
||||
|
||||
time(&t);
|
||||
t -= (60 * 60 * 24 * Config.KeepBackups);
|
||||
tm = *localtime(&t);
|
||||
strftime(ext, sizeof(ext), "%Y%m%d", &tm);
|
||||
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.NickDBName, ext);
|
||||
DeleteFile(path);
|
||||
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.ChanDBName, ext);
|
||||
DeleteFile(path);
|
||||
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.OperDBName, ext);
|
||||
DeleteFile(path);
|
||||
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.NewsDBName, ext);
|
||||
DeleteFile(path);
|
||||
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.ExceptionDBName, ext);
|
||||
DeleteFile(path);
|
||||
|
||||
if (Config.s_BotServ) {
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.BotDBName, ext);
|
||||
DeleteFile(path);
|
||||
}
|
||||
if (Config.s_HostServ) {
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.HostDBName, ext);
|
||||
DeleteFile(path);
|
||||
}
|
||||
if (Config.NSEmailReg) {
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", Config.PreNickDBName, ext);
|
||||
DeleteFile(path);
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/**
|
||||
* Handles database backups.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
void backup_databases()
|
||||
{
|
||||
|
||||
time_t t;
|
||||
struct tm tm;
|
||||
|
||||
if (!Config.KeepBackups) {
|
||||
return;
|
||||
}
|
||||
|
||||
time(&t);
|
||||
tm = *localtime(&t);
|
||||
|
||||
if (!curday) {
|
||||
curday = tm.tm_yday;
|
||||
return;
|
||||
}
|
||||
|
||||
if (curday != tm.tm_yday) {
|
||||
|
||||
char ext[9];
|
||||
|
||||
|
||||
alog("Backing up databases");
|
||||
FOREACH_MOD(I_OnBackupDatabase, OnBackupDatabase())
|
||||
|
||||
remove_backups();
|
||||
|
||||
curday = tm.tm_yday;
|
||||
strftime(ext, sizeof(ext), "%Y%m%d", &tm);
|
||||
|
||||
rename_database(Config.NickDBName, ext);
|
||||
if (Config.s_BotServ) {
|
||||
rename_database(Config.BotDBName, ext);
|
||||
}
|
||||
rename_database(Config.ChanDBName, ext);
|
||||
if (Config.s_HostServ) {
|
||||
rename_database(Config.HostDBName, ext);
|
||||
}
|
||||
if (Config.NSEmailReg) {
|
||||
rename_database(Config.PreNickDBName, ext);
|
||||
}
|
||||
|
||||
rename_database(Config.OperDBName, ext);
|
||||
rename_database(Config.NewsDBName, ext);
|
||||
rename_database(Config.ExceptionDBName, ext);
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
void ModuleDatabaseBackup(const char *dbname)
|
||||
{
|
||||
|
||||
time_t t;
|
||||
struct tm tm;
|
||||
|
||||
if (!Config.KeepBackups) {
|
||||
return;
|
||||
}
|
||||
|
||||
time(&t);
|
||||
tm = *localtime(&t);
|
||||
|
||||
if (!curday) {
|
||||
curday = tm.tm_yday;
|
||||
return;
|
||||
}
|
||||
|
||||
if (curday != tm.tm_yday) {
|
||||
|
||||
char ext[9];
|
||||
|
||||
if (debug) {
|
||||
alog("Module Database Backing up %s", dbname);
|
||||
}
|
||||
ModuleRemoveBackups(dbname);
|
||||
curday = tm.tm_yday;
|
||||
strftime(ext, sizeof(ext), "%Y%m%d", &tm);
|
||||
rename_database(dbname, ext);
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
void ModuleRemoveBackups(const char *dbname)
|
||||
{
|
||||
char ext[9];
|
||||
char path[PATH_MAX];
|
||||
|
||||
time_t t;
|
||||
struct tm tm;
|
||||
|
||||
time(&t);
|
||||
t -= (60 * 60 * 24 * Config.KeepBackups);
|
||||
tm = *localtime(&t);
|
||||
strftime(ext, sizeof(ext), "%Y%m%d", &tm);
|
||||
|
||||
snprintf(path, sizeof(path), "backups/%s.%s", dbname, ext);
|
||||
DeleteFile(path);
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
+8
-4
@@ -388,6 +388,10 @@ int init_primary(int ac, char **av)
|
||||
|
||||
/* Add Encryption Modules */
|
||||
ModuleManager::LoadModuleList(Config.EncModuleList);
|
||||
|
||||
/* Add Database Modules */
|
||||
ModuleManager::LoadModuleList(Config.DBModuleList);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -500,7 +504,10 @@ int init_secondary(int ac, char **av)
|
||||
add_entropy_userkeys();
|
||||
|
||||
/* Load up databases */
|
||||
//alog("Databases loaded");
|
||||
alog("Loading databases...");
|
||||
EventReturn MOD_RESULT;
|
||||
FOREACH_RESULT(I_OnLoadDatabase, OnLoadDatabase());
|
||||
alog("Databases loaded");
|
||||
|
||||
// XXX: this is duplicated in type loading.
|
||||
for (std::list<std::pair<std::string, std::string> >::iterator it = Config.Opers.begin(); it != Config.Opers.end(); it++)
|
||||
@@ -561,9 +568,6 @@ int init_secondary(int ac, char **av)
|
||||
}
|
||||
|
||||
FOREACH_MOD(I_OnPostLoadDatabases, OnPostLoadDatabases());
|
||||
/* Save the databases back to file/mysql to reflect any changes */
|
||||
alog("Info: Reflecting database records.");
|
||||
save_databases();
|
||||
FOREACH_MOD(I_OnPreServerConnect, OnPreServerConnect());
|
||||
|
||||
/* Connect to the remote server */
|
||||
|
||||
+2
-2
@@ -29,7 +29,6 @@
|
||||
#include "services.h"
|
||||
#include "timers.h"
|
||||
#include "version.h"
|
||||
#include "datafiles.h"
|
||||
#include "modules.h"
|
||||
|
||||
// getrlimit.
|
||||
@@ -136,7 +135,8 @@ extern void expire_all()
|
||||
|
||||
void save_databases()
|
||||
{
|
||||
FOREACH_MOD(I_OnSaveDatabase, OnSaveDatabase())
|
||||
EventReturn MOD_RESULT;
|
||||
FOREACH_RESULT(I_OnSaveDatabase, OnSaveDatabase());
|
||||
if (debug)
|
||||
alog("debug: Saving FFF databases");
|
||||
}
|
||||
|
||||
@@ -255,6 +255,8 @@ int ModuleManager::LoadModule(const std::string &modname, User * u)
|
||||
m->OnPostLoadDatabases();
|
||||
}
|
||||
|
||||
FOREACH_MOD(I_OnModuleLoad, OnModuleLoad(u, m));
|
||||
|
||||
return MOD_ERR_OK;
|
||||
}
|
||||
|
||||
@@ -267,7 +269,7 @@ int ModuleManager::UnloadModule(Module *m, User *u)
|
||||
return MOD_ERR_PARAMS;
|
||||
}
|
||||
|
||||
if (m->GetPermanent() || m->type == PROTOCOL || m->type == ENCRYPTION)
|
||||
if (m->GetPermanent() || m->type == PROTOCOL || m->type == ENCRYPTION || m->type == DATABASE)
|
||||
{
|
||||
if (u)
|
||||
notice_lang(Config.s_OperServ, u, OPER_MODULE_NO_UNLOAD);
|
||||
@@ -280,6 +282,8 @@ int ModuleManager::UnloadModule(Module *m, User *u)
|
||||
notice_lang(Config.s_OperServ, u, OPER_MODULE_UNLOADED, m->name.c_str());
|
||||
}
|
||||
|
||||
FOREACH_MOD(I_OnModuleUnload, OnModuleUnload(u, m));
|
||||
|
||||
DeleteModule(m);
|
||||
return MOD_ERR_OK;
|
||||
}
|
||||
|
||||
+35
-125
@@ -24,9 +24,6 @@
|
||||
int HSRequestMemoUser = 0;
|
||||
int HSRequestMemoOper = 0;
|
||||
int HSRequestMemoSetters = 0;
|
||||
char *HSRequestDBName = NULL;
|
||||
|
||||
#define HSREQ_DEFAULT_DBNAME "hs_request.db"
|
||||
|
||||
/* Language defines */
|
||||
#define LNG_NUM_STRINGS 21
|
||||
@@ -58,8 +55,6 @@ int my_isvalidchar(const char c);
|
||||
void my_memo_lang(User *u, const char *name, int z, int number, ...);
|
||||
void req_send_memos(User *u, char *vIdent, char *vHost);
|
||||
|
||||
void hsreq_load_db();
|
||||
|
||||
void my_load_config();
|
||||
void my_add_languages();
|
||||
|
||||
@@ -410,10 +405,6 @@ class HSRequest : public Module
|
||||
this->AddCommand(HOSTSERV, new CommandHSReject());
|
||||
this->AddCommand(HOSTSERV, new CommandHSWaiting());
|
||||
|
||||
ModuleManager::Attach(I_OnPreCommand, this);
|
||||
ModuleManager::Attach(I_OnSaveDatabase, this);
|
||||
ModuleManager::Attach(I_OnBackupDatabase, this);
|
||||
|
||||
this->SetAuthor(AUTHOR);
|
||||
this->SetVersion(VERSION);
|
||||
this->SetType(SUPPORTED);
|
||||
@@ -421,8 +412,6 @@ class HSRequest : public Module
|
||||
my_load_config();
|
||||
hs_request_head = NULL;
|
||||
|
||||
hsreq_load_db();
|
||||
|
||||
const char* langtable_en_us[] = {
|
||||
/* LNG_REQUEST_SYNTAX */
|
||||
"Syntax: \002REQUEST \037vhost\037\002",
|
||||
@@ -679,7 +668,8 @@ class HSRequest : public Module
|
||||
this->InsertLanguage(LANG_RU, LNG_NUM_STRINGS, langtable_ru);
|
||||
this->InsertLanguage(LANG_IT, LNG_NUM_STRINGS, langtable_it);
|
||||
|
||||
ModuleManager::Attach(I_OnHostServHelp, this);
|
||||
Implementation i[] = { I_OnHostServHelp, I_OnPreCommand, I_OnDatabaseRead, I_OnDatabaseWrite };
|
||||
ModuleManager::Attach(i, this, 4);
|
||||
}
|
||||
|
||||
~HSRequest()
|
||||
@@ -689,8 +679,6 @@ class HSRequest : public Module
|
||||
/* Clean up all open host requests */
|
||||
while (hs_request_head)
|
||||
hs_request_head = deleteHostCore(hs_request_head, NULL);
|
||||
|
||||
delete [] HSRequestDBName;
|
||||
}
|
||||
|
||||
EventReturn OnPreCommand(User *u, const std::string &service, const ci::string &command, const std::vector<ci::string> ¶ms)
|
||||
@@ -726,52 +714,43 @@ class HSRequest : public Module
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnSaveDatabase()
|
||||
{
|
||||
FILE *fp;
|
||||
const char *db_filename;
|
||||
const char *vident;
|
||||
HostCore *current;
|
||||
|
||||
if (HSRequestDBName)
|
||||
db_filename = HSRequestDBName;
|
||||
else
|
||||
db_filename = HSREQ_DEFAULT_DBNAME;
|
||||
|
||||
fp = fopen(db_filename, "w");
|
||||
if (!fp)
|
||||
{
|
||||
alog("[hs_request] Unable to open database ('%s') for writing", db_filename);
|
||||
return;
|
||||
}
|
||||
|
||||
current = hs_request_head;
|
||||
while (current)
|
||||
{
|
||||
vident = current->vIdent ? current->vIdent : "(null)";
|
||||
fprintf(fp, "%s:%s:%s:%X:%s\n", current->nick, vident, current->vHost, static_cast<uint32>(current->time), current->creator);
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if (debug)
|
||||
alog("[hs_request] Successfully saved database");
|
||||
}
|
||||
|
||||
void OnBackupDatabase()
|
||||
{
|
||||
if (HSRequestDBName)
|
||||
ModuleDatabaseBackup(HSRequestDBName);
|
||||
else
|
||||
ModuleDatabaseBackup(HSREQ_DEFAULT_DBNAME);
|
||||
}
|
||||
|
||||
void OnHostServHelp(User *u)
|
||||
{
|
||||
this->NoticeLang(Config.s_HostServ, u, LNG_HELP);
|
||||
this->NoticeLang(Config.s_HostServ, u, LNG_HELP_SETTER);
|
||||
}
|
||||
|
||||
EventReturn OnDatabaseRead(const std::vector<std::string> ¶ms)
|
||||
{
|
||||
if (params[0] == "HS_REQUEST" && params.size() >= 6)
|
||||
{
|
||||
my_add_host_request(const_cast<char *>(params[1].c_str()), const_cast<char *>(params[2].c_str()), const_cast<char *>(params[3].c_str()), const_cast<char *>(params[4].c_str()), strtol(params[5].c_str(), NULL, 10));
|
||||
|
||||
return EVENT_STOP;
|
||||
}
|
||||
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnDatabaseWrite(void (*Write)(const std::string &))
|
||||
{
|
||||
for (HostCore *current = hs_request_head; current; current = current->next)
|
||||
{
|
||||
const char *vident = current->vIdent ? current->vIdent : "(null)";
|
||||
std::string buf = "HS_REQUEST ";
|
||||
// We really need a better + operator to make this easier ...
|
||||
buf += current->nick;
|
||||
buf += " ";
|
||||
buf += vident;
|
||||
buf += " ";
|
||||
buf += current->vHost;
|
||||
buf += " ";
|
||||
buf += current->time;
|
||||
buf += " ";
|
||||
buf += current->creator;
|
||||
Write(buf);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void my_memo_lang(User *u, const char *name, int z, int number, ...)
|
||||
@@ -872,84 +851,15 @@ int my_isvalidchar(const char c)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hsreq_load_db()
|
||||
{
|
||||
FILE *fp;
|
||||
const char *db_filename;
|
||||
char readbuf[1024];
|
||||
char *nick, *vident, *vhost, *creator, *tmp;
|
||||
int32 tmp_time;
|
||||
char *buf;
|
||||
|
||||
if (HSRequestDBName)
|
||||
db_filename = HSRequestDBName;
|
||||
else
|
||||
db_filename = HSREQ_DEFAULT_DBNAME;
|
||||
|
||||
fp = fopen(db_filename, "r");
|
||||
if (!fp)
|
||||
{
|
||||
alog("[hs_request] Unable to open database ('%s') for reading", db_filename);
|
||||
return;
|
||||
}
|
||||
|
||||
while (fgets(readbuf, 1024, fp))
|
||||
{
|
||||
buf = normalizeBuffer(readbuf);
|
||||
if (buf || *buf)
|
||||
{
|
||||
nick = myStrGetToken(buf, ':', 0);
|
||||
vident = myStrGetToken(buf, ':', 1);
|
||||
vhost = myStrGetToken(buf, ':', 2);
|
||||
tmp = myStrGetToken(buf, ':', 3);
|
||||
if (tmp)
|
||||
{
|
||||
tmp_time = strtol(tmp, NULL, 16);
|
||||
delete [] tmp;
|
||||
}
|
||||
else
|
||||
tmp_time = 0;
|
||||
creator = myStrGetToken(buf, ':', 4);
|
||||
if (!nick || !vident || !vhost || !creator)
|
||||
{
|
||||
alog("[hs_request] Error while reading database, skipping record");
|
||||
continue;
|
||||
}
|
||||
if (!stricmp(vident, "(null)"))
|
||||
{
|
||||
delete [] vident;
|
||||
vident = NULL;
|
||||
}
|
||||
my_add_host_request(nick, vident, vhost, creator, tmp_time);
|
||||
delete [] nick;
|
||||
delete [] vhost;
|
||||
delete [] creator;
|
||||
if (vident)
|
||||
delete [] vident;
|
||||
}
|
||||
delete [] buf;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if (debug)
|
||||
alog("[hs_request] Successfully loaded database");
|
||||
}
|
||||
|
||||
void my_load_config()
|
||||
{
|
||||
ConfigReader config;
|
||||
HSRequestMemoUser = config.ReadFlag("hs_request", "memouser", "no", 0);
|
||||
HSRequestMemoOper = config.ReadFlag("hs_request", "memooper", "no", 0);
|
||||
HSRequestMemoSetters = config.ReadFlag("hs_request", "memosetters", "no", 0);
|
||||
std::string tmp = config.ReadValue("hs_request", "database", HSREQ_DEFAULT_DBNAME, 0);
|
||||
|
||||
if (HSRequestDBName)
|
||||
delete [] HSRequestDBName;
|
||||
HSRequestDBName = sstrdup(tmp.c_str());
|
||||
|
||||
if (debug)
|
||||
alog("debug: [hs_request] Set config vars: MemoUser=%d MemoOper=%d MemoSetters=%d DBName='%s'", HSRequestMemoUser, HSRequestMemoOper, HSRequestMemoSetters, HSRequestDBName);
|
||||
alog("debug: [hs_request] Set config vars: MemoUser=%d MemoOper=%d MemoSetters=%d", HSRequestMemoUser, HSRequestMemoOper, HSRequestMemoSetters);
|
||||
}
|
||||
|
||||
MODULE_INIT(HSRequest)
|
||||
|
||||
@@ -1,490 +0,0 @@
|
||||
/* os_ignore_db.c - Provides a database backend for OS IGNORE.
|
||||
*
|
||||
* (C) 2003-2009 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Included in the Anope module pack since Anope 1.7.23
|
||||
* Anope Coder: Viper <viper@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
*/
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
#include "module.h"
|
||||
|
||||
#define AUTHOR "Viper"
|
||||
#define VERSION "$Id$"
|
||||
|
||||
/* Default database name */
|
||||
#define DefIgnoreDB "os_ignore.db"
|
||||
#define IGNOREDBVERSION 1
|
||||
|
||||
/* Database seperators */
|
||||
#define SEPARATOR '^' /* End of a key, seperates keys from values */
|
||||
#define BLOCKEND '\n' /* End of a block, e.g. a whole ignore */
|
||||
#define VALUEEND '\000' /* End of a value */
|
||||
#define SUBSTART '\010' /* Beginning of a new subblock, closed by a BLOCKEND */
|
||||
|
||||
/* Database reading return values */
|
||||
#define DB_READ_SUCCESS 0
|
||||
#define DB_READ_ERROR 1
|
||||
#define DB_EOF_ERROR 2
|
||||
#define DB_VERSION_ERROR 3
|
||||
#define DB_READ_BLOCKEND 4
|
||||
#define DB_READ_SUBSTART 5
|
||||
|
||||
#define DB_WRITE_SUCCESS 0
|
||||
#define DB_WRITE_ERROR 1
|
||||
#define DB_WRITE_NOVAL 2
|
||||
|
||||
/* Database Key, Value max length */
|
||||
#define MAXKEYLEN 128
|
||||
#define MAXVALLEN 1024
|
||||
|
||||
/* Structs */
|
||||
typedef struct db_file_ DBFile;
|
||||
|
||||
struct db_file_ {
|
||||
FILE *fptr; /* Pointer to the opened file */
|
||||
int db_version; /* The db version of the datafiles (only needed for reading) */
|
||||
int core_db_version; /* The current db version of this anope source */
|
||||
char service[256]; /* StatServ/etc. */
|
||||
char filename[256]; /* Filename of the database */
|
||||
char temp_name[262]; /* Temp filename of the database */
|
||||
};
|
||||
|
||||
|
||||
/* Variables */
|
||||
char *IgnoreDB;
|
||||
|
||||
/* Functions */
|
||||
int new_open_db_read(DBFile *dbptr, char **key, char **value);
|
||||
int new_open_db_write(DBFile *dbptr);
|
||||
void new_close_db(FILE *fptr, char **key, char **value);
|
||||
int new_read_db_entry(char **key, char **value, FILE * fptr);
|
||||
int new_write_db_entry(const char *key, DBFile *dbptr, const char *fmt, ...);
|
||||
int new_write_db_endofblock(DBFile *dbptr);
|
||||
void fill_db_ptr(DBFile *dbptr, int version, int core_version, char service[256], char filename[256]);
|
||||
|
||||
void load_ignore_db();
|
||||
void load_config();
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
class OSIgnoreDB : public Module
|
||||
{
|
||||
public:
|
||||
OSIgnoreDB(const std::string &modname, const std::string &creator) : Module(modname, creator)
|
||||
{
|
||||
IgnoreDB = NULL;
|
||||
|
||||
this->SetAuthor(AUTHOR);
|
||||
this->SetVersion(VERSION);
|
||||
this->SetType(SUPPORTED);
|
||||
|
||||
ModuleManager::Attach(I_OnSaveDatabase, this);
|
||||
ModuleManager::Attach(I_OnBackupDatabase, this);
|
||||
|
||||
load_config();
|
||||
/* Load the ignore database and re-add them to anopes ignorelist. */
|
||||
load_ignore_db();
|
||||
ModuleManager::Attach(I_OnReload, this);
|
||||
}
|
||||
|
||||
~OSIgnoreDB()
|
||||
{
|
||||
/* Save the ignore database before bailing out.. */
|
||||
OnSaveDatabase();
|
||||
|
||||
if (IgnoreDB)
|
||||
delete [] IgnoreDB;
|
||||
}
|
||||
|
||||
void OnReload(bool starting)
|
||||
{
|
||||
load_config();
|
||||
}
|
||||
|
||||
void OnSaveDatabase()
|
||||
{
|
||||
DBFile *dbptr = new DBFile;
|
||||
time_t now;
|
||||
IgnoreData *ign, *next;
|
||||
|
||||
now = time(NULL);
|
||||
fill_db_ptr(dbptr, 0, IGNOREDBVERSION, Config.s_OperServ, IgnoreDB);
|
||||
|
||||
/* time to backup the old db */
|
||||
rename(IgnoreDB, dbptr->temp_name);
|
||||
|
||||
if (new_open_db_write(dbptr)) {
|
||||
rename(dbptr->temp_name, IgnoreDB);
|
||||
delete dbptr;
|
||||
return; /* Bang, an error occurred */
|
||||
}
|
||||
|
||||
/* Store the version of the DB in the DB as well...
|
||||
* This will make stuff a lot easier if the database scheme needs to modified. */
|
||||
new_write_db_entry("IGNORE_DB_VERSION", dbptr, "%d", IGNOREDBVERSION);
|
||||
new_write_db_endofblock(dbptr);
|
||||
|
||||
/* Go over the entire ignorelist, check whether each entry is still valid
|
||||
* and write it to the database if it is.*/
|
||||
for (ign = ignore; ign; ign = next) {
|
||||
next = ign->next;
|
||||
|
||||
if (ign->time != 0 && ign->time <= now) {
|
||||
if (debug)
|
||||
alog("[os_ignore_db] debug: Expiring ignore entry %s", ign->mask);
|
||||
if (ign->prev)
|
||||
ign->prev->next = ign->next;
|
||||
else if (ignore == ign)
|
||||
ignore = ign->next;
|
||||
if (ign->next)
|
||||
ign->next->prev = ign->prev;
|
||||
delete [] ign->mask;
|
||||
delete ign;
|
||||
ign = NULL;
|
||||
} else {
|
||||
new_write_db_entry("m", dbptr, "%s", ign->mask);
|
||||
new_write_db_entry("t", dbptr, "%d", ign->time);
|
||||
new_write_db_endofblock(dbptr);
|
||||
}
|
||||
}
|
||||
|
||||
if (dbptr) {
|
||||
new_close_db(dbptr->fptr, NULL, NULL); /* close file */
|
||||
remove(dbptr->temp_name); /* saved successfully, no need to keep the old one */
|
||||
delete dbptr; /* free the db struct */
|
||||
}
|
||||
}
|
||||
|
||||
void OnBackupDatabase()
|
||||
{
|
||||
ModuleDatabaseBackup(IgnoreDB);
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
void load_config() {
|
||||
ConfigReader config;
|
||||
std::string tmp = config.ReadValue("os_ignore", "database", DefIgnoreDB, 0);
|
||||
|
||||
if (IgnoreDB)
|
||||
delete [] IgnoreDB;
|
||||
IgnoreDB = sstrdup(tmp.c_str());
|
||||
|
||||
if (debug)
|
||||
alog("[os_ignore_db] debug: Set config vars: OSIgnoreDBName='%s'", IgnoreDB);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/**************************************************************************
|
||||
* DataBase Handling
|
||||
**************************************************************************/
|
||||
|
||||
void load_ignore_db() {
|
||||
DBFile *dbptr = new DBFile;
|
||||
char *key, *value, *mask = NULL;
|
||||
int retval = 0;
|
||||
time_t expiry_time;
|
||||
IgnoreData *ign;
|
||||
|
||||
expiry_time = time(NULL);
|
||||
fill_db_ptr(dbptr, 0, IGNOREDBVERSION, Config.s_OperServ, IgnoreDB);
|
||||
|
||||
/* let's remove existing temp files here, because we only load dbs on startup */
|
||||
remove(dbptr->temp_name);
|
||||
|
||||
/* Open the db, fill the rest of dbptr and allocate memory for key and value */
|
||||
if (new_open_db_read(dbptr, &key, &value)) {
|
||||
delete dbptr;
|
||||
return; /* Bang, an error occurred */
|
||||
}
|
||||
|
||||
while (1) {
|
||||
/* read a new entry and fill key and value with it -Certus */
|
||||
retval = new_read_db_entry(&key, &value, dbptr->fptr);
|
||||
|
||||
if (retval == DB_READ_ERROR) {
|
||||
new_close_db(dbptr->fptr, &key, &value);
|
||||
delete dbptr;
|
||||
return;
|
||||
|
||||
} else if (retval == DB_EOF_ERROR) {
|
||||
new_close_db(dbptr->fptr, &key, &value);
|
||||
delete dbptr;
|
||||
return;
|
||||
} else if (retval == DB_READ_BLOCKEND) { /* DB_READ_BLOCKEND */
|
||||
/* Check if we have everything to add the ignore..
|
||||
* We shouldn't bother with already expired ignores either.. */
|
||||
if (mask && (expiry_time > time(NULL) || expiry_time == 0)) {
|
||||
/* We should check for double entries.. */
|
||||
for (ign = ignore; ign; ign = ign->next)
|
||||
if (!stricmp(ign->mask, mask))
|
||||
break;
|
||||
|
||||
if (!ign) {
|
||||
/* Create a fresh entry.. */
|
||||
ign = new IgnoreData;
|
||||
ign->mask = sstrdup(mask);
|
||||
ign->time = expiry_time;
|
||||
ign->prev = NULL;
|
||||
ign->next = ignore;
|
||||
if (ignore)
|
||||
ignore->prev = ign;
|
||||
ignore = ign;
|
||||
if (debug)
|
||||
alog("[os_ignore_db] debug: Added new ignore entry for %s", mask);
|
||||
} else {
|
||||
/* Update time on existing entry.
|
||||
* The longest expiry time survives.. */
|
||||
if (expiry_time == 0 || ign->time == 0)
|
||||
ign->time = 0;
|
||||
else if (expiry_time > ign->time)
|
||||
ign->time = expiry_time;
|
||||
}
|
||||
}
|
||||
|
||||
if (mask) delete [] mask;
|
||||
mask = NULL;
|
||||
expiry_time = time(NULL);
|
||||
} else { /* DB_READ_SUCCESS */
|
||||
if (!*key || !*value)
|
||||
continue;
|
||||
|
||||
/* mask */
|
||||
if (!stricmp(key, "m")) {
|
||||
if (mask)
|
||||
delete [] mask;
|
||||
mask = sstrdup(value);
|
||||
|
||||
/* expiry time */
|
||||
} else if (!stricmp(key, "t")) {
|
||||
expiry_time = atoi(value);
|
||||
|
||||
} else if (!stricmp(key, "IGNORE_DB_VERSION")) {
|
||||
if (atoi(value) != IGNOREDBVERSION) {
|
||||
alog("[\002os_ignore_db\002] Database version does not match any database versions supported by this module.");
|
||||
alog("[\002os_ignore_db\002] Continuing with clean database...");
|
||||
break;
|
||||
}
|
||||
}
|
||||
} /* else */
|
||||
} /* while */
|
||||
|
||||
delete dbptr;
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
||||
/**************************************************************************
|
||||
* Generic DataBase Functions (Borrowed this from Trystan :-) )
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
int new_open_db_read(DBFile *dbptr, char **key, char **value) {
|
||||
*key = new char[MAXKEYLEN];
|
||||
*value = new char[MAXVALLEN];
|
||||
|
||||
if (!(dbptr->fptr = fopen(dbptr->filename, "rb"))) {
|
||||
if (debug) {
|
||||
alog("debug: Can't read %s database %s : errno(%d)", dbptr->service,
|
||||
dbptr->filename, errno);
|
||||
}
|
||||
delete [] *key;
|
||||
*key = NULL;
|
||||
delete [] *value;
|
||||
*value = NULL;
|
||||
return DB_READ_ERROR;
|
||||
}
|
||||
dbptr->db_version = fgetc(dbptr->fptr) << 24 | fgetc(dbptr->fptr) << 16
|
||||
| fgetc(dbptr->fptr) << 8 | fgetc(dbptr->fptr);
|
||||
|
||||
if (ferror(dbptr->fptr)) {
|
||||
if (debug) {
|
||||
alog("debug: Error reading version number on %s", dbptr->filename);
|
||||
}
|
||||
delete [] *key;
|
||||
*key = NULL;
|
||||
delete [] *value;
|
||||
*value = NULL;
|
||||
return DB_READ_ERROR;
|
||||
} else if (feof(dbptr->fptr)) {
|
||||
if (debug) {
|
||||
alog("debug: Error reading version number on %s: End of file detected",
|
||||
dbptr->filename);
|
||||
}
|
||||
delete [] *key;
|
||||
*key = NULL;
|
||||
delete [] *value;
|
||||
*value = NULL;
|
||||
return DB_EOF_ERROR;
|
||||
} else if (dbptr->db_version < 1) {
|
||||
if (debug) {
|
||||
alog("debug: Invalid version number (%d) on %s", dbptr->db_version, dbptr->filename);
|
||||
}
|
||||
delete [] *key;
|
||||
*key = NULL;
|
||||
delete [] *value;
|
||||
*value = NULL;
|
||||
return DB_VERSION_ERROR;
|
||||
}
|
||||
return DB_READ_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int new_open_db_write(DBFile *dbptr) {
|
||||
if (!(dbptr->fptr = fopen(dbptr->filename, "wb"))) {
|
||||
if (debug) {
|
||||
alog("debug: %s Can't open %s database for writing", dbptr->service, dbptr->filename);
|
||||
}
|
||||
return DB_WRITE_ERROR;
|
||||
}
|
||||
|
||||
if (fputc(dbptr->core_db_version >> 24 & 0xFF, dbptr->fptr) < 0 ||
|
||||
fputc(dbptr->core_db_version >> 16 & 0xFF, dbptr->fptr) < 0 ||
|
||||
fputc(dbptr->core_db_version >> 8 & 0xFF, dbptr->fptr) < 0 ||
|
||||
fputc(dbptr->core_db_version & 0xFF, dbptr->fptr) < 0) {
|
||||
if (debug) {
|
||||
alog("debug: Error writing version number on %s", dbptr->filename);
|
||||
}
|
||||
return DB_WRITE_ERROR;
|
||||
}
|
||||
return DB_WRITE_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
void new_close_db(FILE *fptr, char **key, char **value) {
|
||||
if (key && *key) {
|
||||
delete [] *key;
|
||||
*key = NULL;
|
||||
}
|
||||
if (value && *value) {
|
||||
delete [] *value;
|
||||
*value = NULL;
|
||||
}
|
||||
|
||||
if (fptr) {
|
||||
fclose(fptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int new_read_db_entry(char **key, char **value, FILE *fptr) {
|
||||
char *string = *key;
|
||||
int character;
|
||||
int i = 0;
|
||||
|
||||
**key = '\0';
|
||||
**value = '\0';
|
||||
|
||||
while (1) {
|
||||
if ((character = fgetc(fptr)) == EOF) { /* a problem occurred reading the file */
|
||||
if (ferror(fptr)) {
|
||||
return DB_READ_ERROR; /* error! */
|
||||
}
|
||||
return DB_EOF_ERROR; /* end of file */
|
||||
} else if (character == BLOCKEND) { /* END OF BLOCK */
|
||||
return DB_READ_BLOCKEND;
|
||||
} else if (character == VALUEEND) { /* END OF VALUE */
|
||||
string[i] = '\0'; /* end of value */
|
||||
return DB_READ_SUCCESS;
|
||||
} else if (character == SEPARATOR) { /* END OF KEY */
|
||||
string[i] = '\0'; /* end of key */
|
||||
string = *value; /* beginning of value */
|
||||
i = 0; /* start with the first character of our value */
|
||||
} else {
|
||||
if ((i == (MAXKEYLEN - 1)) && (string == *key)) { /* max key length reached, continuing with value */
|
||||
string[i] = '\0'; /* end of key */
|
||||
string = *value; /* beginning of value */
|
||||
i = 0; /* start with the first character of our value */
|
||||
} else if ((i == (MAXVALLEN - 1)) && (string == *value)) { /* max value length reached, returning */
|
||||
string[i] = '\0';
|
||||
return DB_READ_SUCCESS;
|
||||
} else {
|
||||
string[i] = character; /* read string (key or value) */
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int new_write_db_entry(const char *key, DBFile *dbptr, const char *fmt, ...) {
|
||||
char string[MAXKEYLEN + MAXVALLEN + 2], value[MAXVALLEN]; /* safety byte :P */
|
||||
va_list ap;
|
||||
unsigned int length;
|
||||
|
||||
if (!dbptr) {
|
||||
return DB_WRITE_ERROR;
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(value, MAXVALLEN, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (!stricmp(value, "(null)")) {
|
||||
return DB_WRITE_NOVAL;
|
||||
}
|
||||
snprintf(string, MAXKEYLEN + MAXVALLEN + 1, "%s%c%s", key, SEPARATOR, value);
|
||||
length = strlen(string);
|
||||
string[length] = VALUEEND;
|
||||
length++;
|
||||
|
||||
if (fwrite(string, 1, length, dbptr->fptr) < length) {
|
||||
if (debug) {
|
||||
alog("debug: Error writing to %s", dbptr->filename);
|
||||
}
|
||||
new_close_db(dbptr->fptr, NULL, NULL);
|
||||
if (debug) {
|
||||
alog("debug: Restoring backup.");
|
||||
}
|
||||
remove(dbptr->filename);
|
||||
rename(dbptr->temp_name, dbptr->filename);
|
||||
delete dbptr;
|
||||
dbptr = NULL;
|
||||
return DB_WRITE_ERROR;
|
||||
}
|
||||
return DB_WRITE_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int new_write_db_endofblock(DBFile *dbptr) {
|
||||
if (!dbptr) {
|
||||
return DB_WRITE_ERROR;
|
||||
}
|
||||
if (fputc(BLOCKEND, dbptr->fptr) == EOF) {
|
||||
if (debug) {
|
||||
alog("debug: Error writing to %s", dbptr->filename);
|
||||
}
|
||||
new_close_db(dbptr->fptr, NULL, NULL);
|
||||
return DB_WRITE_ERROR;
|
||||
}
|
||||
return DB_WRITE_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void fill_db_ptr(DBFile *dbptr, int version, int core_version,
|
||||
char service[256], char filename[256]) {
|
||||
dbptr->db_version = version;
|
||||
dbptr->core_db_version = core_version;
|
||||
if (!service)
|
||||
strlcpy(dbptr->service, service, sizeof(dbptr->service));
|
||||
else
|
||||
strlcpy(dbptr->service, "", sizeof(dbptr->service));
|
||||
|
||||
strlcpy(dbptr->filename, filename, sizeof(dbptr->filename));
|
||||
snprintf(dbptr->temp_name, sizeof(dbptr->temp_name), "%s.temp", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
MODULE_INIT(OSIgnoreDB)
|
||||
+41
-152
@@ -21,9 +21,6 @@
|
||||
#define AUTHOR "Rob"
|
||||
#define VERSION "$Id$"
|
||||
|
||||
/* Default database name */
|
||||
#define DEFAULT_DB_NAME "os_info.db"
|
||||
|
||||
/* Multi-language stuff */
|
||||
#define LANG_NUM_STRINGS 10
|
||||
|
||||
@@ -40,11 +37,6 @@
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
char *OSInfoDBName = NULL;
|
||||
|
||||
int mLoadData();
|
||||
int mLoadConfig();
|
||||
|
||||
static Module *me;
|
||||
|
||||
/*************************************************************************/
|
||||
@@ -201,19 +193,9 @@ class OSInfo : public Module
|
||||
this->SetVersion(VERSION);
|
||||
this->SetType(SUPPORTED);
|
||||
|
||||
if (mLoadConfig())
|
||||
throw ModuleException("Unable to load config");
|
||||
|
||||
this->AddCommand(NICKSERV, new CommandNSOInfo());
|
||||
this->AddCommand(CHANSERV, new CommandCSOInfo());
|
||||
|
||||
ModuleManager::Attach(I_OnPostCommand, this);
|
||||
ModuleManager::Attach(I_OnSaveDatabase, this);
|
||||
ModuleManager::Attach(I_OnBackupDatabase, this);
|
||||
|
||||
mLoadData();
|
||||
ModuleManager::Attach(I_OnReload, this);
|
||||
|
||||
const char* langtable_en_us[] = {
|
||||
/* OINFO_SYNTAX */
|
||||
"Syntax: OINFO [ADD|DEL] nick <info>",
|
||||
@@ -427,8 +409,8 @@ class OSInfo : public Module
|
||||
this->InsertLanguage(LANG_RU, LANG_NUM_STRINGS, langtable_ru);
|
||||
this->InsertLanguage(LANG_IT, LANG_NUM_STRINGS, langtable_it);
|
||||
|
||||
Implementation i[] = { I_OnNickServHelp, I_OnChanServHelp };
|
||||
ModuleManager::Attach(i, this, 2);
|
||||
Implementation i[] = { I_OnNickServHelp, I_OnChanServHelp, I_OnPostCommand, I_OnDatabaseReadMetadata, I_OnDatabaseWriteMetadata };
|
||||
ModuleManager::Attach(i, this, 5);
|
||||
}
|
||||
|
||||
~OSInfo()
|
||||
@@ -455,18 +437,6 @@ class OSInfo : public Module
|
||||
ci->Shrink("os_info");
|
||||
}
|
||||
}
|
||||
|
||||
if (OSInfoDBName)
|
||||
delete [] OSInfoDBName;
|
||||
}
|
||||
|
||||
void OnReload(bool starting)
|
||||
{
|
||||
alog("os_info: Reloading configuration directives...");
|
||||
int ret = mLoadConfig();
|
||||
|
||||
if (ret)
|
||||
alog("os_info.c: ERROR: An error has occured while reloading the configuration file");
|
||||
}
|
||||
|
||||
void OnPostCommand(User *u, const std::string &service, const ci::string &command, const std::vector<ci::string> ¶ms)
|
||||
@@ -508,52 +478,6 @@ class OSInfo : public Module
|
||||
}
|
||||
}
|
||||
|
||||
void OnSaveDatabase()
|
||||
{
|
||||
ChannelInfo *ci = NULL;
|
||||
NickCore *nc = NULL;
|
||||
int i = 0;
|
||||
int ret = 0;
|
||||
FILE *out;
|
||||
|
||||
if (!(out = fopen(OSInfoDBName, "w")))
|
||||
{
|
||||
alog("os_info: ERROR: can not open the database file!");
|
||||
ircdproto->SendGlobops(findbot(Config.s_OperServ), "os_info: ERROR: can not open the database file!");
|
||||
ret = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 1024; ++i)
|
||||
{
|
||||
for (nc = nclists[i]; nc; nc = nc->next)
|
||||
{
|
||||
/* If we have any info on this user */
|
||||
char *c;
|
||||
if (nc->GetExtArray("os_info", c))
|
||||
fprintf(out, "N %s %s\n", nc->display, c);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 256; ++i)
|
||||
{
|
||||
for (ci = chanlists[i]; ci; ci = ci->next)
|
||||
{
|
||||
/* If we have any info on this channel */
|
||||
char *c;
|
||||
if (ci->GetExtArray("os_info", c))
|
||||
fprintf(out, "C %s %s\n", ci->name, c);
|
||||
}
|
||||
}
|
||||
fclose(out);
|
||||
}
|
||||
}
|
||||
|
||||
void OnBackupDatabase()
|
||||
{
|
||||
ModuleDatabaseBackup(OSInfoDBName);
|
||||
}
|
||||
|
||||
void OnNickServHelp(User *u)
|
||||
{
|
||||
this->NoticeLang(Config.s_NickServ, u, OINFO_HELP_CMD);
|
||||
@@ -563,91 +487,56 @@ class OSInfo : public Module
|
||||
{
|
||||
this->NoticeLang(Config.s_ChanServ, u, OCINFO_HELP_CMD);
|
||||
}
|
||||
};
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/**
|
||||
* Load data from the db file, and populate our OperInfo lines
|
||||
* @return 0 for success
|
||||
**/
|
||||
int mLoadData()
|
||||
{
|
||||
int ret = 0;
|
||||
FILE *in;
|
||||
|
||||
char *type = NULL;
|
||||
char *name = NULL;
|
||||
char *info = NULL;
|
||||
int len = 0;
|
||||
|
||||
ChannelInfo *ci = NULL;
|
||||
NickAlias *na = NULL;
|
||||
|
||||
/* will _never_ be this big thanks to the 512 limit of a message */
|
||||
char buffer[2000];
|
||||
if (!(in = fopen(OSInfoDBName, "r")))
|
||||
void OnDatabaseWriteMetadata(void (*WriteMetadata)(const std::string &, const std::string &), NickCore *nc)
|
||||
{
|
||||
alog("os_info: WARNING: can not open the database file! (it might not exist, this is not fatal)");
|
||||
ret = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (fgets(buffer, 1500, in))
|
||||
char *c;
|
||||
|
||||
if (nc->GetExtArray("os_info", c))
|
||||
{
|
||||
type = myStrGetToken(buffer, ' ', 0);
|
||||
name = myStrGetToken(buffer, ' ', 1);
|
||||
info = myStrGetTokenRemainder(buffer, ' ', 2);
|
||||
if (type)
|
||||
{
|
||||
if (name)
|
||||
{
|
||||
if (info)
|
||||
{
|
||||
len = strlen(info);
|
||||
/* Take the \n from the end of the line */
|
||||
info[len - 1] = '\0';
|
||||
if (!stricmp(type, "C"))
|
||||
{
|
||||
if ((ci = cs_findchan(name)))
|
||||
ci->Extend("os_info", new ExtensibleItemPointerArray<char>(sstrdup(info)));
|
||||
}
|
||||
else if (!stricmp(type, "N"))
|
||||
{
|
||||
if ((na = findnick(name)))
|
||||
na->nc->Extend("os_info", new ExtensibleItemPointerArray<char>(sstrdup(info)));
|
||||
}
|
||||
delete [] info;
|
||||
}
|
||||
delete [] name;
|
||||
}
|
||||
delete [] type;
|
||||
}
|
||||
std::string buf = ":";
|
||||
buf += c;
|
||||
WriteMetadata("OS_INFO", buf.c_str());
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the configuration directives from Services configuration file.
|
||||
* @return 0 for success
|
||||
**/
|
||||
int mLoadConfig()
|
||||
{
|
||||
ConfigReader config;
|
||||
std::string tmp = config.ReadValue("os_info", "database", DEFAULT_DB_NAME, 0);
|
||||
void OnDatabaseWriteMetadata(void (*WriteMetadata)(const std::string &, const std::string &), ChannelInfo *ci)
|
||||
{
|
||||
char *c;
|
||||
|
||||
if (OSInfoDBName)
|
||||
delete [] OSInfoDBName;
|
||||
if (ci->GetExtArray("os_info", c))
|
||||
{
|
||||
std::string buf = ":";
|
||||
buf += c;
|
||||
WriteMetadata("OS_INFO", buf.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
OSInfoDBName = sstrdup(tmp.c_str());
|
||||
EventReturn OnDatabaseReadMetadata(NickCore *nc, const std::string &key, const std::vector<std::string> ¶ms)
|
||||
{
|
||||
if (key == "OS_INFO")
|
||||
{
|
||||
nc->Shrink("os_info");
|
||||
nc->Extend("os_info", new ExtensibleItemPointerArray<char>(sstrdup(params[0].c_str()))); /// We really should use std::string here...
|
||||
|
||||
alog("os_info: Directive OSInfoDBName loaded (%s)...", OSInfoDBName);
|
||||
return EVENT_STOP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const std::string &key, const std::vector<std::string> ¶ms)
|
||||
{
|
||||
if (key == "OS_INFO")
|
||||
{
|
||||
ci->Shrink("os_info");
|
||||
ci->Extend("os_info", new ExtensibleItemPointerArray<char>(sstrdup(params[0].c_str())));
|
||||
|
||||
return EVENT_STOP;
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(OSInfo)
|
||||
|
||||
+4
-7
@@ -34,16 +34,13 @@ ChannelInfo::ChannelInfo(const std::string &chname)
|
||||
capsmin = capspercent = 0;
|
||||
floodlines = floodsecs = 0;
|
||||
repeattimes = 0;
|
||||
bi = NULL;
|
||||
|
||||
strscpy(this->name, chname.c_str(), CHANMAX);
|
||||
|
||||
/* If ircd doesn't exist, this is from DB load and mlock is set later */
|
||||
if (ircd)
|
||||
{
|
||||
mlock_on = DefMLockOn;
|
||||
mlock_off = DefMLockOff;
|
||||
Params = DefMLockParams;
|
||||
}
|
||||
mlock_on = DefMLockOn;
|
||||
mlock_off = DefMLockOff;
|
||||
Params = DefMLockParams;
|
||||
|
||||
size_t t;
|
||||
/* Set default channel flags */
|
||||
|
||||
+56
-54
@@ -297,26 +297,6 @@ int main(int argc, char *argv[])
|
||||
na->nc = findcore(s, 0);
|
||||
na->nc->aliascount++;
|
||||
free(s);
|
||||
|
||||
if (!na->nc->last_quit && quit)
|
||||
na->nc->last_quit = strdup(quit);
|
||||
if (!na->nc->last_realname && real)
|
||||
na->nc->last_realname = strdup(real);
|
||||
if (!na->nc->last_usermask && mask)
|
||||
na->nc->last_usermask = strdup(mask);
|
||||
|
||||
// Convert nick NOEXPIRE to group NOEXPIRE
|
||||
if (na->status & 0x0004)
|
||||
{
|
||||
na->nc->flags |= 0x00100000;
|
||||
}
|
||||
|
||||
// Convert nick FORBIDDEN to group FORBIDDEN
|
||||
if (na->status & 0x0002)
|
||||
{
|
||||
na->nc->flags |= 0x80000000;
|
||||
}
|
||||
|
||||
free(mask);
|
||||
free(real);
|
||||
free(quit);
|
||||
@@ -370,10 +350,12 @@ int main(int argc, char *argv[])
|
||||
// Enc pass
|
||||
b64_encode(nc->pass, hashm == "plain" ? strlen(nc->pass) : 32, (char *)cpass, 5000);
|
||||
|
||||
fs << "NC " << nc->display << " " << hashm << ":" << cpass << " " << nc->email;
|
||||
fs << "NC " << nc->display << " " << hashm << ":" << cpass << " ";
|
||||
fs << " " << GetLanguageID(nc->language) << " " << nc->memos.memomax << " " << nc->channelcount << std::endl;
|
||||
|
||||
std::cout << "Wrote account for " << nc->display << " passlen " << strlen(cpass) << std::endl;
|
||||
if (nc->email)
|
||||
fs << "MD EMAIL " << nc->email << std::endl;
|
||||
if (nc->greet)
|
||||
fs << "MD GREET :" << nc->greet << std::endl;
|
||||
if (nc->icq)
|
||||
@@ -404,13 +386,21 @@ int main(int argc, char *argv[])
|
||||
<< ((nc->flags & NI_HIDE_STATUS ) ? "HIDE_STATUS " : "")
|
||||
<< ((nc->flags & NI_SUSPENDED ) ? "SUSPENDED " : "")
|
||||
<< ((nc->flags & NI_AUTOOP ) ? "AUTOOP " : "")
|
||||
<< ((nc->flags & NI_NOEXPIRE ) ? "NOEXPIRE " : "")
|
||||
<< ((nc->flags & NI_FORBIDDEN ) ? "FORBIDDEN " : "") << std::endl;
|
||||
if (nc->memos.memocount)
|
||||
{
|
||||
memos = nc->memos.memos;
|
||||
for (j = 0; j < nc->memos.memocount; j++, memos++)
|
||||
fs << "MD MI " << memos->number << " " << memos->flags << " " << memos->time << " " << memos->sender << " :" << memos->text << std::endl;
|
||||
{
|
||||
fs << "MD MI " << memos->number << " " << memos->time << " " << memos->sender;
|
||||
if (memos->flags & MF_UNREAD)
|
||||
fs << " UNREAD";
|
||||
if (memos->flags & MF_RECEIPT)
|
||||
fs << " RECEIPT";
|
||||
if (memos->flags & MF_NOTIFYS)
|
||||
fs << " NOTIFYS";
|
||||
fs << " :" << memos->text << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
/* we could do this in a seperate loop, I'm doing it here for tidiness. */
|
||||
@@ -430,12 +420,12 @@ int main(int argc, char *argv[])
|
||||
std::cout << "Writing: " << na->nc->display << "'s nick: " << na->nick << std::endl;
|
||||
|
||||
fs << "NA " << na->nc->display << " " << na->nick << " " << na->time_registered << " " << na->last_seen << std::endl;
|
||||
if (nc->last_usermask)
|
||||
fs << "MD LAST_USERMASK " << nc->last_usermask << std::endl;
|
||||
if (nc->last_realname)
|
||||
fs << "MD LAST_REALNAME :" << nc->last_realname << std::endl;
|
||||
if (nc->last_quit)
|
||||
fs << "MD LAST_QUIT :" << nc->last_quit << std::endl;
|
||||
if (na->last_usermask)
|
||||
fs << "MD LAST_USERMASK " << na->last_usermask << std::endl;
|
||||
if (na->last_realname)
|
||||
fs << "MD LAST_REALNAME :" << na->last_realname << std::endl;
|
||||
if (na->last_quit)
|
||||
fs << "MD LAST_QUIT :" << na->last_quit << std::endl;
|
||||
if ((na->status & NS_FORBIDDEN) || (na->status & NS_NO_EXPIRE))
|
||||
{
|
||||
fs << "MD FLAGS"
|
||||
@@ -728,11 +718,10 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
*last = NULL;
|
||||
}
|
||||
|
||||
close_db(f);
|
||||
}
|
||||
|
||||
close_db(f);
|
||||
|
||||
|
||||
ChannelInfo *ci;
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
@@ -762,7 +751,7 @@ int main(int argc, char *argv[])
|
||||
<< ((ci->flags & CI_PEACE ) ? " PEACE" : "")
|
||||
<< ((ci->flags & CI_SECURE ) ? " SECURE" : "")
|
||||
<< ((ci->flags & CI_FORBIDDEN ) ? " FORBIDDEN" : "")
|
||||
<< ((ci->flags & CI_NO_EXPIRE ) ? " NOEXPIRE" : "")
|
||||
<< ((ci->flags & CI_NO_EXPIRE ) ? " NO_EXPIRE" : "")
|
||||
<< ((ci->flags & CI_MEMO_HARDMAX ) ? " MEMO_HARDMAX" : "")
|
||||
<< ((ci->flags & CI_OPNOTICE ) ? " OPNOTICE" : "")
|
||||
<< ((ci->flags & CI_SECUREFOUNDER ) ? " SECUREFOUNDER" : "")
|
||||
@@ -782,7 +771,7 @@ int main(int argc, char *argv[])
|
||||
fs << "MD FORBID " << ci->forbidby << " :" << ci->forbidreason << std::endl;
|
||||
|
||||
for (j = 0; j < ci->accesscount; j++)
|
||||
{ // MD CH access <display> <level> <last_seen> <creator> - creator isn't in 1.9.0-1, but is in 1.9.2
|
||||
{ // MD ACCESS <display> <level> <last_seen> <creator> - creator isn't in 1.9.0-1, but is in 1.9.2
|
||||
if (ci->access[j].in_use)
|
||||
fs << "MD ACCESS "
|
||||
<< ci->access[j].nc->display << " " << ci->access[j].level << " "
|
||||
@@ -790,14 +779,18 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
for (j = 0; j < ci->akickcount; j++)
|
||||
{ // MD CH akick <USED/NOTUSED> <STUCK/UNSTUCK> <NICK/MASK> <akick> <creator> <addtime> :<reason>
|
||||
fs << "MD AKICK "
|
||||
<< ((ci->akick[j].flags & AK_USED) ? "USED " : "NOTUSED ")
|
||||
<< ((ci->akick[j].flags & AK_STUCK) ? "STUCK " : "UNSTUCK " )
|
||||
<< ((ci->akick[j].flags & AK_ISNICK) ? "NICK " : "MASK ")
|
||||
<< ((ci->akick[j].flags & AK_ISNICK) ? ci->akick[j].u.nc->display : ci->akick[j].u.mask )
|
||||
<< " " << ci->akick[j].creator << " " << ci->akick[j].addtime << " :" << ci->akick[j].reason
|
||||
<< std::endl;
|
||||
{ // MD AKICK <STUCK/UNSTUCK> <NICK/MASK> <akick> <creator> <addtime> :<reason>
|
||||
if (ci->akick[j].flags & 0x0001)
|
||||
{
|
||||
fs << "MD AKICK "
|
||||
<< ((ci->akick[j].flags & AK_STUCK) ? "STUCK " : "UNSTUCK " )
|
||||
<< ((ci->akick[j].flags & AK_ISNICK) ? "NICK " : "MASK ")
|
||||
<< ((ci->akick[j].flags & AK_ISNICK) ? ci->akick[j].u.nc->display : ci->akick[j].u.mask )
|
||||
<< " " << ci->akick[j].creator << " " << ci->akick[j].addtime << " :";
|
||||
if (ci->akick[j].reason)
|
||||
fs << ci->akick[j].reason;
|
||||
fs << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (ci->mlock_on)
|
||||
@@ -816,13 +809,13 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
fs << "MD MLP";
|
||||
if (ci->mlock_limit)
|
||||
fs << " LIMIT" << ci->mlock_limit;
|
||||
fs << " CMODE_LIMIT " << ci->mlock_limit;
|
||||
if (ci->mlock_key)
|
||||
fs << " KEY" << ci->mlock_key;
|
||||
fs << " CMODE_KEY " << ci->mlock_key;
|
||||
if (ci->mlock_flood)
|
||||
fs << " FLOOD" << ci->mlock_flood;
|
||||
fs << " CMODE_FLOOD " << ci->mlock_flood;
|
||||
if (ci->mlock_redirect)
|
||||
fs << " REDIRECT" << ci->mlock_redirect;
|
||||
fs << " CMODE_REDIRECT " << ci->mlock_redirect;
|
||||
fs << std::endl;
|
||||
}
|
||||
if (ci->memos.memocount)
|
||||
@@ -831,8 +824,14 @@ int main(int argc, char *argv[])
|
||||
memos = ci->memos.memos;
|
||||
for (j = 0; j < ci->memos.memocount; j++, memos++)
|
||||
{
|
||||
fs << "MD MI " << memos->number << " " << memos->flags << " "
|
||||
<< memos->time << " " << memos->sender << " :" << memos->text << std::endl;
|
||||
fs << "MD MI " << memos->number << " " << memos->time << " " << memos->sender;
|
||||
if (memos->flags & MF_UNREAD)
|
||||
fs << " UNREAD";
|
||||
if (memos->flags & MF_RECEIPT)
|
||||
fs << " RECEIPT";
|
||||
if (memos->flags & MF_NOTIFYS)
|
||||
fs << " NOTIFYS";
|
||||
fs << " :" << memos->text << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -878,12 +877,15 @@ int main(int argc, char *argv[])
|
||||
fs << "MD BI REPEATTIMES " << ci->repeattimes << std::endl;
|
||||
for (j = 0; j < ci->bwcount; j++)
|
||||
{
|
||||
fs << "MD BI BADWORD "
|
||||
<< (( ci->badwords[j].type == 0 ) ? "ANY " : "" )
|
||||
<< (( ci->badwords[j].type == 1 ) ? "SINGLE " : "" )
|
||||
<< (( ci->badwords[j].type == 3 ) ? "START " : "" )
|
||||
<< (( ci->badwords[j].type == 4 ) ? "END " : "" )
|
||||
<< ":" << ci->badwords[j].word << std::endl;
|
||||
if (ci->badwords[j].in_use)
|
||||
{
|
||||
fs << "MD BI BADWORD "
|
||||
<< (( ci->badwords[j].type == 0 ) ? "ANY " : "" )
|
||||
<< (( ci->badwords[j].type == 1 ) ? "SINGLE " : "" )
|
||||
<< (( ci->badwords[j].type == 3 ) ? "START " : "" )
|
||||
<< (( ci->badwords[j].type == 4 ) ? "END " : "" )
|
||||
<< ":" << ci->badwords[j].word << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
} /* for (chanlists[i]) */
|
||||
|
||||
+10
-9
@@ -116,6 +116,10 @@ struct nickalias_ {
|
||||
time_t last_seen; /* When it was seen online for the last time */
|
||||
uint16 status; /* See NS_* below */
|
||||
NickCore *nc; /* I'm an alias of this */
|
||||
|
||||
char *last_usermask;
|
||||
char *last_realname;
|
||||
char *last_quit;
|
||||
};
|
||||
|
||||
struct nickcore_ {
|
||||
@@ -136,9 +140,6 @@ struct nickcore_ {
|
||||
int unused; /* Used for nick collisions */
|
||||
int aliascount; /* How many aliases link to us? Remove the core if 0 */
|
||||
|
||||
char *last_quit; /* Last quit message */
|
||||
char *last_realname; /* Last realname */
|
||||
char *last_usermask; /* Last usermask */
|
||||
};
|
||||
|
||||
struct chaninfo_ {
|
||||
@@ -694,6 +695,12 @@ int delnick(NickAlias *na, int donttouchthelist)
|
||||
nalists[HASH(na->nick)] = na->next;
|
||||
}
|
||||
|
||||
if (na->last_usermask)
|
||||
free(na->last_usermask);
|
||||
if (na->last_realname)
|
||||
free(na->last_realname);
|
||||
if (na->last_quit)
|
||||
free(na->last_quit);
|
||||
/* free() us */
|
||||
free(na->nick);
|
||||
free(na);
|
||||
@@ -720,12 +727,6 @@ int delcore(NickCore *nc)
|
||||
free(nc->greet);
|
||||
if (nc->url)
|
||||
free(nc->url);
|
||||
if (nc->last_usermask)
|
||||
free(nc->last_usermask);
|
||||
if (nc->last_realname)
|
||||
free(nc->last_realname);
|
||||
if (nc->last_quit)
|
||||
free(nc->last_quit);
|
||||
if (nc->access) {
|
||||
for (i = 0; i < nc->accesscount; i++) {
|
||||
if (nc->access[i])
|
||||
|
||||
+1
-5
@@ -921,11 +921,7 @@ User *do_nick(const char *source, const char *nick, const char *username, const
|
||||
else
|
||||
{
|
||||
ntmp->last_seen = time(NULL);
|
||||
|
||||
if (ntmp->last_usermask)
|
||||
delete [] ntmp->last_usermask;
|
||||
std::string last_usermask = user->GetIdent() + "@" + user->GetDisplayedHost();
|
||||
ntmp->last_usermask = sstrdup(last_usermask.c_str());
|
||||
user->UpdateHost();
|
||||
ircdproto->SetAutoIdentificationToken(user);
|
||||
alog("%s: %s!%s@%s automatically identified for nick %s", Config.s_NickServ, user->nick, user->GetIdent().c_str(), user->host, user->nick);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user