/* $Id$ */
-typedef pthread_t THREAD;
/* Uncomment this if you want to track memory leaks.
* This incurs some overhead, so don't use it unless you're debugging the code!
*/
-#define DEBUG_MEMORY_LEAKS
+/* #define DEBUG_MEMORY_LEAKS */
+
+
+#ifndef SERVER_H
+#define SERVER_H
+
+#ifdef __GNUC__
+#define INLINE inline
+#else
+#define INLINE
+#endif
+
+#include "citadel.h"
+#ifdef HAVE_OPENSSL
+#include <openssl/ssl.h>
+#endif
/*
* New format for a message in memory
*/
-#define CTDLMESSAGE_MAGIC 0x159d
struct CtdlMessage {
- int cm_magic; /* Self-check */
+ int cm_magic; /* Self-check (NOT SAVED TO DISK) */
char cm_anon_type; /* Anonymous or author-visible */
char cm_format_type; /* Format type */
char *cm_fields[256]; /* Data fields */
unsigned int cm_flags; /* How to handle (NOT SAVED TO DISK) */
};
+#define CTDLMESSAGE_MAGIC 0x159d
#define CM_SKIP_HOOKS 0x01 /* Don't run server-side handlers */
};
/*
- * Static user data symbol types
+ * Static user data symbol types. Server extensions can ask for dynamic
+ * extensions to per-session data, but the symbol ID has to be listed here.
*/
enum {
SYM_DESIRED_SECTION, /* Used by the MIME parser */
SYM_MA_INFO, /* Handles multipart/alternative */
SYM_REPL, /* Used for replication checking */
+ SYM_CIT_ICAL, /* Used by the calendar service */
+ SYM_IMAP, /* Used by the IMAP service */
+ SYM_POP3, /* Used by the POP3 service */
+ SYM_SMTP, /* Used by the SMTP service */
+ SYM_SMTP_RECPS,
+ SYM_SMTP_ROOMS,
+ SYM_VCARD, /* vCard handling requires this */
SYM_MAX
};
struct CitContext {
struct CitContext *next; /* Link to next session in the list */
- struct usersupp usersupp; /* Database record buffers */
- struct quickroom quickroom;
+ struct ctdluser user; /* Database record buffers */
+ struct ctdlroom room;
- char curr_user[32]; /* name of current user */
+ int state; /* thread state (see CON_ values below) */
+ int kill_me; /* Set to nonzero to flag for termination */
+
+ char curr_user[USERNAME_SIZE]; /* name of current user */
int logged_in; /* logged in */
int internal_pgm; /* authenticated as internal program */
- char temp[32]; /* temp file name */
+ char temp[PATH_MAX]; /* temp file name */
int nologin; /* not allowed to log in */
+ int is_local_socket; /* set to 1 if client is on unix domain sock */
- char net_node[32];
- THREAD mythread;
- int n_crit; /* number of critical sections open */
+ char net_node[PATH_MAX];/* Is the client another Citadel server? */
int client_socket;
int cs_pid; /* session ID */
- char cs_room[ROOMNAMELEN]; /* current room */
- time_t cs_lastupdt; /* time of last update */
time_t lastcmd; /* time of last command executed */
time_t lastidle; /* For computing idle time */
+ time_t previous_login; /* Date/time of previous login */
char lastcmdname[5]; /* name of last command executed */
unsigned cs_flags; /* miscellaneous flags */
+ void (*h_command_function) (void) ; /* service command function */
+ int is_async; /* Nonzero if client accepts async msgs */
/* feeping creaturisms... */
int cs_clientdev; /* client developer ID */
int cs_clienttyp; /* client type code */
int cs_clientver; /* client version number */
char cs_clientname[32]; /* name of client software */
- char cs_host[26]; /* host logged in from */
+ char cs_host[64]; /* host logged in from */
+ char cs_addr[64]; /* address logged in from */
+
+ /* The Internet type of thing */
+ char cs_inet_email[SIZ];/* Return address of outbound Internet mail */
FILE *download_fp; /* Fields relating to file transfer */
FILE *upload_fp;
- char upl_file[256];
- char upl_path[256];
- char upl_comment[256];
- char upl_filedir[256];
- char chat_room[20]; /* The chat room */
+ char upl_file[PATH_MAX];
+ char upl_path[PATH_MAX];
+ char upl_comment[SIZ];
+ char upl_filedir[PATH_MAX];
char dl_is_net;
char upload_type;
+ /* Beginning of cryptography - session nonce */
+ char cs_nonce[NONCE_SIZE]; /* The nonce for this session's next auth transaction */
+
+ /* Redirect this session's output to somewhere else? */
+ FILE *redirect_fp;
+ int redirect_sock;
+#ifdef HAVE_OPENSSL
+ SSL *ssl;
+ int redirect_ssl;
+#endif
+
+ /* A linked list of all express messages sent to us. */
struct ExpressMessage *FirstExpressMessage;
+ int disable_exp; /* Set to 1 to disable incoming pages */
+ int newmail; /* Other sessions increment this */
+
+ /* Masquerade... */
+ char fake_username[USERNAME_SIZE]; /* Fake username <bc> */
+ char fake_postname[USERNAME_SIZE]; /* Fake postname <bc> */
+ char fake_hostname[64]; /* Fake hostname <bc> */
+ char fake_roomname[ROOMNAMELEN]; /* Fake roomname <bc> */
- char fake_username[32]; /* Fake username <bc> */
- char fake_postname[32]; /* Fake postname <bc> */
- char fake_hostname[25]; /* Name of the fake hostname <bc> */
- char fake_roomname[ROOMNAMELEN]; /* Name of the fake room <bc> */
+ char preferred_formats[SIZ]; /* Preferred MIME formats */
- int FloorBeingSearched; /* This is used by cmd_lrms() etc. */
+ /* Dynamically allocated session data */
struct CtdlSessData *FirstSessData;
};
typedef struct CitContext t_context;
+/* Values for CitContext.state */
+enum {
+ CON_IDLE, /* This context is doing nothing */
+ CON_EXECUTING /* This context is bound to a thread */
+};
+
+
#define CS_STEALTH 1 /* stealth mode */
#define CS_CHAT 2 /* chat mode */
#define CS_POSTING 4 /* Posting */
struct CitContext *MyContext(void);
-#define CC ((struct CitContext *)MyContext())
+#define CC MyContext()
extern struct CitContext *ContextList;
extern int ScheduledShutdown;
struct ChatLine *next;
int chat_seq;
time_t chat_time;
- char chat_text[256];
- char chat_room[20];
- char chat_username[32];
+ char chat_text[SIZ];
+ char chat_username[USERNAME_SIZE];
+ char chat_room[ROOMNAMELEN];
};
/*
* Various things we need to lock and unlock
*/
enum {
- S_USERSUPP,
- S_USER_TRANS,
- S_QUICKROOM,
- S_MSGMAIN,
- S_CALLLOG,
+ S_USERS,
+ S_ROOMS,
S_SESSION_TABLE,
S_FLOORTAB,
S_CHATQUEUE,
S_CONTROL,
- S_HOUSEKEEPING,
S_DATABASE,
S_NETDB,
S_SUPPMSGMAIN,
+ S_I_WANNA_SELECT,
+ S_CONFIG,
+ S_WORKER_LIST,
+ S_HOUSEKEEPING,
+ S_NTTLIST,
+ S_DIRECTORY,
+ S_NETCONFIGS,
+ S_PUBLIC_CLIENTS,
MAX_SEMAPHORES
};
MT_DOWNLOAD /* Download a component */
};
+/*
+ * Message format types in the database
+ */
+#define FMT_CITADEL 0 /* Citadel vari-format (proprietary) */
+#define FMT_FIXED 1 /* Fixed format (proprietary) */
+#define FMT_RFC822 4 /* Standard (headers are in M field) */
+
/*
* Citadel DataBases (define one for each cdb we need to open)
*/
enum {
CDB_MSGMAIN, /* message base */
- CDB_USERSUPP, /* user file */
- CDB_QUICKROOM, /* room index */
+ CDB_USERS, /* user file */
+ CDB_ROOMS, /* room index */
CDB_FLOORTAB, /* floor index */
CDB_MSGLISTS, /* room message lists */
CDB_VISIT, /* user/room relationships */
+ CDB_DIRECTORY, /* address book directory */
+ CDB_USETABLE, /* network use table */
MAXCDB /* total number of CDB's defined */
};
#define EVT_CMD 6 /* Called after each server command */
#define EVT_RWHO 7 /* An RWHO command is being executed */
-
-
-
+#define EVT_TIMER 50 /* Timer events are called once per minute
+ and are not tied to any session */
/*
* UserFunctionHook extensions are used for any type of hook which implements
#define EVT_PURGEUSER 100 /* Deleting a user */
#define EVT_OUTPUTMSG 101 /* Outputting a message */
-
/*
* MessageFunctionHook extensions are used for hooks which implement handlers
* for various types of message operations (save, read, etc.)
#define EVT_BEFOREREAD 200
#define EVT_BEFORESAVE 201
#define EVT_AFTERSAVE 202
+#define EVT_SMTPSCAN 203 /* called before submitting a msg from SMTP */
+
+
+
+/*
+ * NetprocFunctionHook extensions are used for hooks which implement handlers
+ * for incoming network messages.
+ */
+struct NetprocFunctionHook {
+ struct NetprocFunctionHook *next;
+ int (*h_function_pointer) (struct CtdlMessage *msg, char *target_room);
+};
+extern struct NetprocFunctionHook *NetprocHookTable;
+
+
+/*
+ * DeleteFunctionHook extensions are used for hooks which get called when a
+ * message is about to be deleted.
+ */
+struct DeleteFunctionHook {
+ struct DeleteFunctionHook *next;
+ void (*h_function_pointer) (char *target_room, long msgnum);
+};
+extern struct DeleteFunctionHook *DeleteHookTable;
/*
+/*
+ * ServiceFunctionHook extensions are used for hooks which implement various
+ * non-Citadel services (on TCP protocols) directly in the Citadel server.
+ */
+struct ServiceFunctionHook {
+ struct ServiceFunctionHook *next;
+ int tcp_port;
+ char *sockpath;
+ void (*h_greeting_function) (void) ;
+ void (*h_command_function) (void) ;
+ int msock;
+};
+extern struct ServiceFunctionHook *ServiceHookTable;
+
/* Defines the relationship of a user to a particular room */
long v_usernum;
long v_lastseen;
unsigned int v_flags;
+ char v_seen[SIZ];
+ int v_view;
};
#define V_FORGET 1 /* User has zapped this room */
#define V_LOCKOUT 2 /* User is locked out of this room */
#define V_ACCESS 4 /* Access is granted to this room */
-#define UA_KNOWN 2
-#define UA_GOTOALLOWED 4
-#define UA_HASNEWMSGS 8
-#define UA_ZAPPED 16
-
/* Supplementary data for a message on disk
* (These are kept separately from the message itself because they are
* fields whose values may change at some point after the message is saved.)
*/
-struct SuppMsgInfo {
- long smi_msgnum; /* Message number in *local* message base */
- int smi_refcount; /* Number of rooms which point to this msg */
- char smi_content_type[64];
+struct MetaData {
+ long meta_msgnum; /* Message number in *local* message base */
+ int meta_refcount; /* Number of rooms which point to this msg */
+ char meta_content_type[64];
/* more stuff will be added to this record in the future */
};
/* Preferred field order */
-/* ********* Important fields */
-/* **************** Semi-important fields */
+/* ********** Important fields */
+/* *************** Semi-important fields */
/* * Message text (MUST be last) */
-#define FORDER "IPTAONHRDBCEFGJKLQSUVWXYZM"
+#define FORDER "IPTAFONHRDBCEGJKLQSVWXYZUM"
+
+#endif /* SERVER_H */