]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/hash.h
Added support for multiple MARK marks
[irc/evilnet/x3.git] / src / hash.h
index 6d880be5a52f26017bef4830cc223d85f1f397d4..9f1f5e47bda097077ec441c24cccf29dfcac1bb3 100644 (file)
@@ -5,7 +5,7 @@
  *
  * x3 is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -24,6 +24,7 @@
 #include "common.h"
 #include "dict.h"
 #include "policer.h"
+#include "recdb.h"
 
 #define MODE_CHANOP            0x00000001 /* +o USER */
 #define MODE_VOICE             0x00000002 /* +v USER */
 #define MODE_HIDEMODE          0x02000000 /* +L hide modes */
 #define MODE_APASS             0x04000000 /* +A adminpass */
 #define MODE_UPASS             0x08000000 /* +U userpass */
+#define MODE_ADMINSONLY         0x10000000 /* +a Admins only */
 #define MODE_REMOVE             0x80000000
 
-#define FLAGS_OPER             0x0001 /* Operator +O */
-#define FLAGS_LOCOP            0x0002 /* Local operator +o */
-#define FLAGS_INVISIBLE                0x0004 /* invisible +i */
-#define FLAGS_WALLOP           0x0008 /* receives wallops +w */
-#define FLAGS_SERVNOTICE       0x0010 /* receives server notices +s */
-#define FLAGS_DEAF             0x0020 /* deaf +d */
-#define FLAGS_SERVICE          0x0040 /* cannot be kicked, killed or deoped +k */
-#define FLAGS_GLOBAL           0x0080 /* receives global messages +g */
-
-// sethost - reed/apples
-// #define FLAGS_HELPER                0x0100 /* (network?) helper +h */
-#define FLAGS_SETHOST          0x0100 /* sethost +h */
-
-#define FLAGS_PERSISTENT       0x0200 /* for reserved nicks, this isn't just one-shot */
-#define FLAGS_GAGGED           0x0400 /* for gagged users */
-#define FLAGS_AWAY             0x0800 /* for away users */
-#define FLAGS_STAMPED           0x1000 /* for users who have been stamped */
-#define FLAGS_HIDDEN_HOST       0x2000 /* user's host is masked by their account */
-#define FLAGS_REGNICK           0x4000 /* user owns their current nick */
-#define FLAGS_REGISTERING      0x8000 /* user has issued account register command, is waiting for email cookie */
+#define FLAGS_OPER             0x00000001 /* Operator +o */
+#define FLAGS_LOCOP            0x00000002 /* Local operator +O */
+#define FLAGS_INVISIBLE                0x00000004 /* invisible +i */
+#define FLAGS_WALLOP           0x00000008 /* receives wallops +w */
+#define FLAGS_DUMMY             0x00000010 /* user is not announced to other servers */
+#define FLAGS_DEAF             0x00000020 /* deaf +d */
+#define FLAGS_SERVICE          0x00000040 /* cannot be kicked, killed or deoped +k */
+#define FLAGS_GLOBAL           0x00000080 /* receives global messages +g */
+#define FLAGS_SETHOST          0x00000100 /* sethost +h */
+#define FLAGS_PERSISTENT       0x00000200 /* for reserved nicks, this isn't just one-shot */
+#define FLAGS_GAGGED           0x00000400 /* for gagged users */
+#define FLAGS_AWAY             0x00000800 /* for away users */
+#define FLAGS_STAMPED           0x00001000 /* for users who have been stamped */
+#define FLAGS_HIDDEN_HOST       0x00002000 /* user's host is masked by their account +x */
+#define FLAGS_REGNICK           0x00004000 /* user owns their current nick */
+#define FLAGS_REGISTERING      0x00008000 /* user has issued account register command, is waiting for email cookie */
+#define FLAGS_BOT              0x00010000 /* Bot +B */
+#define FLAGS_HIDECHANS                0x00020000 /* Hidden channels +n */
+#define FLAGS_HIDEIDLE         0x00040000 /* Hidden idle time +I */
+#define FLAGS_XTRAOP           0x00080000 /* user is XtraOP +X */
+#define FLAGS_CLOAKHOST         0x00100000 /* user has cloaked host +C */
+#define FLAGS_CLOAKIP           0x00200000 /* user has cloaked ip +c */
+#define FLAGS_ADMIN             0x00400000 /* Admin +a */
+#define FLAGS_SSL               0x00800000 /* user is using a secure connection +z */
+#define FLAGS_PRIVDEAF          0x01000000 /* user is deaf to private messages +D */
+#define FLAGS_ACCOUNTONLY       0x02000000 /* user only receives PMs from authed users +R */
+#define FLAGS_WHOIS             0x04000000 /* user receives notices when /whois'ed +W */
+#define FLAGS_HIDEOPER          0x08000000 /* user is a hidden IRCop +H */
+#define FLAGS_NOLINK            0x10000000 /* user has opted out of channel redirection +L */
+#define FLAGS_COMMONCHANSONLY   0x20000000 /* user only receives PMs from users on same cahnnels +q */
 
 #define IsOper(x)               ((x)->modes & FLAGS_OPER)
 #define IsService(x)            ((x)->modes & FLAGS_SERVICE)
 #define IsInvisible(x)          ((x)->modes & FLAGS_INVISIBLE)
 #define IsGlobal(x)             ((x)->modes & FLAGS_GLOBAL)
 #define IsWallOp(x)             ((x)->modes & FLAGS_WALLOP)
-#define IsServNotice(x)         ((x)->modes & FLAGS_SERVNOTICE)
-
-// sethost - reed/apples
-// #define IsHelperIrcu(x)         ((x)->modes & FLAGS_HELPER)
+#define IsBotM(x)                      ((x)->modes & FLAGS_BOT)
+#define IsHideChans(x)         ((x)->modes & FLAGS_HIDECHANS)
+#define IsHideIdle(x)          ((x)->modes & FLAGS_HIDEIDLE)
+#define IsXtraOp(x)            ((x)->modes & FLAGS_XTRAOP)
 #define IsSetHost(x)           ((x)->modes & FLAGS_SETHOST)
-
 #define IsGagged(x)             ((x)->modes & FLAGS_GAGGED)
 #define IsPersistent(x)         ((x)->modes & FLAGS_PERSISTENT) 
 #define IsAway(x)               ((x)->modes & FLAGS_AWAY)
 #define IsHiddenHost(x)         ((x)->modes & FLAGS_HIDDEN_HOST)
 #define IsReggedNick(x)         ((x)->modes & FLAGS_REGNICK)
 #define IsRegistering(x)       ((x)->modes & FLAGS_REGISTERING)
+#define IsDummy(x)              ((x)->modes & FLAGS_DUMMY)
 #define IsFakeHost(x)           ((x)->fakehost[0] != '\0')
 #define IsLocal(x)              ((x)->uplink == self)
+#define IsAdmin(x)              ((x)->modes & FLAGS_ADMIN)
+#define IsSSL(x)                ((x)->modes & FLAGS_SSL)
+#define IsPrivDeaf(x)           ((x)->modes & FLAGS_PRIVDEAF)
+#define IsAccountOnly(x)        ((x)->modes & FLAGS_ACCOUNTONLY)
+#define IsWhoisNotice(x)        ((x)->modes & FLAGS_WHOIS)
+#define IsHideOper(x)           ((x)->modes & FLAGS_HIDEOPER)
+#define IsNoRedirect(x)         ((x)->modes & FLAGS_NOLINK)
+#define IsCommonChansOnly(x)    ((x)->modes & FLAGS_COMMONCHANSONLY)
 
 #define NICKLEN         30
 #define USERLEN         10
-#define HOSTLEN         63
+#define HOSTLEN         75
 #define SOCKIPLEN       45
 #define ACCOUNTLEN      15
 #define REALLEN         50
 #define TOPICLEN        250
 #define CHANNELLEN      200
+#define MARKLEN         200
 #define MAXOPLEVEL      999
 
 #define MAXMODEPARAMS  6
 /* IDLEN is 6 because it takes 5.33 Base64 digits to store 32 bytes. */
 #define IDLEN           6
 
+/** Operator privileges. */
+enum Priv {
+  PRIV_CHAN_LIMIT,      /**< no channel limit on oper */
+  PRIV_MODE_LCHAN,      /**< oper can mode local chans */
+  PRIV_WALK_LCHAN,      /**< oper can walk through local modes */
+  PRIV_DEOP_LCHAN,      /**< no deop oper on local chans */
+  PRIV_SHOW_INVIS,      /**< show local invisible users */
+  PRIV_SHOW_ALL_INVIS,  /**< show all invisible users */
+  PRIV_UNLIMIT_QUERY,   /**< unlimit who queries */
+  PRIV_KILL,            /**< oper can KILL */
+  PRIV_LOCAL_KILL,      /**< oper can local KILL */
+  PRIV_REHASH,          /**< oper can REHASH */
+  PRIV_REMOTEREHASH,    /**< oper can remote REHASH */
+  PRIV_RESTART,         /**< oper can RESTART */
+  PRIV_DIE,             /**< oper can DIE */
+  PRIV_ZLINE,           /**< oper can ZLINE */
+  PRIV_LOCAL_ZLINE,     /**< oper can local ZLINE */
+  PRIV_GLINE,           /**< oper can GLINE */
+  PRIV_LOCAL_GLINE,     /**< oper can local GLINE */
+  PRIV_SHUN,            /**< oper can SHUN */
+  PRIV_LOCAL_SHUN,      /**< oper can local SHUN */
+  PRIV_JUPE,            /**< oper can JUPE */
+  PRIV_LOCAL_JUPE,      /**< oper can local JUPE */
+  PRIV_OPMODE,          /**< oper can OP/CLEARMODE */
+  PRIV_LOCAL_OPMODE,    /**< oper can local OP/CLEARMODE */
+  PRIV_SET,             /**< oper can SET */
+  PRIV_WHOX,            /**< oper can use /who x */
+  PRIV_BADCHAN,         /**< oper can BADCHAN */
+  PRIV_LOCAL_BADCHAN,   /**< oper can local BADCHAN */
+  PRIV_SEE_CHAN,        /**< oper can see in secret chans */
+  PRIV_PROPAGATE,       /**< propagate oper status */
+  PRIV_DISPLAY,         /**< "Is an oper" displayed */
+  PRIV_DISPLAY_MODE,    /**< oper can set +H hide oper */
+  PRIV_SEE_OPERS,       /**< display hidden opers */
+  PRIV_WIDE_GLINE,      /**< oper can set wider G-lines */
+  PRIV_WIDE_ZLINE,      /**< oper can set wider Z-Lines */
+  PRIV_WIDE_SHUN,       /**< oper can set wider G-lines */
+  PRIV_LIST_CHAN,       /**< oper can list secret channels */
+  PRIV_FORCE_OPMODE,    /**< can hack modes on quarantined channels */
+  PRIV_FORCE_LOCAL_OPMODE, /**< can hack modes on quarantined local channels */
+  PRIV_CHECK,           /**< oper can use CHECK */
+  PRIV_SEE_SECRET_CHAN, /**< oper can see +s channels in whois */
+  PRIV_WHOIS_NOTICE,    /**< oper can set/unset user mode +W */
+  PRIV_HIDE_IDLE,       /**< oper can set/unset user mode +I */
+  PRIV_XTRAOP,          /**< oper can set/unset user mode +X */
+  PRIV_HIDE_CHANNELS,   /**< oper can set/unset user mode +n */
+  PRIV_FREEFORM,        /**< oper can set any host on themseves using set host
+                              as long as its a valid host */
+  PRIV_REMOVE,          /**< oper can force remove deactivated glines,
+                             shuns and zlines. */
+  PRIV_SPAMFILTER,      /**< oper can set spamfilters via SPAMFILTER */
+  PRIV_LAST_PRIV        /**< number of privileges */
+};
+
+/** Number of bits */
+#define _PRIV_NBITS             (8 * sizeof(unsigned long))
+/** Element number for priv \a priv. */
+#define _PRIV_IDX(priv)         ((priv) / _PRIV_NBITS)
+/** Element bit for priv \a priv. */
+#define _PRIV_BIT(priv)         (1UL << ((priv) % _PRIV_NBITS))
+
+/** Operator privileges. */
+struct Privs {
+  unsigned long priv_mask[(PRIV_LAST_PRIV + _PRIV_NBITS - 1) / _PRIV_NBITS];
+};
+
 DECLARE_LIST(userList, struct userNode*);
 DECLARE_LIST(modeList, struct modeNode*);
 DECLARE_LIST(banList, struct banNode*);
@@ -135,6 +222,7 @@ struct userNode {
     unsigned int num_local : 18;
 #endif
     unsigned int loc;             /* Is user connecting via LOC? */
+    unsigned int no_notice;       /* Does the users client not see notices? */
     unsigned int dead : 1;        /* Is user waiting to be recycled? */
     irc_in_addr_t ip;             /* User's IP address */
     long modes;                   /* user flags +isw etc... */
@@ -155,10 +243,17 @@ struct userNode {
     int dma_code;
     int area_code;
     
+    char *mark;                   /* only filled if they are marked */
+    char *version_reply;          /* only filled in if a version query was triggered */
+    char *sslfp;                  /* only filled in if a mark SSLCLIFP is received */
+
+    struct string_list *marks;    /* list of user's marks */
 
     time_t timestamp;             /* Time of last nick change */
+    time_t idle_since;
     struct server *uplink;        /* Server that user is connected to */
     struct modeList channels;     /* Vector of channels user is in */
+    struct Privs   privs;
 
     /* from nickserv */
     struct handle_info *handle_info;
@@ -166,6 +261,21 @@ struct userNode {
     struct policer auth_policer;
 };
 
+#define privs(cli)             ((cli)->privs)
+#define PrivSet(pset, priv)     ((pset)->priv_mask[_PRIV_IDX(priv)] |= \
+                                 _PRIV_BIT(priv))
+#define PrivClr(pset, priv)     ((pset)->priv_mask[_PRIV_IDX(priv)] &= \
+                                 ~(_PRIV_BIT(priv)))
+#define PrivHas(pset, priv)     ((pset)->priv_mask[_PRIV_IDX(priv)] & \
+                                 _PRIV_BIT(priv))
+
+#define PRIV_ADD 1
+#define PRIV_DEL 0
+
+#define GrantPriv(cli, priv)    (PrivSet(&(privs(cli)), priv))
+#define RevokePriv(cli, priv)   (PrivClr(&(privs(cli)), priv))
+#define HasPriv(cli, priv)      (PrivHas(&(privs(cli)), priv))
+
 struct chanNode {
     chan_mode_t modes;
     unsigned int limit, locks;
@@ -216,7 +326,7 @@ struct modeNode {
 struct server {
     char name[SERVERNAMEMAX+1];
     time_t boot;
-    time_t link;
+    time_t link_time;
     char description[SERVERDESCRIPTMAX+1];
 #ifdef WITH_PROTOCOL_P10
     char numeric[COMBO_NUMERIC_LEN+1];
@@ -281,19 +391,30 @@ struct server* GetServerH(const char *name); /* using full name */
 struct userNode* GetUserH(const char *nick);   /* using nick */
 struct chanNode* GetChannel(const char *name);
 struct modeNode* GetUserMode(struct chanNode* channel, struct userNode* user);
-
-typedef void (*server_link_func_t) (struct server *server);
-void reg_server_link_func(server_link_func_t handler);
-
-typedef int (*new_user_func_t) (struct userNode *user);
-void reg_new_user_func(new_user_func_t handler);
-typedef void (*del_user_func_t) (struct userNode *user, struct userNode *killer, const char *why);
-void reg_del_user_func(del_user_func_t handler);
-void unreg_del_user_func(del_user_func_t handler);
+int userList_contains(struct userList *list, struct userNode *user);
+unsigned int IsUserP(struct userNode *user);
+
+typedef int (*server_link_func_t) (struct server *server, void *extra);
+void reg_server_link_func(server_link_func_t handler, void *extra);
+void call_server_link_funcs(struct server *server);
+
+typedef void (*sasl_input_func_t) (struct server* source ,const char *identifier, const char *subcmd, const char *data, const char *ext, void *extra);
+void reg_sasl_input_func(sasl_input_func_t handler, void *extra);
+void call_sasl_input_func(struct server* source ,const char *identifier, const char *subcmd, const char *data, const char *ext);
+void unreg_sasl_input_func(sasl_input_func_t handler, void *extra);
+
+typedef int (*new_user_func_t) (struct userNode *user, void *extra);
+void reg_new_user_func(new_user_func_t handler, void *extra);
+void call_new_user_funcs(struct userNode *user);
+typedef void (*del_user_func_t) (struct userNode *user, struct userNode *killer, const char *why, void *extra);
+void reg_del_user_func(del_user_func_t handler, void *extra);
+void call_del_user_funcs(struct userNode *user, struct userNode *killer, const char *why);
+void unreg_del_user_func(del_user_func_t handler, void *extra);
 void ReintroduceUser(struct userNode* user);
-typedef void (*nick_change_func_t)(struct userNode *user, const char *old_nick);
-void reg_nick_change_func(nick_change_func_t handler);
+typedef void (*nick_change_func_t)(struct userNode *user, const char *old_nick, void *extra);
+void reg_nick_change_func(nick_change_func_t handler, void *extra);
 void NickChange(struct userNode* user, const char *new_nick, int no_announce);
+void SVSNickChange(struct userNode* user, const char *new_nick);
 
 typedef void (*account_func_t) (struct userNode *user, const char *stamp);
 void reg_account_func(account_func_t handler);
@@ -302,12 +423,12 @@ void StampUser(struct userNode *user, const char *stamp, time_t timestamp);
 void assign_fakehost(struct userNode *user, const char *host, int announce);
 void set_geoip_info(struct userNode *user);
 
-typedef void (*new_channel_func_t) (struct chanNode *chan);
-void reg_new_channel_func(new_channel_func_t handler);
-typedef int (*join_func_t) (struct modeNode *mNode);
-void reg_join_func(join_func_t handler);
-typedef void (*del_channel_func_t) (struct chanNode *chan);
-void reg_del_channel_func(del_channel_func_t handler);
+typedef void (*new_channel_func_t) (struct chanNode *chan, void *extra);
+void reg_new_channel_func(new_channel_func_t handler, void *extra);
+typedef int (*join_func_t) (struct modeNode *mNode, void *extra);
+void reg_join_func(join_func_t handler, void *extra);
+typedef void (*del_channel_func_t) (struct chanNode *chan, void *extra);
+void reg_del_channel_func(del_channel_func_t handler, void *extra);
 
 struct chanNode* AddChannel(const char *name, time_t time_, const char *modes, char *banlist, char *exemptlist);
 void LockChannel(struct chanNode *channel);
@@ -315,21 +436,21 @@ void UnlockChannel(struct chanNode *channel);
 
 struct modeNode* AddChannelUser(struct userNode* user, struct chanNode* channel);
 
-typedef void (*part_func_t) (struct modeNode *mn, const char *reason);
-void reg_part_func(part_func_t handler);
-void unreg_part_func(part_func_t handler);
+typedef void (*part_func_t) (struct modeNode *mn, const char *reason, void *extra);
+void reg_part_func(part_func_t handler, void *extra);
+void unreg_part_func(part_func_t handler, void *extra);
 void DelChannelUser(struct userNode* user, struct chanNode* channel, const char *reason, int deleting);
 void KickChannelUser(struct userNode* target, struct chanNode* channel, struct userNode *kicker, const char *why);
 
-typedef void (*kick_func_t) (struct userNode *kicker, struct userNode *user, struct chanNode *chan);
-void reg_kick_func(kick_func_t handler);
+typedef void (*kick_func_t) (struct userNode *kicker, struct userNode *user, struct chanNode *chan, void *extra);
+void reg_kick_func(kick_func_t handler, void *extra);
 void ChannelUserKicked(struct userNode* kicker, struct userNode* victim, struct chanNode* channel);
 
 int ChannelBanExists(struct chanNode *channel, const char *ban);
 int ChannelExemptExists(struct chanNode *channel, const char *exempt);
 
-typedef int (*topic_func_t)(struct userNode *who, struct chanNode *chan, const char *old_topic);
-void reg_topic_func(topic_func_t handler);
+typedef int (*topic_func_t)(struct userNode *who, struct chanNode *chan, const char *old_topic, void *extra);
+void reg_topic_func(topic_func_t handler, void *extra);
 void SetChannelTopic(struct chanNode *channel, struct userNode *service, struct userNode *user, const char *topic, int announce);
 struct userNode *IsInChannel(struct chanNode *channel, struct userNode *user);