]> jfr.im git - solanum.git/blobdiff - include/client.h
ircd/authproc.c: avoid crash on lack of any configured DNSBLs
[solanum.git] / include / client.h
index cfc55ceeee97ee5b3f14cfafc59988254a344f3d..7dfc8f14fd422570269fdfa708e1c8b4216638d9 100644 (file)
@@ -1,11 +1,11 @@
 /*
- *  charybdis: A useful ircd.
+ *  Solanum: a slightly advanced ircd
  *  client.h: The ircd client header.
  *
  *  Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
  *  Copyright (C) 1996-2002 Hybrid Development Team
  *  Copyright (C) 2002-2004 ircd-ratbox development team
- *  Copyright (C) 2005 William Pitcock and Jilles Tjoelker
+ *  Copyright (C) 2005 Ariadne Conill and Jilles Tjoelker
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #include "ircd.h"
 #include "privilege.h"
 
-/* other structs */
-struct Blacklist;
-
 /* we store ipv6 ips for remote clients, so this needs to be v6 always */
 #define HOSTIPLEN      53      /* sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255.ipv6") */
 #define PASSWDLEN      128
 #define CIPHERKEYLEN   64      /* 512bit */
-#define CLIENT_BUFSIZE 512     /* must be at least 512 bytes */
 
 #define IDLEN          10
 
@@ -68,6 +64,8 @@ struct ListClient;
 struct scache_entry;
 struct ws_ctl;
 
+typedef int SSL_OPEN_CB(struct Client *, int status);
+
 /*
  * Client structures
  */
@@ -78,6 +76,9 @@ struct User
        char *away;             /* pointer to away message */
        int refcnt;             /* Number of times this block is referenced */
 
+       char *opername; /* name of operator{} block being used or tried (challenge) */
+       struct PrivilegeSet *privset;
+
        char suser[NICKLEN+1];
 };
 
@@ -92,16 +93,6 @@ struct Server
        struct scache_entry *nameinfo;
 };
 
-struct ZipStats
-{
-       unsigned long long in;
-       unsigned long long in_wire;
-       unsigned long long out;
-       unsigned long long out_wire;
-       double in_ratio;
-       double out_ratio;
-};
-
 struct Client
 {
        rb_dlink_node node;
@@ -125,7 +116,7 @@ struct Client
        unsigned long serial;   /* used to enforce 1 send per nick */
 
        /* client->name is the unique name for a client nick or host */
-       char name[HOSTLEN + 1];
+       char name[NAMELEN + 1];
 
        /*
         * client->username is the username from ident or the USER message,
@@ -224,8 +215,7 @@ struct LocalUser
         */
        char *passwd;
        char *auth_user;
-       char *opername; /* name of operator{} block being used or tried (challenge) */
-       char *challenge;
+       unsigned char *challenge;
        char *fullcaps;
        char *cipher_string;
 
@@ -252,7 +242,7 @@ struct LocalUser
         */
        int sent_parsed;        /* how many messages we've parsed in this second */
        time_t last_knock;      /* time of last knock */
-       unsigned long random_ping;
+       uint32_t random_ping;
 
        /* target change stuff */
        /* targets we're aware of (fnv32(use_id(target_p))):
@@ -275,13 +265,11 @@ struct LocalUser
        struct _ssl_ctl *ssl_ctl;               /* which ssl daemon we're associate with */
        struct _ssl_ctl *z_ctl;                 /* second ctl for ssl+zlib */
        struct ws_ctl *ws_ctl;                  /* ctl for wsockd */
+       SSL_OPEN_CB *ssl_callback;              /* ssl connection is now open */
        uint32_t localflags;
-       struct ZipStats *zipstats;              /* zipstats */
        uint16_t cork_count;                    /* used for corking/uncorking connections */
        struct ev_entry *event;                 /* used for associated events */
 
-       struct PrivilegeSet *privset;           /* privset... */
-
        char sasl_agent[IDLEN];
        unsigned char sasl_out;
        unsigned char sasl_complete;
@@ -291,6 +279,9 @@ struct LocalUser
        time_t sasl_next_retry;
 };
 
+#define AUTHC_F_DEFERRED 0x01
+#define AUTHC_F_COMPLETE 0x02
+
 struct AuthClient
 {
        uint32_t cid;   /* authd id */
@@ -299,6 +290,7 @@ struct AuthClient
        char cause;     /* rejection cause */
        char *data;     /* reason data */
        char *reason;   /* reason we were rejected */
+       int flags;
 };
 
 struct PreClient
@@ -310,11 +302,13 @@ struct PreClient
        struct AuthClient auth;
 
        struct rb_sockaddr_storage lip; /* address of our side of the connection */
+
+       char id[IDLEN]; /* UID/SID, unique on the network (unverified) */
 };
 
 struct ListClient
 {
-       char *chname;
+       char *chname, *mask, *nomask;
        unsigned int users_min, users_max;
        time_t created_min, created_max, topic_min, topic_max;
        int operspy;
@@ -366,7 +360,7 @@ struct ListClient
                                 (x)->handler = SERVER_HANDLER; }
 
 #define SetClient(x)            {(x)->status = STAT_CLIENT; \
-                                (x)->handler = IsOper((x)) ? \
+                                (x)->handler = IsOperGeneral((x)) ? \
                                        OPER_HANDLER : CLIENT_HANDLER; }
 #define SetRemoteClient(x)     {(x)->status = STAT_CLIENT; \
                                 (x)->handler = RCLIENT_HANDLER; }
@@ -424,12 +418,17 @@ struct ListClient
 #define FLAGS_EXEMPTSPAMBOT    0x02000000
 #define FLAGS_EXEMPTSHIDE      0x04000000
 #define FLAGS_EXEMPTJUPE       0x08000000
+#define FLAGS_IDENTIFIED       0x10000000      /* owns their current nick */
 
 
 /* flags for local clients, this needs stuff moved from above to here at some point */
 #define LFLAGS_SSL             0x00000001
 #define LFLAGS_FLUSH           0x00000002
 #define LFLAGS_CORK            0x00000004
+#define LFLAGS_SCTP            0x00000008
+#define LFLAGS_SECURE          0x00000010      /* for marking SSL clients as secure before registration */
+/* LFLAGS_FAKE: client may not have the usually expected machinery plugged in; don't assert on it. For tests only. */
+#define LFLAGS_FAKE            0x00000020
 
 /* umodes, settable flags */
 /* lots of this moved to snomask -- jilles */
@@ -437,17 +436,15 @@ struct ListClient
 #define UMODE_WALLOP       0x0002      /* send wallops to them */
 #define UMODE_OPERWALL     0x0004      /* Operwalls */
 #define UMODE_INVISIBLE    0x0008      /* makes user invisible */
-#define UMODE_CALLERID     0x0010      /* block unless caller id's */
 #define UMODE_LOCOPS       0x0020      /* show locops */
 #define UMODE_SERVICE      0x0040
 #define UMODE_DEAF        0x0080
 #define UMODE_NOFORWARD    0x0100      /* don't forward */
-#define UMODE_REGONLYMSG   0x0200      /* only allow logged in users to msg */
 
 /* user information flags, only settable by remote mode or local oper */
 #define UMODE_OPER         0x1000      /* Operator */
 #define UMODE_ADMIN        0x2000      /* Admin on server */
-#define UMODE_SSLCLIENT    0x4000      /* using SSL */
+#define UMODE_SECURE       0x4000      /* has a secure connection */
 
 #define DEFAULT_OPER_UMODES (UMODE_SERVNOTICE | UMODE_OPERWALL | \
                              UMODE_WALLOP | UMODE_LOCOPS)
@@ -489,6 +486,9 @@ struct ListClient
 #define IsTGExcessive(x)       ((x)->flags & FLAGS_TGEXCESSIVE)
 #define SetTGExcessive(x)      ((x)->flags |= FLAGS_TGEXCESSIVE)
 #define ClearTGExcessive(x)    ((x)->flags &= ~FLAGS_TGEXCESSIVE)
+#define IsIdentified(x)                ((x)->flags & FLAGS_IDENTIFIED)
+#define SetIdentified(x)       ((x)->flags |= FLAGS_IDENTIFIED)
+#define ClearIdentified(x)     ((x)->flags &= ~FLAGS_IDENTIFIED)
 
 /* local flags */
 
@@ -500,34 +500,35 @@ struct ListClient
 #define SetFlush(x)            ((x)->localClient->localflags |= LFLAGS_FLUSH)
 #define ClearFlush(x)          ((x)->localClient->localflags &= ~LFLAGS_FLUSH)
 
+#define IsSCTP(x)              ((x)->localClient->localflags & LFLAGS_SCTP)
+#define SetSCTP(x)             ((x)->localClient->localflags |= LFLAGS_SCTP)
+#define ClearSCTP(x)           ((x)->localClient->localflags &= ~LFLAGS_SCTP)
+
+#define IsSecure(x)            ((x)->localClient->localflags & LFLAGS_SECURE)
+#define SetSecure(x)           ((x)->localClient->localflags |= LFLAGS_SECURE)
+#define ClearSecure(x)         ((x)->localClient->localflags &= ~LFLAGS_SECURE)
+
 /* oper flags */
 #define MyOper(x)               (MyConnect(x) && IsOper(x))
 
-#define SetOper(x)              {(x)->umodes |= UMODE_OPER; \
-                                if (MyClient((x))) (x)->handler = OPER_HANDLER;}
-
-#define ClearOper(x)            {(x)->umodes &= ~(UMODE_OPER|UMODE_ADMIN); \
-                                if (MyClient((x)) && !IsOper((x)) && !IsServer((x))) \
-                                 (x)->handler = CLIENT_HANDLER; }
+#define SetOper(x)              ((x)->umodes |= UMODE_OPER)
+#define ClearOper(x)            ((x)->umodes &= ~(UMODE_OPER|UMODE_ADMIN))
 
 /* umode flags */
 #define IsInvisible(x)          ((x)->umodes & UMODE_INVISIBLE)
 #define SetInvisible(x)         ((x)->umodes |= UMODE_INVISIBLE)
 #define ClearInvisible(x)       ((x)->umodes &= ~UMODE_INVISIBLE)
-#define IsSSLClient(x)         ((x)->umodes & UMODE_SSLCLIENT)
-#define SetSSLClient(x)                ((x)->umodes |= UMODE_SSLCLIENT)
-#define ClearSSLClient(x)      ((x)->umodes &= ~UMODE_SSLCLIENT)
+#define IsSecureClient(x)       ((x)->umodes & UMODE_SECURE)
 #define SendWallops(x)          ((x)->umodes & UMODE_WALLOP)
 #define SendLocops(x)           ((x)->umodes & UMODE_LOCOPS)
 #define SendServNotice(x)       ((x)->umodes & UMODE_SERVNOTICE)
 #define SendOperwall(x)         ((x)->umodes & UMODE_OPERWALL)
-#define IsSetCallerId(x)       ((x)->umodes & UMODE_CALLERID)
-#define IsService(x)           ((x)->umodes & UMODE_SERVICE)
-#define IsDeaf(x)              ((x)->umodes & UMODE_DEAF)
-#define IsNoForward(x)         ((x)->umodes & UMODE_NOFORWARD)
-#define IsSetRegOnlyMsg(x)     ((x)->umodes & UMODE_REGONLYMSG)
+#define IsService(x)            ((x)->umodes & UMODE_SERVICE)
+#define IsDeaf(x)               ((x)->umodes & UMODE_DEAF)
+#define IsNoForward(x)          ((x)->umodes & UMODE_NOFORWARD)
 
 #define SetGotId(x)             ((x)->flags |= FLAGS_GOTID)
+#define ClearGotId(x)           ((x)->flags &= ~FLAGS_GOTID)
 #define IsGotId(x)              (((x)->flags & FLAGS_GOTID) != 0)
 
 #define IsExemptKline(x)        ((x)->flags & FLAGS_EXEMPTKLINE)
@@ -565,9 +566,15 @@ struct ListClient
 #define SHOW_IP 1
 #define MASK_IP 2
 
+enum
+{
+       D_LINED,
+       K_LINED
+};
+
 extern void check_banned_lines(void);
-extern void check_klines_event(void *unused);
 extern void check_klines(void);
+extern void check_one_kline(struct ConfItem *kline);
 extern void check_dlines(void);
 extern void check_xlines(void);
 extern void resv_nick_fnc(const char *mask, const char *reason, int temp_time);
@@ -578,8 +585,8 @@ extern int is_remote_connect(struct Client *);
 extern void init_client(void);
 extern struct Client *make_client(struct Client *from);
 extern void free_pre_client(struct Client *client);
-extern void free_client(struct Client *client);
 
+extern void notify_banned_client(struct Client *, struct ConfItem *, int ban);
 extern int exit_client(struct Client *, struct Client *, struct Client *, const char *);
 
 extern void error_exit_client(struct Client *, int);