]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chanserv.h
A4STATS: remove E style escapes and switch to createtable for indices
[irc/quakenet/newserv.git] / chanserv / chanserv.h
index f59cea781b8f3d3d6eb2d22e3fbc3d5a4b83de66..6b94adb18f5a8f66be07259dca7246a3ccc2bbb0 100644 (file)
 /* 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
@@ -45,7 +68,7 @@
 #define   LINGERTIME          300
 #define   DUMPINTERVAL        300
 #define   EMAILLEN            60
-#define   CHANTYPES           8
+#define   CHANTYPES           9
 #define   CHANOPHISTORY       10
 
 /* Suspension and g-line hit count limits */
@@ -56,7 +79,7 @@
 #define   MAXAUTHATTEMPT      5
 
 /* 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
 #define   CHALLENGEAUTHSITE "http://www.quakenet.org/development/challengeauth/"
 
 /* Cleanup options */
-#define CLEANUP_ACCOUNT_INACTIVE  80
-#define CLEANUP_ACCOUNT_UNUSED    10
-#define CLEANUP_CHANNEL_INACTIVE  40
+#define CLEANUP_ACCOUNT_INACTIVE  240 /* make sure you update CLEANUP_AUTHHISTORY too... */
+#define CLEANUP_ACCOUNT_UNUSED    3
+#define CLEANUP_CHANNEL_INACTIVE  120
+
+#define CLEANUP_AUTHHISTORY      300
+
+#define CLEANUP_MIN_CHAN_SIZE     2
 
 /* Sizes of the main hashes */
 #define   REGUSERHASHSIZE     60000
 #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 15
+
 #include "chanserv_messages.h"
 
 #define CSMIN(a, b) ((a)<(b)?(a):(b))
 #define   QPRIV_VIEWEMAIL           109
 #define   QPRIV_VIEWCHANSUSPENSION  110
 #define   QPRIV_VIEWSUSPENDEDBY     111
+#define   QPRIV_VIEWWALLMESSAGE     112
+#define   QPRIV_VIEWREALHOST        113
 
 #define   QPRIV_CHANGECHANFLAGS     200
 #define   QPRIV_CHANGECHANLEV       201
 #define   QPRIV_CHANGEBANTIMER      204
 #define   QPRIV_CHANGEUSERFLAGS     205
 #define   QPRIV_CHANGEWELCOME       206
+#define   QPRIV_RESETCHANSTAT       207
 
 /* List of access checks */
 
 
 
 /* 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 */
 #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)
 #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)
 #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)
 
 /* 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         "\\A[^\\s\\+@]+@([a-z0-9][a-z0-9\\-]*\\.)+[a-z]{2,}\\Z"
 
-#define VALID_ACCOUNT_NAME  "^[-a-z0-9]*$"
+#define VALID_ACCOUNT_NAME  "\\A[a-z][a-z0-9\\-]+\\Z"
 
 #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 */
 #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)
 #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)
 #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 */
 #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 */
@@ -507,6 +559,8 @@ typedef struct regchan {
   short               chanoppos;                              /* Position in the array */  
 } regchan;
 
+struct achievement_record;
+
 /* Registered user */
 typedef struct reguser {
 #ifdef CS_PARANOID
@@ -548,6 +602,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;
@@ -699,8 +755,6 @@ extern sstring *cs_quitreason;
 void chanserv_finalinit();
 
 /* chanservalloc.c */
-void chanservallocinit();
-void csfreeall();
 regchan *getregchan();
 void freeregchan(regchan *rcp);
 reguser *getreguser();
@@ -766,11 +820,13 @@ void csdb_updateban(regchan *rcp, regban *rbp);
 char *csdb_gethelpstr(char *command, int language);
 void csdb_createmail(reguser *rup, int type);
 void csdb_dohelp(nick *np, Command *cmd);
+void csdb_flushchannelcounters(void *arg);
 
 #define q9asyncquery(handler, tag, format, ...) dbasyncqueryi(q9dbid, handler, tag, format , ##__VA_ARGS__)
 #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 *);
@@ -782,17 +838,20 @@ 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, ... ) __attribute__ ((format (printf, 3, 4)));;
+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, ... );
+void chanservstdvmessage(nick *np, reguser *rup, int messageid, int max_line_len, void (*callback)(nick *, char *), va_list va);
 void chanservaddcommand(char *command, int flags, int maxparams, CommandHandler handler, char *description, const char *help);
 void chanservremovecommand(char *command, CommandHandler handler);
 void chanservaddctcpcommand(char *command, CommandHandler hander);
@@ -809,7 +868,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);
@@ -820,9 +879,10 @@ 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);
+regchan *cs_addchan(chanindex *cip, nick *sender, reguser *addedby, reguser *founder, flag_t flags, flag_t forcemodes, flag_t denymodes, short type);
 
 /* chanservstdcmds.c */
 int cs_doshowcommands(void *source, int cargc, char **cargv);
@@ -850,6 +910,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();
@@ -870,11 +931,6 @@ int readlastjoindata(const char *filename);
 /* chanservschedule.c */
 void chanservdgline(void *arg);
 
-/* authlib.c */
-int csa_checkeboy(nick *sender, char *eboy);
-void csa_createrandompw(char *pw, int n);
-int csa_checkthrottled(nick *sender, reguser *rup, char *s);
-
 /* chanservdb_updates.c */
 void csdb_updateauthinfo(reguser *rup);
 void csdb_updatelastjoin(regchanuser *rcup);
@@ -898,7 +954,7 @@ 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, char *oldemail, char *newemail);
-void csdb_cleanuphistories();
+void csdb_cleanuphistories(time_t);
 void csdb_deletemaillock(maillock *mlp);
 void csdb_createmaillock(maillock *mlp);
 void csdb_updatemaillock(maillock *mlp);
@@ -906,9 +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