"Fossies" - the Fresh Open Source Software Archive

Member "citadel/server.h" (5 Jun 2021, 9116 Bytes) of package /linux/www/citadel.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "server.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 9.01_vs_902.

    1 /* 
    2  * Main declarations file for the Citadel server
    3  *
    4  * Copyright (c) 1987-2020 by the citadel.org team
    5  *
    6  * This program is open source software; you can redistribute it and/or modify
    7  * it under the terms of the GNU General Public License, version 3.
    8  *
    9  * This program is distributed in the hope that it will be useful,
   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   12  * GNU General Public License for more details.
   13  */
   14 
   15 #ifndef SERVER_H
   16 #define SERVER_H
   17 
   18 #ifdef __GNUC__
   19 #define INLINE __inline__
   20 #else
   21 #define INLINE
   22 #endif
   23 
   24 #include "citadel.h"
   25 #ifdef HAVE_OPENSSL
   26 #define OPENSSL_NO_KRB5     /* work around redhat b0rken ssl headers */
   27 #include <openssl/ssl.h>
   28 #endif
   29 
   30 /*
   31  * New format for a message in memory
   32  */
   33 struct CtdlMessage {
   34     int cm_magic;           /* Self-check (NOT SAVED TO DISK) */
   35     char cm_anon_type;      /* Anonymous or author-visible */
   36     char cm_format_type;        /* Format type */
   37     char *cm_fields[256];       /* Data fields */
   38     long cm_lengths[256];       /* size of datafields */
   39     unsigned int cm_flags;      /* How to handle (NOT SAVED TO DISK) */
   40 };
   41 
   42 #define CTDLMESSAGE_MAGIC       0x159d
   43 #define CM_SKIP_HOOKS   0x01        /* Don't run server-side handlers */
   44 
   45 
   46 /* Data structure returned by validate_recipients() */
   47 struct recptypes {
   48     int recptypes_magic;
   49         int num_local;
   50         int num_internet;
   51         int num_ignet;
   52     int num_room;
   53         int num_error;
   54     char *errormsg;
   55     char *recp_local;
   56     char *recp_internet;
   57     char *recp_room;
   58     char *recp_orgroom;
   59     char *display_recp;
   60     char *bounce_to;
   61     char *envelope_from;
   62     char *sending_room;
   63 };
   64 
   65 #define RECPTYPES_MAGIC 0xfeeb
   66 
   67 #define CTDLEXIT_SHUTDOWN   0   // Normal shutdown; do NOT auto-restart
   68 
   69 /*
   70  * Exit codes 101 through 109 are used for conditions in which
   71  * we deliberately do NOT want the service to automatically
   72  * restart.
   73  */
   74 #define CTDLEXIT_CONFIG     101 // Could not read system configuration
   75 #define CTDLEXIT_HOME       103 // Citadel home directory not found
   76 #define CTDLEXIT_DB     105 // Unable to initialize database
   77 #define CTDLEXIT_LIBCITADEL 106 // Incorrect version of libcitadel
   78 #define CTDL_EXIT_UNSUP_AUTH    107 // Unsupported auth mode configured
   79 #define CTDLEXIT_UNUSER     108 // Could not determine uid to run as
   80 #define CTDLEXIT_CRYPTO     109 // Problem initializing SSL or TLS
   81 
   82 /*
   83  * Reasons why a session would be terminated (set CC->kill_me to these values)
   84  */
   85 enum {
   86     KILLME_NOT,
   87     KILLME_UNKNOWN,
   88     KILLME_CLIENT_LOGGED_OUT,
   89     KILLME_IDLE,
   90     KILLME_CLIENT_DISCONNECTED,
   91     KILLME_AUTHFAILED,
   92     KILLME_SERVER_SHUTTING_DOWN,
   93     KILLME_MAX_SESSIONS_EXCEEDED,
   94     KILLME_ADMIN_TERMINATE,
   95     KILLME_SELECT_INTERRUPTED,
   96     KILLME_SELECT_FAILED,
   97     KILLME_WRITE_FAILED,
   98     KILLME_SIMULATION_WORKER,
   99     KILLME_NOLOGIN,
  100     KILLME_NO_CRYPTO,
  101     KILLME_READSTRING_FAILED,
  102     KILLME_MALLOC_FAILED,
  103     KILLME_QUOTA,
  104     KILLME_READ_FAILED,
  105     KILLME_SPAMMER,
  106     KILLME_XML_PARSER
  107 };
  108 
  109 
  110 #define CS_STEALTH  1   /* stealth mode */
  111 #define CS_CHAT     2   /* chat mode */
  112 #define CS_POSTING  4   /* Posting */
  113 
  114 extern int ScheduledShutdown;
  115 extern uid_t ctdluid;
  116 extern int sanity_diag_mode;
  117 
  118 struct ExpressMessage {
  119     struct ExpressMessage *next;
  120     time_t timestamp;   /* When this message was sent */
  121     unsigned flags;     /* Special instructions */
  122     char sender[256];   /* Name of sending user */
  123     char sender_email[256]; /* Email or JID of sending user */
  124     char *text;     /* Message text (if applicable) */
  125 };
  126 
  127 #define EM_BROADCAST    1   /* Broadcast message */
  128 #define EM_GO_AWAY  2   /* Server requests client log off */
  129 #define EM_CHAT     4   /* Server requests client enter chat */
  130 
  131 /*
  132  * Various things we need to lock and unlock
  133  */
  134 enum {
  135     S_USERS,
  136     S_ROOMS,
  137     S_SESSION_TABLE,
  138     S_FLOORTAB,
  139     S_CHATQUEUE,
  140     S_CONTROL,
  141     S_NETDB,
  142     S_SUPPMSGMAIN,
  143     S_CONFIG,
  144     S_HOUSEKEEPING,
  145     S_DIRECTORY,
  146     S_NETCONFIGS,
  147     S_FLOORCACHE,
  148     S_ATBF,
  149     S_JOURNAL_QUEUE,
  150     S_CHKPWD,
  151     S_LOG,
  152     S_NETSPOOL,
  153     S_XMPP_QUEUE,
  154     S_SCHEDULE_LIST,
  155     S_SINGLE_USER,
  156     S_LDAP,
  157     S_IM_LOGS,
  158     MAX_SEMAPHORES
  159 };
  160 
  161 
  162 /*
  163  * message transfer formats
  164  */
  165 enum {
  166     MT_CITADEL,     /* Citadel proprietary */
  167     MT_RFC822,      /* RFC822 */
  168     MT_MIME,        /* MIME-formatted message */
  169     MT_DOWNLOAD,        /* Download a component */
  170     MT_SPEW_SECTION     /* Download a component in a single operation */
  171 };
  172 
  173 /*
  174  * Message format types in the database
  175  */
  176 #define FMT_CITADEL 0   /* Citadel vari-format (proprietary) */
  177 #define FMT_FIXED   1   /* Fixed format (proprietary)        */
  178 #define FMT_RFC822  4   /* Standard (headers are in M field) */
  179 
  180 
  181 /*
  182  * Citadel DataBases (define one for each cdb we need to open)
  183  */
  184 enum {
  185     CDB_MSGMAIN,        /* message base                  */
  186     CDB_USERS,      /* user file                     */
  187     CDB_ROOMS,      /* room index                    */
  188     CDB_FLOORTAB,       /* floor index                   */
  189     CDB_MSGLISTS,       /* room message lists            */
  190     CDB_VISIT,      /* user/room relationships       */
  191     CDB_DIRECTORY,      /* address book directory        */
  192     CDB_USETABLE,       /* network use table             */
  193     CDB_BIGMSGS,        /* larger message bodies         */
  194     CDB_FULLTEXT,       /* full text search index        */
  195     CDB_EUIDINDEX,      /* locate msgs by EUID           */
  196     CDB_USERSBYNUMBER,  /* index of users by number      */
  197     CDB_EXTAUTH,        /* associates OpenIDs with users */
  198     CDB_CONFIG,     /* system configuration database */
  199     MAXCDB          /* total number of CDB's defined */
  200 };
  201 
  202 struct cdbdata {
  203     size_t len;
  204     char *ptr;
  205 };
  206 
  207 
  208 /*
  209  * Event types can't be enum'ed, because they must remain consistent between
  210  * builds (to allow for binary modules built somewhere else)
  211  */
  212 #define EVT_STOP    0   /* Session is terminating */
  213 #define EVT_START   1   /* Session is starting */
  214 #define EVT_LOGIN   2   /* A user is logging in */
  215 #define EVT_NEWROOM 3   /* Changing rooms */
  216 #define EVT_LOGOUT  4   /* A user is logging out */
  217 #define EVT_SETPASS 5   /* Setting or changing password */
  218 #define EVT_CMD     6   /* Called after each server command */
  219 #define EVT_RWHO    7   /* An RWHO command is being executed */
  220 #define EVT_ASYNC   8   /* Doing asynchronous messages */
  221 #define EVT_STEALTH 9   /* Entering stealth mode */
  222 #define EVT_UNSTEALTH   10  /* Exiting stealth mode */
  223 
  224 #define EVT_TIMER   50  /* Timer events are called once per minute
  225                    and are not tied to any session */
  226 #define EVT_HOUSE   51  /* as needed houskeeping stuff */
  227 #define EVT_SHUTDOWN    52  /* Server is shutting down */
  228 
  229 #define EVT_PURGEUSER   100 /* Deleting a user */
  230 #define EVT_NEWUSER 102 /* Creating a user */
  231 
  232 #define EVT_BEFORESAVE  201
  233 #define EVT_AFTERSAVE   202
  234 #define EVT_SMTPSCAN    203 /* called before submitting a msg from SMTP */
  235 #define EVT_AFTERUSRMBOXSAVE 204 /* called afte a message was saved into a users inbox */
  236 /* Priority levels for paging functions (lower is better) */
  237 enum {
  238     XMSG_PRI_LOCAL,     /* Other users on -this- server */
  239     XMSG_PRI_REMOTE,    /* Other users on a Citadel network (future) */
  240     XMSG_PRI_FOREIGN,   /* Contacts on foreign instant message hosts */
  241     MAX_XMSG_PRI
  242 };
  243 
  244 
  245 /* Defines the relationship of a user to a particular room */
  246 typedef struct __visit {
  247     long v_roomnum;
  248     long v_roomgen;
  249     long v_usernum;
  250     long v_lastseen;
  251     unsigned int v_flags;
  252     char v_seen[SIZ];
  253     char v_answered[SIZ];
  254     int v_view;
  255 } visit;
  256 
  257 #define V_FORGET    1   /* User has zapped this room        */
  258 #define V_LOCKOUT   2   /* User is locked out of this room  */
  259 #define V_ACCESS    4   /* Access is granted to this room   */
  260 
  261 
  262 /* Supplementary data for a message on disk
  263  * These are kept separate from the message itself for one of two reasons:
  264  * 1. Either their values may change at some point after initial save, or
  265  * 2. They are merely caches of data which exist somewhere else, for speed.
  266  * DO NOT PUT BIG DATA IN HERE ... we need this struct to be tiny for lots of quick r/w
  267  */
  268 struct MetaData {
  269     long meta_msgnum;       /* Message number in *local* message base */
  270     int meta_refcount;      /* Number of rooms pointing to this msg */
  271     char meta_content_type[64]; /* Cached MIME content-type */
  272     long meta_rfc822_length;    /* Cache of RFC822-translated msg length */
  273 };
  274 
  275 
  276 /* Calls to AdjRefCount() are queued and deferred, so the user doesn't
  277  * have to wait for various disk-intensive operations to complete synchronously.
  278  * This is the record format.
  279  */
  280 struct arcq {
  281     long arcq_msgnum;       /* Message number being adjusted */
  282     int arcq_delta;         /* Adjustment ( usually 1 or -1 ) */
  283 };
  284 
  285 
  286 /*
  287  * Serialization routines use this struct to return a pointer and a length
  288  */
  289 struct ser_ret {
  290     size_t len;
  291     unsigned char *ser;
  292 };
  293 
  294 
  295 /*
  296  * The S_USETABLE database is used in several modules now, so we define its format here.
  297  */
  298 struct UseTable {
  299     char ut_msgid[SIZ];
  300     time_t ut_timestamp;
  301 };
  302 
  303 
  304 /*
  305  * These one-byte field headers are found in the Citadel message store.
  306  */
  307 typedef enum _MsgField {
  308     eAuthor       = 'A',
  309     eBig_message  = 'B',
  310     eExclusiveID  = 'E',
  311     erFc822Addr   = 'F',
  312     emessageId    = 'I',
  313     eJournal      = 'J',
  314     eReplyTo      = 'K',
  315     eListID       = 'L',
  316     eMesageText   = 'M',
  317     eOriginalRoom = 'O',
  318     eMessagePath  = 'P',
  319     eRecipient    = 'R',
  320     eTimestamp    = 'T',
  321     eMsgSubject   = 'U',
  322     eenVelopeTo   = 'V',
  323     eWeferences   = 'W',
  324     eCarbonCopY   = 'Y',
  325     eErrorMsg     = '0',
  326     eSuppressIdx  = '1',
  327     eExtnotify    = '2',
  328     eVltMsgNum    = '3'
  329 } eMsgField;
  330 
  331 #endif /* SERVER_H */