1 // Main declarations file for the Citadel server
3 // Copyright (c) 1987-2023 by the citadel.org team
5 // This program is open source software. Use, duplication, or disclosure
6 // is subject to the terms of the GNU General Public License, version 3.
12 #define INLINE __inline__
19 #define OPENSSL_NO_KRB5 // work around redhat b0rken ssl headers
20 #include <openssl/ssl.h>
23 // New format for a message in memory
25 int cm_magic; // Self-check (NOT SAVED TO DISK)
26 char cm_anon_type; // Anonymous or author-visible
27 char cm_format_type; // Format type
28 char *cm_fields[256]; // Data fields
29 long cm_lengths[256]; // size of datafields
30 unsigned int cm_flags; // How to handle (NOT SAVED TO DISK)
33 #define CTDLMESSAGE_MAGIC 0x159d
34 #define CM_SKIP_HOOKS 0x01 // Don't run server-side handlers
37 // Data structure returned by validate_recipients()
55 #define RECPTYPES_MAGIC 0xfeeb
57 #define CTDLEXIT_SHUTDOWN 0 // Normal shutdown; do NOT auto-restart
59 // Exit codes 101 through 109 are used for conditions in which
60 // we deliberately do NOT want the service to automatically
62 #define CTDLEXIT_CONFIG 101 // Could not read system configuration
63 #define CTDLEXIT_HOME 103 // Citadel home directory not found
64 #define CTDLEXIT_DB 105 // Unable to initialize database
65 #define CTDLEXIT_LIBCITADEL 106 // Incorrect version of libcitadel
66 #define CTDL_EXIT_UNSUP_AUTH 107 // Unsupported auth mode configured
67 #define CTDLEXIT_UNUSER 108 // Could not determine uid to run as
68 #define CTDLEXIT_CRYPTO 109 // Problem initializing SSL or TLS
70 // Any other exit is likely to be from an unexpected abort (segfault etc)
71 // and we want to try restarting.
75 // Reasons why a session would be terminated (set CC->kill_me to these values)
79 KILLME_CLIENT_LOGGED_OUT,
81 KILLME_CLIENT_DISCONNECTED,
83 KILLME_SERVER_SHUTTING_DOWN,
84 KILLME_MAX_SESSIONS_EXCEEDED,
85 KILLME_ADMIN_TERMINATE,
86 KILLME_SELECT_INTERRUPTED,
89 KILLME_SIMULATION_WORKER,
92 KILLME_READSTRING_FAILED,
101 #define CS_STEALTH 1 // stealth mode
102 #define CS_CHAT 2 // chat mode
103 #define CS_POSTING 4 // posting
105 extern int ScheduledShutdown;
106 extern uid_t ctdluid;
107 extern int sanity_diag_mode;
109 struct ExpressMessage {
110 struct ExpressMessage *next;
111 time_t timestamp; // When this message was sent
112 unsigned flags; // Special instructions
113 char sender[256]; // Name of sending user
114 char sender_email[256]; // Email or JID of sending user
115 char *text; // Message text (if applicable)
118 #define EM_BROADCAST 1 // Broadcast message
119 #define EM_GO_AWAY 2 // Server requests client log off
120 #define EM_CHAT 4 // Server requests client enter chat
122 // Various things we need to lock and unlock
147 // message transfer formats
149 MT_CITADEL, // Citadel proprietary
151 MT_MIME, // MIME-formatted message
152 MT_DOWNLOAD, // Download a component
153 MT_SPEW_SECTION // Download a component in a single operation
156 // Message format types in the database
157 #define FMT_CITADEL 0 // Citadel vari-format (proprietary)
158 #define FMT_FIXED 1 // Fixed format (proprietary)
159 #define FMT_RFC822 4 // Standard (headers are in M field)
162 // citadel database tables (define one for each cdb we need to open)
164 CDB_MSGMAIN, // message base
165 CDB_USERS, // user file
166 CDB_ROOMS, // room index
167 CDB_FLOORTAB, // floor index
168 CDB_MSGLISTS, // room message lists
169 CDB_VISIT, // user/room relationships
170 CDB_DIRECTORY, // address book directory
171 CDB_USETABLE, // network use table
172 CDB_BIGMSGS, // larger message bodies
173 CDB_FULLTEXT, // full text search index
174 CDB_EUIDINDEX, // locate msgs by EUID
175 CDB_USERSBYNUMBER, // index of users by number
176 CDB_EXTAUTH, // associates OpenIDs with users
177 CDB_CONFIG, // system configuration database
178 MAXCDB // total number of CDB's defined
187 // Event types for hooks
189 EVT_STOP, // Session is terminating
190 EVT_START, // Session is starting
191 EVT_LOGIN, // A user is logging in
192 EVT_NEWROOM, // Changing rooms
193 EVT_LOGOUT, // A user is logging out
194 EVT_SETPASS, // Setting or changing password
195 EVT_CMD, // Called after each server command
196 EVT_RWHO, // An RWHO command is being executed
197 EVT_ASYNC, // Doing asynchronous messages
198 EVT_STEALTH, // Entering stealth mode
199 EVT_UNSTEALTH, // Exiting stealth mode
200 EVT_TIMER, // Timer events are called once per minute and are not tied to any session
201 EVT_HOUSE, // as needed houskeeping stuff
202 EVT_SHUTDOWN, // Server is shutting down
203 EVT_PURGEUSER, // Deleting a user
204 EVT_NEWUSER, // Creating a user
207 EVT_SMTPSCAN, // called before submitting a msg from SMTP
208 EVT_AFTERUSRMBOXSAVE // called afte a message was saved into a users inbox
212 /* Priority levels for paging functions (lower is better) */
214 XMSG_PRI_LOCAL, // Other users on -this- server
215 XMSG_PRI_REMOTE, // Other users on a Citadel network
216 XMSG_PRI_FOREIGN, // Contacts on foreign instant message hosts
221 // Defines the relationship of a user to a particular room
222 typedef struct __visit {
227 unsigned int v_flags;
229 char v_answered[SIZ];
233 #define V_FORGET 1 // User has zapped this room
234 #define V_LOCKOUT 2 // User is locked out of this room
235 #define V_ACCESS 4 // Access is granted to this room
238 // Supplementary data for a message on disk
239 // These are kept separate from the message itself for one of two reasons:
240 // 1. Either their values may change at some point after initial save, or
241 // 2. They are merely caches of data which exist somewhere else, for speed.
242 // DO NOT PUT BIG DATA IN HERE ... we need this struct to be tiny for lots of quick r/w
244 long meta_msgnum; // Message number in *local* message base
245 int meta_refcount; // Number of rooms pointing to this msg
246 char meta_content_type[64]; // Cached MIME content-type
247 long meta_rfc822_length; // Cache of RFC822-translated msg length
251 // Calls to AdjRefCount() are queued and deferred, so the user doesn't
252 // have to wait for various disk-intensive operations to complete synchronously.
253 // This is the record format.
255 long arcq_msgnum; // Message number being adjusted
256 int arcq_delta; // Adjustment ( usually 1 or -1 )
260 // Serialization routines use this struct to return a pointer and a length
267 // The S_USETABLE database is used in several modules now, so we define its format here.
274 // These one-byte field headers are found in the Citadel message store.
275 typedef enum _MsgField {
301 typedef struct ctdluser ctdluser;
302 struct ctdluser { // User record
303 int version; // Citadel version which created this record
304 uid_t uid; // Associate with a unix account?
305 char password[32]; // password
306 unsigned flags; // See US_ flags below
307 long timescalled; // Total number of logins
308 long posted; // Number of messages ever submitted
309 cit_uint8_t axlevel; // Access level
310 long usernum; // User number (never recycled)
311 time_t lastcall; // Date/time of most recent login
312 int USuserpurge; // Purge time (in days) for user
313 char fullname[64]; // Display name (primary identifier)
314 long msgnum_bio; // msgnum of user's profile (bio)
315 long msgnum_pic; // msgnum of user's avatar (photo)
316 char emailaddrs[512]; // Internet email addresses
317 long msgnum_inboxrules; // msgnum of user's inbox filtering rules
318 long lastproc_inboxrules; // msgnum of last message filtered