X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/15a91b41493c79276ca1e59c09500eeb0fea888d..28aa186de14dc4fa7488866e70beb6ae933dde79:/chanserv/chanserv.h diff --git a/chanserv/chanserv.h b/chanserv/chanserv.h index c8f81c3e..1f0fcd70 100644 --- a/chanserv/chanserv.h +++ b/chanserv/chanserv.h @@ -11,6 +11,8 @@ #include #include #include +#include + #include "../lib/sstring.h" #include "../core/schedule.h" #include "../lib/flags.h" @@ -18,7 +20,10 @@ #include "../channel/channel.h" #include "../parser/parser.h" #include "../localuser/localuserchannel.h" + +#ifndef CS_NODB #include "../dbapi/dbapi.h" +#endif #define CS_PARANOID @@ -29,6 +34,29 @@ /* Q9 Version */ #define QVERSION "1.00" +/* Achievements: Nothing before ACHIEVEMENTS_START + * opt-in only after ACHIEVEMENTS_END + * Titles are valid only between ACHIEVEMENTS_START and ACHIEVEMENTS_END */ + +//#define ACH_TEST_APRIL1 + +#ifdef ACH_TEST_APRIL1 + +#define ACHIEVEMENTS_START 1269702917 +#define ACHIEVEMENTS_END 1270162800 + +#elif defined(ACH_TEST_POSTAPRIL1) + +#define ACHIEVEMENTS_START 0 +#define ACHIEVEMENTS_END 1269702917 + +#else + +#define ACHIEVEMENTS_START 1270076400 +#define ACHIEVEMENTS_END 1270162800 + +#endif + /* Mini-hash of known users on channels to make lookups faster; * how big do we make it? */ #define REGCHANUSERHASHSIZE 5 @@ -48,10 +76,10 @@ #define MAXSUSPENDHIT 500 /* Maximum number of times a user may attempt to auth */ -#define MAXAUTHATTEMPT 5 +#define MAXAUTHATTEMPT 10 /* Maximum number of hellos in a session */ -#define MAXHELLOS 3 +#define MAXHELLOS 2 /* Maximum number of times a user may actually be authed */ #define MAXAUTHCOUNT 2 @@ -66,10 +94,14 @@ #define CHALLENGEAUTHSITE "http://www.quakenet.org/development/challengeauth/" /* Cleanup options */ -#define CLEANUP_ACCOUNT_INACTIVE 80 -#define CLEANUP_ACCOUNT_UNUSED 10 +#define CLEANUP_ACCOUNT_INACTIVE 180 +#define CLEANUP_ACCOUNT_UNUSED 3 #define CLEANUP_CHANNEL_INACTIVE 40 +#define CLEANUP_AUTHHISTORY 60 + +#define CLEANUP_MIN_CHAN_SIZE 2 + /* Sizes of the main hashes */ #define REGUSERHASHSIZE 60000 #define MAILDOMAINHASHSIZE 60000 @@ -81,12 +113,21 @@ #define MAXCHANLEVS 500 #define MAXBANS 50 +/* Maximum number of channels a user may be known on */ +#define MAXCHANNELS 500 + /* Sources of entropy and standard length defines */ #define ENTROPYSOURCE "/dev/urandom" #define ENTROPYLEN 8 +/* Minimum acceptable reason length for stuff like deluser */ +#define MIN_REASONLEN 20 + #include "chanserv_messages.h" +#define CSMIN(a, b) ((a)<(b)?(a):(b)) +#define CSMAX(a, b) ((a)>(b)?(a):(b)) + /* List of privileged operations */ #define QPRIV_SUSPENDBYPASS 1 @@ -100,6 +141,9 @@ #define QPRIV_VIEWWELCOME 107 #define QPRIV_VIEWCOMMENTS 108 #define QPRIV_VIEWEMAIL 109 +#define QPRIV_VIEWCHANSUSPENSION 110 +#define QPRIV_VIEWSUSPENDEDBY 111 +#define QPRIV_VIEWWALLMESSAGE 112 #define QPRIV_CHANGECHANFLAGS 200 #define QPRIV_CHANGECHANLEV 201 @@ -131,7 +175,9 @@ /* User flags */ -#define QUFLAG_NOINFO 0x0001 /* +s */ +/* to reenable this also grep for NOINFO... as some code has been commented out */ +//#define QUFLAG_NOINFO 0x0001 /* +s */ +#define QUFLAG_INACTIVE 0x0001 /* +I */ #define QUFLAG_GLINE 0x0002 /* +g */ #define QUFLAG_NOTICE 0x0004 /* +n */ #define QUFLAG_STAFF 0x0008 /* +q */ @@ -144,11 +190,14 @@ #define QUFLAG_INFO 0x0400 /* +i */ #define QUFLAG_DELAYEDGLINE 0x0800 /* +G */ #define QUFLAG_NOAUTHLIMIT 0x1000 /* +L */ +#define QUFLAG_ACHIEVEMENTS 0x2000 /* +c */ #define QUFLAG_CLEANUPEXEMPT 0x4000 /* +D */ #define QUFLAG_TRUST 0x8000 /* +T */ -#define QUFLAG_ALL 0xdfff +#define QUFLAG_ALL 0xffff -#define UIsNoInfo(x) ((x)->flags & QUFLAG_NOINFO) +//#define UIsNoInfo(x) ((x)->flags & QUFLAG_NOINFO) +#define UIsNoInfo(x) 0 +#define UIsInactive(x) ((x)->flags & QUFLAG_INACTIVE) #define UIsGline(x) ((x)->flags & QUFLAG_GLINE) #define UIsNotice(x) ((x)->flags & QUFLAG_NOTICE) #define UIsSuspended(x) ((x)->flags & QUFLAG_SUSPENDED) @@ -162,14 +211,16 @@ #define UIsNoAuthLimit(x) ((x)->flags & QUFLAG_NOAUTHLIMIT) #define UIsCleanupExempt(x) ((x)->flags & QUFLAG_CLEANUPEXEMPT) #define UIsStaff(x) ((x)->flags & QUFLAG_STAFF) +#define UIsAchievements(x) ((x)->flags & QUFLAG_ACHIEVEMENTS) #define UHasSuspension(x) ((x)->flags & (QUFLAG_GLINE|QUFLAG_DELAYEDGLINE|QUFLAG_SUSPENDED)) -#define UHasStaffPriv(x) ((x)->flags * (QUFLAG_STAFF | QUFLAG_HELPER | QUFLAG_OPER | QUFLAG_ADMIN | QUFLAG_DEV)) +#define UHasStaffPriv(x) ((x)->flags & (QUFLAG_STAFF | QUFLAG_HELPER | QUFLAG_OPER | QUFLAG_ADMIN | QUFLAG_DEV)) #define UHasHelperPriv(x) ((x)->flags & (QUFLAG_HELPER | QUFLAG_OPER | QUFLAG_ADMIN | QUFLAG_DEV)) #define UHasOperPriv(x) ((x)->flags & (QUFLAG_OPER | QUFLAG_ADMIN | QUFLAG_DEV)) #define UHasAdminPriv(x) ((x)->flags & (QUFLAG_ADMIN | QUFLAG_DEV)) +#define USetInactive(x) ((x)->flags |= QUFLAG_INACTIVE) #define USetGline(x) ((x)->flags |= QUFLAG_GLINE) #define USetNotice(x) ((x)->flags |= QUFLAG_NOTICE) #define USetSuspended(x) ((x)->flags |= QUFLAG_SUSPENDED) @@ -184,6 +235,7 @@ #define USetCleanupExempt(x) ((x)->flags |= QUFLAG_CLEANUPEXEMPT) #define USetTrust(x) ((x)->flags |= QUFLAG_TRUST) +#define UClearInactive(x) ((x)->flags &= ~QUFLAG_INACTIVE) #define UClearGline(x) ((x)->flags &= ~QUFLAG_GLINE) #define UClearNotice(x) ((x)->flags &= ~QUFLAG_NOTICE) #define UClearSuspended(x) ((x)->flags &= ~QUFLAG_SUSPENDED) @@ -200,15 +252,16 @@ /* email */ #define MAX_RESEND_TIME 2*3600L /* cooling off period */ -#define VALID_EMAIL "^[-_.+[:alpha:][:digit:]]+(\\.[-_[:digit:][:alpha:]]+)*@([[:digit:][:alpha:]](-?[[:digit:][:alpha:]])*\\.)+[[:alpha:]]{2}([zmuvtgo]|fo|me|seum|op|ro)?$" +#define VALID_EMAIL "^[-_.+[:alpha:][:digit:]]+(\\.[-_[:digit:][:alpha:]]+)*@([[:digit:][:alpha:]](-?[[:digit:][:alpha:]])*\\.)+[[:alpha:]]{2}([zmuvtgol]|fo|me|seum|op|ro)?$" -#define VALID_ACCOUNT_NAME "^[-a-z0-9]*$" +#define VALID_ACCOUNT_NAME "^[a-z][-a-z0-9]+$" #define QMAIL_NEWACCOUNT 1 /* new account */ #define QMAIL_REQPW 2 /* requestpassword */ #define QMAIL_NEWPW 3 /* new password */ #define QMAIL_RESET 4 /* reset account */ #define QMAIL_NEWEMAIL 5 /* new email address */ +#define QMAIL_ACTIVATEEMAIL 6 /* new style new account */ /* Channel flags */ @@ -227,6 +280,7 @@ #define QCFLAG_VOICEALL 0x1000 /* +v */ #define QCFLAG_WELCOME 0x2000 /* +w */ #define QCFLAG_SUSPENDED 0x4000 /* +z */ +#define QCFLAG_ACHIEVEMENTS 0x8000 /* +h */ #define CIsAutoOp(x) ((x)->flags & QCFLAG_AUTOOP) #define CIsBitch(x) ((x)->flags & QCFLAG_BITCH) @@ -243,6 +297,7 @@ #define CIsSuspended(x) ((x)->flags & QCFLAG_SUSPENDED) #define CIsInfo(x) ((x)->flags & QCFLAG_INFO) #define CIsNoInfo(x) ((x)->flags & QCFLAG_NOINFO) +#define CIsAchievements(x) ((x)->flags & QCFLAG_ACHIEVEMENTS) #define CSetAutoOp(x) ((x)->flags |= QCFLAG_AUTOOP) #define CSetBitch(x) ((x)->flags |= QCFLAG_BITCH) @@ -275,9 +330,9 @@ #define QCFLAG_USERCONTROL (QCFLAG_AUTOOP|QCFLAG_BITCH|QCFLAG_AUTOLIMIT| \ QCFLAG_ENFORCE|QCFLAG_FORCETOPIC|QCFLAG_AUTOVOICE| \ QCFLAG_PROTECT|QCFLAG_TOPICSAVE|QCFLAG_VOICEALL| \ - QCFLAG_WELCOME|QCFLAG_KNOWNONLY) + QCFLAG_WELCOME|QCFLAG_KNOWNONLY|QCFLAG_ACHIEVEMENTS ) -#define QCFLAG_ALL 0x7fff +#define QCFLAG_ALL 0xffff /* Channel user ("chanlev") flags */ @@ -383,8 +438,13 @@ #define QCMD_OPER 0x0020 /* Only available to opers */ #define QCMD_ADMIN 0x0040 /* Only available to admins */ #define QCMD_DEV 0x0080 /* Only available to developers */ +#define QCMD_STAFF 0x0200 /* Only available to staff */ #define QCMD_ALIAS 0x0100 /* Don't list on SHOWCOMMANDS */ +#define QCMD_HIDDEN QCMD_ALIAS + +#define QCMD_ACHIEVEMENTS 0x0400 /* Achievement-related commands */ +#define QCMD_TITLES 0x0800 /* Title-related commands */ #define CS_INIT_DB 0x1 /* Loading database.. */ #define CS_INIT_NOUSER 0x2 /* Loaded DB, waiting for user to be created */ @@ -497,6 +557,8 @@ typedef struct regchan { short chanoppos; /* Position in the array */ } regchan; +struct achievement_record; + /* Registered user */ typedef struct reguser { #ifdef CS_PARANOID @@ -538,6 +600,8 @@ typedef struct reguser { int stealcount; /* How many times we've had to free the nick up */ nick *fakeuser; /* If we had to "take" the nick, here's the pointer */ + time_t lastpasschange; + struct reguser *nextbydomain; struct reguser *nextbyname; struct reguser *nextbyID; @@ -649,7 +713,10 @@ extern unsigned int lastmaillockID; extern int chanserv_init_status; extern int chanservdb_ready; + +#ifndef CS_NODB extern DBModuleIdentifier q9dbid, q9adbid, q9cdbid, q9udbid; +#endif extern maildomain *maildomainnametable[MAILDOMAINHASHSIZE]; extern maildomain *maildomainIDtable[MAILDOMAINHASHSIZE]; @@ -686,8 +753,6 @@ extern sstring *cs_quitreason; void chanserv_finalinit(); /* chanservalloc.c */ -void chanservallocinit(); -void csfreeall(); regchan *getregchan(); void freeregchan(regchan *rcp); reguser *getreguser(); @@ -758,6 +823,7 @@ void csdb_dohelp(nick *np, Command *cmd); #define q9a_asyncquery(handler, tag, format, ...) dbasyncqueryi(q9adbid, handler, tag, format , ##__VA_ARGS__) #define q9u_asyncquery(handler, tag, format, ...) dbasyncqueryi(q9udbid, handler, tag, format , ##__VA_ARGS__) #define q9c_asyncquery(handler, tag, format, ...) dbasyncqueryi(q9cdbid, handler, tag, format , ##__VA_ARGS__) +#define q9cleanup_asyncquery(handler, tag, format, ...) dbasyncqueryi(q9cleanupdbid, handler, tag, format , ##__VA_ARGS__) /* chanservcrypto.c */ typedef int (*CRAlgorithm)(char *, const char *, const char *, const char *); @@ -769,14 +835,16 @@ CRAlgorithm cs_cralgorithm(const char *algorithm); const char *cs_cralgorithmlist(void); int cs_checkhashpass(const char *username, const char *password, const char *junk, const char *hash); char *csc_generateresetcode(time_t lockuntil, char *username); +int csc_verifyqticket(char *data, char *digest); /* chanservuser.c */ void chanservreguser(void *arg); void chanservjoinchan(channel *cp); -#define chanservsendmessage(np, fmt, args...) chanservsendmessage_real(np, 0, fmt , ## args) -#define chanservsendmessageoneline(np, fmt, args...) chanservsendmessage_real(np, 1, fmt , ## args) -void chanservsendmessage_real(nick *np, int oneline, char *message, ... ); -void chanservwallmessage(char *message, ... ); +void chanservpartchan(channel *cp, char *reason); +#define chanservsendmessage(np, fmt, ...) chanservsendmessage_real(np, 0, fmt , ##__VA_ARGS__) +#define chanservsendmessageoneline(np, fmt, ...) chanservsendmessage_real(np, 1, fmt , ##__VA_ARGS__) +void chanservsendmessage_real(nick *np, int oneline, char *message, ... ) __attribute__ ((format (printf, 3, 4))); +void chanservwallmessage(char *message, ... ) __attribute__ ((format (printf, 1, 2))); void chanservcommandinit(); void chanservcommandclose(); void chanservstdmessage(nick *np, int messageid, ... ); @@ -796,7 +864,7 @@ void cs_docheckopvoice(channel *cp, modechanges *changes); void cs_checkbans(channel *cp); void cs_schedupdate(chanindex *cip, int mintime, int maxtime); void cs_timerfunc(void *arg); -void cs_removechannel(regchan *rcp); +void cs_removechannel(regchan *rcp, char *reason); int cs_removechannelifempty(nick *sender, regchan *rcp); void cs_doallautomodes(nick *np); void cs_checknickbans(nick *np); @@ -807,9 +875,9 @@ void cs_removeuser(reguser *rup); int checkresponse(reguser *rup, const unsigned char *entropy, const char *response, CRAlgorithm algorithm); int checkhashpass(reguser *rup, const char *junk, const char *hash); flag_t cs_sanitisechanlev(flag_t flags); -typedef int (*UnbanFN)(void *arg, struct chanban *ban); -int cs_unbanfn(nick *sender, chanindex *cip, UnbanFN fn, void *arg, int removepermbans, int abortonfailure); +int cs_unbanfn(nick *sender, chanindex *cip, int (*fn)(void *arg, struct chanban *ban), void *arg, int removepermbans, int abortonfailure); void cs_logchanop(regchan *rcp, char *nick, reguser *rup); +int checkreason(nick *np, char *reason); /* chanservstdcmds.c */ int cs_doshowcommands(void *source, int cargc, char **cargv); @@ -837,6 +905,7 @@ void cs_handletopicchange(int hooknum, void *arg); void cs_handleopchange(int hooknum, void *arg); void cs_handlenewban(int hooknum, void *arg); void cs_handlechanlostuser(int hooknum, void *arg); +int cs_ischannelactive(channel *cp, regchan *rcp); /* chanservmessages.c */ void initmessages(); @@ -848,7 +917,7 @@ chanindex *cs_checkaccess(nick *np, const char *chan, unsigned int flags, chanin /* chanservlog.c */ void cs_initlog(); void cs_closelog(); -void cs_log(nick *np, char *event, ...); +void cs_log(nick *np, char *event, ...) __attribute__ ((format (printf, 2, 3))); /* chanservdump.c */ int dumplastjoindata(const char *filename); @@ -884,8 +953,8 @@ void csdb_deletemaildomain(maildomain *mdp); void csdb_createmaildomain(maildomain *mdp); void csdb_updatemaildomain(maildomain *mdp); void csdb_chanlevhistory_insert(regchan *rcp, nick *np, reguser *trup, flag_t oldflags, flag_t newflags); -void csdb_accounthistory_insert(nick *np, char *oldpass, char *newpass, sstring *oldemail, sstring *newemail); -void csdb_cleanuphistories(); +void csdb_accounthistory_insert(nick *np, char *oldpass, char *newpass, char *oldemail, char *newemail); +void csdb_cleanuphistories(time_t); void csdb_deletemaillock(maillock *mlp); void csdb_createmaillock(maillock *mlp); void csdb_updatemaillock(maillock *mlp); @@ -893,4 +962,13 @@ void csdb_updatemaillock(maillock *mlp); /* q9snprintf.c */ void q9snprintf(char *buf, size_t size, const char *format, const char *args, ...); void q9vsnprintf(char *buf, size_t size, const char *format, const char *args, va_list ap); +void q9strftime(char *buf, size_t size, time_t t); + +/* chanserv_flags.c */ +u_int64_t cs_accountflagmap(reguser *rup); +u_int64_t cs_accountflagmap_str(char *flags); + +/* chanserv_cleanupdb.c */ +void cs_cleanupdb(nick *np); + #endif