/*
- * 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
#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 PASSWDLEN 128
+#define CIPHERKEYLEN 64 /* 512bit */
#define IDLEN 10
struct scache_entry;
struct ws_ctl;
+typedef int SSL_OPEN_CB(struct Client *, int status);
+
/*
* Client structures
*/
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];
};
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,
*/
char *passwd;
char *auth_user;
- char *opername; /* name of operator{} block being used or tried (challenge) */
char *challenge;
char *fullcaps;
char *cipher_string;
*/
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))):
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;
+
+ unsigned int sasl_messages;
+ unsigned int sasl_failures;
+ time_t sasl_next_retry;
+};
+
+#define AUTHC_F_DEFERRED 0x01
+#define AUTHC_F_COMPLETE 0x02
+
+struct AuthClient
+{
+ uint32_t cid; /* authd id */
+ time_t timeout; /* When to terminate authd query */
+ bool accepted; /* did authd accept us? */
+ char cause; /* rejection cause */
+ char *data; /* reason data */
+ char *reason; /* reason we were rejected */
+ int flags;
};
struct PreClient
char spoofuser[USERLEN + 1];
char spoofhost[HOSTLEN + 1];
- uint32_t authd_cid; /* authd id */
- time_t authd_timeout; /* When to terminate authd query */
- bool authd_accepted; /* did authd accept us? */
- char authd_cause; /* rejection cause */
- char *authd_data; /* reason data */
- char *authd_reason; /* reason we were rejected */
+ 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
(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; }
#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_INSECURE 0x00000010 /* for marking SSL clients as insecure before registration */
/* umodes, settable flags */
/* lots of this moved to snomask -- jilles */
#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 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 */
#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 IsInsecure(x) ((x)->localClient->localflags & LFLAGS_INSECURE)
+#define SetInsecure(x) ((x)->localClient->localflags |= LFLAGS_INSECURE)
+#define ClearInsecure(x) ((x)->localClient->localflags &= ~LFLAGS_INSECURE)
+
/* 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 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 SetGotId(x) ((x)->flags |= FLAGS_GOTID)
#define IsGotId(x) (((x)->flags & FLAGS_GOTID) != 0)
#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);
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);