* Renamed "SuppMsgInfo" to "MetaData" because that's what it is
[citadel.git] / citadel / server.h
1 /* $Id$ */
2
3 /* Uncomment this if you want to track memory leaks.
4  * This incurs some overhead, so don't use it unless you're debugging the code!
5  */
6 /* #define DEBUG_MEMORY_LEAKS */
7
8 /*
9  * New format for a message in memory
10  */
11
12 #ifndef SERVER_H
13 #define SERVER_H
14
15 #ifdef __GNUC__
16 #define INLINE inline
17 #else
18 #define INLINE
19 #endif
20
21 #ifdef __CYGWIN__
22
23 #ifdef IN_LIBCIT
24 #define DLEXP __declspec(dllexport)
25 #else
26 #define DLEXP __declspec(dllimport)
27 #endif
28
29 #else
30 #define DLEXP
31
32 #endif /* __CYGWIN__ */
33
34 #include "citadel.h"
35
36 #define CTDLMESSAGE_MAGIC               0x159d
37 struct CtdlMessage {
38         int cm_magic;                   /* Self-check */
39         char cm_anon_type;              /* Anonymous or author-visible */
40         char cm_format_type;            /* Format type */
41         char *cm_fields[256];           /* Data fields */
42         unsigned int cm_flags;          /* How to handle (NOT SAVED TO DISK) */
43 };
44
45 #define CM_SKIP_HOOKS   0x01            /* Don't run server-side handlers */
46
47
48 /*
49  * Generic per-session variable or data structure storage
50  */
51 struct CtdlSessData {
52         struct CtdlSessData *next;
53         unsigned long sym_id;
54         void *sym_data;
55 };
56
57 /*
58  * Static user data symbol types
59  */
60 enum {
61         SYM_DESIRED_SECTION,            /* Used by the MIME parser */
62         SYM_MA_INFO,                    /* Handles multipart/alternative */
63         SYM_REPL,                       /* Used for replication checking */
64         SYM_MAX
65 };
66
67
68 /*
69  * Here's the big one... the Citadel context structure.
70  *
71  * This structure keeps track of all information relating to a running 
72  * session on the server.  We keep one of these for each session thread.
73  *
74  * Note that the first element is "*next" so that it may be used without
75  * modification in a linked list.
76  */
77 struct CitContext {
78         struct CitContext *next;        /* Link to next session in the list */
79
80         struct usersupp usersupp;       /* Database record buffers */
81         struct quickroom quickroom;
82
83         int state;              /* thread state (see CON_ values below) */
84         int kill_me;            /* Set to nonzero to flag for termination */
85
86         char curr_user[USERNAME_SIZE];  /* name of current user */
87         int logged_in;          /* logged in */
88         int internal_pgm;       /* authenticated as internal program */
89         char temp[32];          /* temp file name */
90         int nologin;            /* not allowed to log in */
91         int is_local_socket;    /* set to 1 if client is on unix domain sock */
92
93         char net_node[32];      /* Is the client another Citadel server? */
94         int client_socket;
95         int cs_pid;             /* session ID */
96         time_t cs_lastupdt;     /* time of last update */
97         time_t lastcmd;         /* time of last command executed */
98         time_t lastidle;        /* For computing idle time */
99         char lastcmdname[5];    /* name of last command executed */
100         unsigned cs_flags;      /* miscellaneous flags */
101         void (*h_command_function) (void) ;     /* service command function */
102         int is_async;           /* Nonzero if client accepts async msgs */
103
104         /* feeping creaturisms... */
105         int cs_clientdev;       /* client developer ID */
106         int cs_clienttyp;       /* client type code */
107         int cs_clientver;       /* client version number */
108         char cs_clientname[32]; /* name of client software */
109         char cs_host[26];       /* host logged in from */
110
111         /* Beginning of cryptography - session nonce */
112         char cs_nonce[NONCE_SIZE];      /* The nonce for this session's next auth transaction */
113
114         FILE *download_fp;      /* Fields relating to file transfer */
115         FILE *upload_fp;
116         char upl_file[SIZ];
117         char upl_path[SIZ];
118         char upl_comment[SIZ];
119         char upl_filedir[SIZ];
120         char dl_is_net;
121         char upload_type;
122
123         /* Redirect this session's output to somewhere else? */
124         FILE *redirect_fp;
125         int redirect_sock;
126
127         /* A linked list of all express messages sent to us. */
128         struct ExpressMessage *FirstExpressMessage;
129         int disable_exp;        /* Set to 1 to disable incoming pages */
130
131         /* Masquerade... */
132         char fake_username[USERNAME_SIZE];      /* Fake username <bc> */ 
133         char fake_postname[USERNAME_SIZE];      /* Fake postname <bc> */
134         char fake_hostname[25];                 /* Fake hostname <bc> */
135         char fake_roomname[ROOMNAMELEN];        /* Fake roomname <bc> */
136
137         /* Dynamically allocated session data */
138         struct CtdlSessData *FirstSessData;
139 };
140
141 typedef struct CitContext t_context;
142
143 /* Values for CitContext.state */
144 enum {
145         CON_IDLE,               /* This context is doing nothing */
146         CON_EXECUTING           /* This context is bound to a thread */
147 };
148
149
150 #define CS_STEALTH      1       /* stealth mode */
151 #define CS_CHAT         2       /* chat mode */
152 #define CS_POSTING      4       /* Posting */
153
154 struct CitContext *MyContext(void);
155 #define CC ((struct CitContext *)MyContext())
156
157 extern DLEXP struct CitContext *ContextList;
158 extern DLEXP int ScheduledShutdown;
159 extern DLEXP struct CitControl CitControl;
160
161
162 struct ExpressMessage {
163         struct ExpressMessage *next;
164         time_t timestamp;       /* When this message was sent */
165         unsigned flags;         /* Special instructions */
166         char sender[64];        /* Name of sending user */
167         char *text;             /* Message text (if applicable) */
168 };
169
170 #define EM_BROADCAST    1       /* Broadcast message */
171 #define EM_GO_AWAY      2       /* Server requests client log off */
172 #define EM_CHAT         4       /* Server requests client enter chat */
173
174 struct ChatLine {
175         struct ChatLine *next;
176         int chat_seq;
177         time_t chat_time;
178         char chat_text[SIZ];
179         char chat_username[USERNAME_SIZE];
180         char chat_room[ROOMNAMELEN];
181 };
182
183 /*
184  * Various things we need to lock and unlock
185  */
186 enum {
187         S_USERSUPP,
188         S_QUICKROOM,
189         S_SESSION_TABLE,
190         S_FLOORTAB,
191         S_CHATQUEUE,
192         S_CONTROL,
193         S_DATABASE,
194         S_NETDB,
195         S_SUPPMSGMAIN,
196         S_I_WANNA_SELECT,
197         S_CONFIG,
198         S_WORKER_LIST,
199         S_HOUSEKEEPING,
200         S_NTTLIST,
201         MAX_SEMAPHORES
202 };
203
204
205 /*
206  * Upload types
207  */
208 #define UPL_FILE        0
209 #define UPL_NET         1
210 #define UPL_IMAGE       2
211
212
213 /*
214  * message transfer formats
215  */
216 enum {
217         MT_CITADEL,             /* Citadel proprietary */
218         MT_RFC822,              /* RFC822 */
219         MT_MIME,                /* MIME-formatted message */
220         MT_DOWNLOAD             /* Download a component */
221 };
222
223 /*
224  * Message format types in the database
225  */
226 #define FMT_CITADEL     0       /* Citadel vari-format (proprietary) */
227 #define FMT_FIXED       1       /* Fixed format (proprietary)        */
228 #define FMT_RFC822      4       /* Standard (headers are in M field) */
229
230
231 /*
232  * Citadel DataBases (define one for each cdb we need to open)
233  */
234 enum {
235         CDB_MSGMAIN,            /* message base                  */
236         CDB_USERSUPP,           /* user file                     */
237         CDB_QUICKROOM,          /* room index                    */
238         CDB_FLOORTAB,           /* floor index                   */
239         CDB_MSGLISTS,           /* room message lists            */
240         CDB_VISIT,              /* user/room relationships       */
241         MAXCDB                  /* total number of CDB's defined */
242 };
243
244 struct cdbdata {
245         size_t len;
246         char *ptr;
247 };
248
249
250
251 /* Structures and declarations for function hooks of various types */
252
253 struct LogFunctionHook {
254         struct LogFunctionHook *next;
255         int loglevel;
256         void (*h_function_pointer) (char *);
257 };
258 extern DLEXP struct LogFunctionHook *LogHookTable;
259
260 struct CleanupFunctionHook {
261         struct CleanupFunctionHook *next;
262         void (*h_function_pointer) (void);
263 };
264 extern DLEXP struct CleanupFunctionHook *CleanupHookTable;
265
266
267
268
269 /*
270  * SessionFunctionHook extensions are used for any type of hook for which
271  * the context in which it's being called (which is determined by the event
272  * type) will make it obvious for the hook function to know where to look for
273  * pertinent data.
274  */
275 struct SessionFunctionHook {
276         struct SessionFunctionHook *next;
277         void (*h_function_pointer) (void);
278         int eventtype;
279 };
280 extern DLEXP struct SessionFunctionHook *SessionHookTable;
281
282 /* 
283  * Event types can't be enum'ed, because they must remain consistent between
284  * builds (to allow for binary modules built somewhere else)
285  */
286 #define EVT_STOP        0       /* Session is terminating */
287 #define EVT_START       1       /* Session is starting */
288 #define EVT_LOGIN       2       /* A user is logging in */
289 #define EVT_NEWROOM     3       /* Changing rooms */
290 #define EVT_LOGOUT      4       /* A user is logging out */
291 #define EVT_SETPASS     5       /* Setting or changing password */
292 #define EVT_CMD         6       /* Called after each server command */
293 #define EVT_RWHO        7       /* An RWHO command is being executed */
294
295 #define EVT_TIMER       50      /* Timer events are called once per minute
296                                    and are not tied to any session */
297
298 /*
299  * UserFunctionHook extensions are used for any type of hook which implements
300  * an operation on a user or username (potentially) other than the one
301  * operating the current session.
302  */
303 struct UserFunctionHook {
304         struct UserFunctionHook *next;
305         void (*h_function_pointer) (char *username, long usernum);
306         int eventtype;
307 };
308 extern DLEXP struct UserFunctionHook *UserHookTable;
309
310 #define EVT_PURGEUSER   100     /* Deleting a user */
311 #define EVT_OUTPUTMSG   101     /* Outputting a message */
312
313 /*
314  * MessageFunctionHook extensions are used for hooks which implement handlers
315  * for various types of message operations (save, read, etc.)
316  */
317 struct MessageFunctionHook {
318         struct MessageFunctionHook *next;
319         int (*h_function_pointer) (struct CtdlMessage *msg);
320         int eventtype;
321 };
322 extern DLEXP struct MessageFunctionHook *MessageHookTable;
323
324 #define EVT_BEFOREREAD  200
325 #define EVT_BEFORESAVE  201
326 #define EVT_AFTERSAVE   202
327
328
329 /*
330  * ExpressMessageFunctionHook extensions are used for hooks which implement
331  * the sending of an express message through various channels.  Any function
332  * registered should return the number of recipients to whom the message was
333  * successfully transmitted.
334  */
335 struct XmsgFunctionHook {
336         struct XmsgFunctionHook *next;
337         int (*h_function_pointer) (char *, char *, char *);
338         int order;
339 };
340 extern DLEXP struct XmsgFunctionHook *XmsgHookTable;
341
342 /* Priority levels for paging functions (lower is better) */
343 enum {
344         XMSG_PRI_LOCAL,         /* Other users on -this- server */
345         XMSG_PRI_REMOTE,        /* Other users on a Citadel network (future) */
346         XMSG_PRI_FOREIGN,       /* Contacts on foreign instant message hosts */
347         MAX_XMSG_PRI
348 };
349
350
351
352 /*
353  * ServiceFunctionHook extensions are used for hooks which implement various
354  * non-Citadel services (on TCP protocols) directly in the Citadel server.
355  */
356 struct ServiceFunctionHook {
357         struct ServiceFunctionHook *next;
358         int tcp_port;
359         char *sockpath;
360         void (*h_greeting_function) (void) ;
361         void (*h_command_function) (void) ;
362         int msock;
363 };
364 extern DLEXP struct ServiceFunctionHook *ServiceHookTable;
365
366
367
368 /* Defines the relationship of a user to a particular room */
369 struct visit {
370         long v_roomnum;
371         long v_roomgen;
372         long v_usernum;
373         long v_lastseen;
374         unsigned int v_flags;
375         char v_seen[SIZ];
376 };
377
378 #define V_FORGET        1       /* User has zapped this room        */
379 #define V_LOCKOUT       2       /* User is locked out of this room  */
380 #define V_ACCESS        4       /* Access is granted to this room   */
381
382 #define UA_KNOWN                2
383 #define UA_GOTOALLOWED          4
384 #define UA_HASNEWMSGS           8
385 #define UA_ZAPPED               16
386
387
388 /* Supplementary data for a message on disk
389  * (These are kept separately from the message itself because they are
390  * fields whose values may change at some point after the message is saved.)
391  */
392 struct MetaData {
393         long smi_msgnum;        /* Message number in *local* message base */
394         int smi_refcount;       /* Number of rooms which point to this msg */
395         char smi_content_type[64];
396         char smi_mod;           /* Moderated to what level? */
397         /* more stuff will be added to this record in the future */
398 };
399
400
401
402 /* Built-in debuggable stuff for checking for memory leaks */
403 #ifdef DEBUG_MEMORY_LEAKS
404
405 #define mallok(howbig)          tracked_malloc(howbig, __FILE__, __LINE__)
406 #define phree(whichptr)                 tracked_free(whichptr)
407 #define reallok(whichptr,howbig)        tracked_realloc(whichptr,howbig)
408 #define strdoop(orig)           tracked_strdup(orig, __FILE__, __LINE__)
409
410 void *tracked_malloc(size_t, char *, int);
411 void tracked_free(void *);
412 void *tracked_realloc(void *, size_t);
413 void dump_tracked(void);
414 char *tracked_strdup(const char *, char *, int);
415
416 struct TheHeap {
417         struct TheHeap *next;
418         char h_file[32];
419         int h_line;
420         void *h_ptr;
421 };
422
423 extern DLEXP struct TheHeap *heap;
424
425 #else
426
427 #define mallok(howbig)                  malloc(howbig)
428 #define phree(whichptr)                 free(whichptr)
429 #define reallok(whichptr,howbig)        realloc(whichptr,howbig)
430 #define strdoop(orig)                   strdup(orig)
431
432
433 #endif
434
435
436 /* 
437  * Serialization routines use this struct to return a pointer and a length
438  */
439 struct ser_ret {
440         size_t len;
441         char *ser;
442 };
443
444
445 /* Preferred field order */
446 /*               **********                     Important fields */
447 /*                         ***************      Semi-important fields */
448 /*                                        *     Message text (MUST be last) */
449 #define FORDER  "IPTAFONHRDBCEGJKLQSUVWXYZM"
450
451 #endif /* SERVER_H */