Removed some leftover dependencies on message fields which no longer exist
[citadel.git] / citadel / server.h
index e7c2d21a26c60747e446586d29646f208bdd3957..e5e64539c0a7f6ca1012414b61ebc522c7c05c75 100644 (file)
@@ -1,5 +1,16 @@
-/* $Id$ */
-
+/* 
+ * Main declarations file for the Citadel server
+ *
+ * Copyright (c) 1987-2020 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
 
 #ifndef SERVER_H
 #define SERVER_H
@@ -24,6 +35,7 @@ struct CtdlMessage {
        char cm_anon_type;              /* Anonymous or author-visible */
        char cm_format_type;            /* Format type */
        char *cm_fields[256];           /* Data fields */
+       long cm_lengths[256];           /* size of datafields */
        unsigned int cm_flags;          /* How to handle (NOT SAVED TO DISK) */
 };
 
@@ -31,139 +43,70 @@ struct CtdlMessage {
 #define        CM_SKIP_HOOKS   0x01            /* Don't run server-side handlers */
 
 
+/* Data structure returned by validate_recipients() */
+typedef struct __recptypes {
+       int recptypes_magic;
+        int num_local;
+        int num_internet;
+        int num_ignet;
+       int num_room;
+        int num_error;
+       char *errormsg;
+       char *recp_local;
+       char *recp_internet;
+       char *recp_room;
+       char *recp_orgroom;
+       char *display_recp;
+       char *bounce_to;
+       char *envelope_from;
+       char *sending_room;
+} recptypes;
+
+#define RECPTYPES_MAGIC 0xfeeb
+
+#define CTDLEXIT_SHUTDOWN      0       // Normal shutdown; do NOT auto-restart
 
 /*
  * Exit codes 101 through 109 are used for conditions in which
  * we deliberately do NOT want the service to automatically
  * restart.
  */
-#define CTDLEXIT_CONFIG                101     /* Could not read citadel.config */
-#define CTDLEXIT_CONTROL       102     /* Could not acquire lock */
-#define CTDLEXIT_HOME          103     /* Citadel home directory not found */
-#define CTDLEXIT_OOD           104     /* Out Of Date config - rerun setup */
-#define CTDLEXIT_DB            105     /* Unable to initialize database */
-#define CTDLEXIT_LIBCITADEL    106     /* Incorrect version of libcitadel */
-
-
-
+#define CTDLEXIT_CONFIG                101     // Could not read system configuration
+#define CTDLEXIT_CONTROL       102     // Could not acquire lock
+#define CTDLEXIT_HOME          103     // Citadel home directory not found
+#define CTDLEXIT_OOD           104     // Out Of Date config - rerun setup
+#define CTDLEXIT_DB            105     // Unable to initialize database
+#define CTDLEXIT_LIBCITADEL    106     // Incorrect version of libcitadel
+#define CTDL_EXIT_UNSUP_AUTH   107     // Unsupported auth mode configured
+#define CTDLEXIT_UNUSER                108     // Could not determine uid to run as
+#define CTDLEXIT_CRYPTO                109     // Problem initializing SSL or TLS
 
 /*
- * Here's the big one... the Citadel context structure.
- *
- * This structure keeps track of all information relating to a running 
- * session on the server.  We keep one of these for each session thread.
- *
- */
-struct CitContext {
-       struct CitContext *prev;        /* Link to previous session in list */
-       struct CitContext *next;        /* Link to next session in the list */
-
-       int state;              /* thread state (see CON_ values below) */
-       int kill_me;            /* Set to nonzero to flag for termination */
-       int client_socket;
-       int cs_pid;             /* session ID */
-       time_t lastcmd;         /* time of last command executed */
-       time_t lastidle;        /* For computing idle time */
-
-       char curr_user[USERNAME_SIZE];  /* name of current user */
-       int logged_in;          /* logged in */
-       int internal_pgm;       /* authenticated as internal program */
-       int nologin;            /* not allowed to log in */
-       int is_local_socket;    /* set to 1 if client is on unix domain sock */
-       int curr_view;          /* The view type for the current user/room */
-       int is_master;          /* Is this session logged in using the master user? */
-
-       char net_node[32]       ;/* Is the client another Citadel server? */
-       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 */
-       void (*h_async_function) (void) ;       /* do async msgs function */
-       int is_async;           /* Nonzero if client accepts async msgs */
-       int async_waiting;      /* Nonzero if there are async msgs waiting */
-       int input_waiting;      /* Nonzero if there is client input waiting */
-
-       /* Client information */
-       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[64];       /* host logged in from */
-       char cs_addr[64];       /* address logged in from */
-
-       /* The Internet type of thing */
-       char cs_inet_email[128];                /* Return address of outbound Internet mail */
-       char cs_inet_other_emails[1024];        /* User's other valid Internet email addresses */
-       char cs_inet_fn[128];                   /* Friendly-name of outbound Internet mail */
-
-       FILE *download_fp;      /* Fields relating to file transfer */
-       char download_desired_section[128];
-       FILE *upload_fp;
-       char upl_file[256];
-       char upl_path[PATH_MAX];
-       char upl_comment[256];
-       char upl_filedir[PATH_MAX];
-       char upl_mimetype[64];
-       char dl_is_net;
-       char upload_type;
-
-       struct ctdluser user;   /* Database record buffers */
-       struct ctdlroom room;
-
-       /* 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 a memory buffer? */
-       char *redirect_buffer;          /* the buffer */
-       size_t redirect_len;            /* length of data in buffer */
-       size_t redirect_alloc;          /* length of allocated buffer */
-#ifdef HAVE_OPENSSL
-       SSL *ssl;
-       int redirect_ssl;
-#endif
-
-       int buffering;
-       char *output_buffer;    /* hold output for one big dump */
-       int buffer_len;
-
-       /* A linked list of all instant messages sent to us. */
-       struct ExpressMessage *FirstExpressMessage;
-       int disable_exp;        /* Set to 1 to disable incoming pages */
-       int newmail;            /* Other sessions increment this */
-
-       /* Masqueraded values in the 'who is online' list */
-       char fake_username[USERNAME_SIZE];
-       char fake_hostname[64];
-       char fake_roomname[ROOMNAMELEN];
-
-       /* Preferred MIME formats */
-       char preferred_formats[256];
-       int msg4_dont_decode;
-
-       /* Dynamically allocated session data */
-       char *session_specific_data;            /* Used by individual protocol modules */
-       struct cit_ical *CIT_ICAL;              /* calendaring data */
-       struct ma_info *ma;                     /* multipart/alternative data */
-       const char *ServiceName;                /* readable purpose of this session */
-       void *openid_data;                      /* Data stored by the OpenID module */
-};
-
-typedef struct CitContext t_context;
-
-/*
- * Values for CitContext.state
- * 
- * A session that is doing nothing is in CON_IDLE state.  When activity
- * is detected on the socket, it goes to CON_READY, indicating that it
- * needs to have a worker thread bound to it.  When a thread binds to
- * the session, it goes to CON_EXECUTING and does its thing.  When the
- * transaction is finished, the thread sets it back to CON_IDLE and lets
- * it go.
+ * Reasons why a session would be terminated (set CC->kill_me to these values)
  */
 enum {
-       CON_IDLE,               /* This context is doing nothing */
-       CON_READY,              /* This context needs attention */
-       CON_EXECUTING           /* This context is bound to a thread */
+       KILLME_NOT,
+       KILLME_UNKNOWN,
+       KILLME_CLIENT_LOGGED_OUT,
+       KILLME_IDLE,
+       KILLME_CLIENT_DISCONNECTED,
+       KILLME_AUTHFAILED,
+       KILLME_SERVER_SHUTTING_DOWN,
+       KILLME_MAX_SESSIONS_EXCEEDED,
+       KILLME_ADMIN_TERMINATE,
+       KILLME_SELECT_INTERRUPTED,
+       KILLME_SELECT_FAILED,
+       KILLME_WRITE_FAILED,
+       KILLME_SIMULATION_WORKER,
+       KILLME_NOLOGIN,
+       KILLME_NO_CRYPTO,
+       KILLME_READSTRING_FAILED,
+       KILLME_MALLOC_FAILED,
+       KILLME_QUOTA,
+       KILLME_READ_FAILED,
+       KILLME_ILLEGAL_MANAGESIEVE_COMMAND,
+       KILLME_SPAMMER,
+       KILLME_XML_PARSER
 };
 
 
@@ -171,25 +114,9 @@ enum {
 #define CS_CHAT                2       /* chat mode */
 #define CS_POSTING     4       /* Posting */
 
-struct CitContext *MyContext(void);
-#define CC MyContext()
-
-/*
- * This is the control record for the message base... 
- */
-struct CitControl {
-       long MMhighest;                 /* highest message number in file   */
-       unsigned MMflags;               /* Global system flags              */
-       long MMnextuser;                /* highest user number on system    */
-       long MMnextroom;                /* highest room number on system    */
-       int version;                    /* Server-hosted upgrade level      */
-       int fulltext_wordbreaker;       /* ID of wordbreaker in use         */
-       long MMfulltext;                /* highest message number indexed   */
-};
-
-extern struct CitContext *ContextList;
 extern int ScheduledShutdown;
-extern struct CitControl CitControl;
+extern uid_t ctdluid;
+extern int sanity_diag_mode;
 
 struct ExpressMessage {
        struct ExpressMessage *next;
@@ -204,15 +131,6 @@ struct ExpressMessage {
 #define EM_GO_AWAY     2       /* Server requests client log off */
 #define EM_CHAT                4       /* Server requests client enter chat */
 
-struct ChatLine {
-       struct ChatLine *next;
-       int chat_seq;
-       time_t chat_time;
-       char chat_text[SIZ];
-       char chat_username[USERNAME_SIZE];
-       char chat_room[ROOMNAMELEN];
-};
-
 /*
  * Various things we need to lock and unlock
  */
@@ -227,13 +145,9 @@ enum {
        S_SUPPMSGMAIN,
        S_CONFIG,
        S_HOUSEKEEPING,
-       S_NTTLIST,
        S_DIRECTORY,
        S_NETCONFIGS,
-       S_PUBLIC_CLIENTS,
-       S_LDAP,
        S_FLOORCACHE,
-       S_DEBUGMEMLEAKS,
        S_ATBF,
        S_JOURNAL_QUEUE,
        S_RPLIST,
@@ -241,22 +155,15 @@ enum {
        S_CHKPWD,
        S_LOG,
        S_NETSPOOL,
-       S_THREAD_LIST,
        S_XMPP_QUEUE,
        S_SCHEDULE_LIST,
-       S_OPENID_ASSOC,
+       S_SINGLE_USER,
+       S_LDAP,
+       S_IM_LOGS,
        MAX_SEMAPHORES
 };
 
 
-/*
- * Upload types
- */
-#define UPL_FILE       0
-#define UPL_NET                1
-#define UPL_IMAGE      2
-
-
 /*
  * message transfer formats
  */
@@ -271,7 +178,7 @@ enum {
 /*
  * Message format types in the database
  */
-#define        FMT_CITADEL     0       /* Citadel vari-format (proprietary) */
+#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) */
 
@@ -291,6 +198,9 @@ enum {
        CDB_BIGMSGS,            /* larger message bodies         */
        CDB_FULLTEXT,           /* full text search index        */
        CDB_EUIDINDEX,          /* locate msgs by EUID           */
+       CDB_USERSBYNUMBER,      /* index of users by number      */
+       CDB_EXTAUTH,            /* associates OpenIDs with users */
+       CDB_CONFIG,             /* system configuration database */
        MAXCDB                  /* total number of CDB's defined */
 };
 
@@ -300,7 +210,7 @@ struct cdbdata {
 };
 
 
-/* 
+/*
  * Event types can't be enum'ed, because they must remain consistent between
  * builds (to allow for binary modules built somewhere else)
  */
@@ -319,6 +229,7 @@ struct cdbdata {
 #define EVT_TIMER      50      /* Timer events are called once per minute
                                   and are not tied to any session */
 #define EVT_HOUSE      51      /* as needed houskeeping stuff */
+#define EVT_SHUTDOWN   52      /* Server is shutting down */
 
 #define EVT_PURGEUSER  100     /* Deleting a user */
 #define EVT_NEWUSER    102     /* Creating a user */
@@ -327,6 +238,7 @@ struct cdbdata {
 #define EVT_BEFORESAVE 201
 #define EVT_AFTERSAVE  202
 #define EVT_SMTPSCAN   203     /* called before submitting a msg from SMTP */
+#define EVT_AFTERUSRMBOXSAVE 204 /* called afte a message was saved into a users inbox */
 /* Priority levels for paging functions (lower is better) */
 enum {
        XMSG_PRI_LOCAL,         /* Other users on -this- server */
@@ -337,7 +249,7 @@ enum {
 
 
 /* Defines the relationship of a user to a particular room */
-struct visit {
+typedef struct __visit {
        long v_roomnum;
        long v_roomgen;
        long v_usernum;
@@ -346,7 +258,7 @@ struct visit {
        char v_seen[SIZ];
        char v_answered[SIZ];
        int v_view;
-};
+} visit;
 
 #define V_FORGET       1       /* User has zapped this room        */
 #define V_LOCKOUT      2       /* User is locked out of this room  */
@@ -357,15 +269,16 @@ struct visit {
  * These are kept separate from the message itself for one of two reasons:
  * 1. Either their values may change at some point after initial save, or
  * 2. They are merely caches of data which exist somewhere else, for speed.
+ * DO NOT PUT BIG DATA IN HERE ... we need this struct to be tiny for lots of quick r/w
  */
 struct MetaData {
        long meta_msgnum;               /* Message number in *local* message base */
        int meta_refcount;              /* Number of rooms pointing to this msg */
        char meta_content_type[64];     /* Cached MIME content-type */
        long meta_rfc822_length;        /* Cache of RFC822-translated msg length */
-       char mimetype[64];              /* if we were able to guess the mimetype for the data */ 
 };
 
+
 /* Calls to AdjRefCount() are queued and deferred, so the user doesn't
  * have to wait for various disk-intensive operations to complete synchronously.
  * This is the record format.
@@ -376,12 +289,12 @@ struct arcq {
 };
 
 
-/* 
+/*
  * Serialization routines use this struct to return a pointer and a length
  */
 struct ser_ret {
-        size_t len;
-        unsigned char *ser;
+       size_t len;
+       unsigned char *ser;
 };
 
 
@@ -393,12 +306,28 @@ struct UseTable {
        time_t ut_timestamp;
 };
 
-
-
-/* Preferred field order                                                       */
-/*               **********                    Important fields                */
-/*                         ***************     Semi-important fields           */
-/*                                        *    Message text (MUST be last)     */
-#define FORDER "IPTAFONHRDBCEWJGKLQSVXZYUM"
+typedef enum _MsgField {
+       eAuthor       = 'A',
+       eBig_message  = 'B',
+       eExclusiveID  = 'E',
+       erFc822Addr   = 'F',
+       emessageId    = 'I',
+       eJournal      = 'J',
+       eReplyTo      = 'K',
+       eListID       = 'L',
+       eMesageText   = 'M',
+       eOriginalRoom = 'O',
+       eMessagePath  = 'P',
+       eRecipient    = 'R',
+       eTimestamp    = 'T',
+       eMsgSubject   = 'U',
+       eenVelopeTo   = 'V',
+       eWeferences   = 'W',
+       eCarbonCopY   = 'Y',
+       eErrorMsg     = '0',
+       eSuppressIdx  = '1',
+       eExtnotify    = '2',
+       eVltMsgNum    = '3'
+} eMsgField;
 
 #endif /* SERVER_H */