1 // Preprocessor definitions 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.
7 // The program is distributed without any warranty, expressed or implied.
10 #define CITADEL_DEFS_H
12 // Suppress these compiler warnings
13 #pragma GCC diagnostic ignored "-Wcast-qual"
14 #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
15 #pragma GCC diagnostic ignored "-Wformat-truncation"
16 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
20 #include "sysconfig.h"
24 #define REV_LEVEL 972 // This version
25 #define REV_MIN 591 // Oldest compatible database
26 #define EXPORT_REV_MIN 931 // Oldest compatible export files
27 #define LIBCITADEL_MIN 951 // Minimum required version of libcitadel
28 #define SERVER_TYPE 0 // zero for stock Citadel; other developers please obtain SERVER_TYPE codes for your implementations
30 #define TRACE syslog(LOG_DEBUG, "\033[7m Checkpoint: %s : %d \033[0m", __FILE__, __LINE__)
33 #define LONG_MAX 2147483647L
36 // hats off to https://stackoverflow.com/questions/5459868/concatenate-int-to-string-using-c-preprocessor
37 #define STR_HELPER(x) #x
38 #define STR(x) STR_HELPER(x)
39 #define CITADEL "Citadel Server " STR(REV_LEVEL)
41 #ifdef LIBCITADEL_VERSION_NUMBER
42 #if LIBCITADEL_VERSION_NUMBER < LIBCITADEL_MIN
43 #error libcitadel is too old. Please upgrade it before continuing.
47 // This is the user name and password for the default administrator account
48 // that is created when Citadel Server is started with an empty database.
49 #define DEFAULT_ADMIN_USERNAME "admin"
50 #define DEFAULT_ADMIN_PASSWORD "citadel"
52 // Various length constants
53 #define ROOMNAMELEN 128 // The size of a roomname string
54 #define USERNAME_SIZE 64 // The size of a username string
56 // Bits which may appear in MMflags.
57 #define MM_VALID 4 // New users need validating
60 #define MES_NORMAL 65 // Normal message
61 #define MES_ANONONLY 66 // "****" header
62 #define MES_ANONOPT 67 // "Anonymous" header
64 // Values used internally for function call returns, etc.
65 #define NEWREGISTER 0 // new user to register
66 #define REREGISTER 1 // existing user reregistering
68 // number of items which may be handled by the CONF command
69 #define NUM_CONFIGS 71
71 // Authentication modes
72 #define AUTHMODE_NATIVE 0 // Native (self-contained or "black box")
73 #define AUTHMODE_HOST 1 // Authenticate against the host OS user database
74 #define AUTHMODE_LDAP 2 // Authenticate using LDAP server with POSIX schema
75 #define AUTHMODE_LDAP_AD 3 // Authenticate using LDAP server with Active Directory schema
77 // Found in struct CtdlMessage
78 #define CTDLMESSAGE_MAGIC 0x159d
79 #define CM_SKIP_HOOKS 0x01 // Don't run server-side handlers
82 #define F_INUSE 1 // floor is in use
84 // Found in struct expirepolicy
85 #define EXPIRE_NEXTLEVEL 0 // Inherit expiration policy
86 #define EXPIRE_MANUAL 1 // Don't expire messages at all
87 #define EXPIRE_NUMMSGS 2 // Keep only latest n messages
88 #define EXPIRE_AGE 3 // Expire messages after n days
90 #define RECPTYPES_MAGIC 0xfeeb
92 #define CTDLEXIT_SHUTDOWN 0 // Normal shutdown; do NOT auto-restart
94 // Exit codes 101 through 109 are used for conditions in which
95 // we deliberately do NOT want the service to automatically
97 #define CTDLEXIT_CONFIG 101 // Could not read system configuration
98 #define CTDLEXIT_HOME 103 // Citadel home directory not found
99 #define CTDLEXIT_DB 105 // Unable to initialize database
100 #define CTDLEXIT_LIBCITADEL 106 // Incorrect version of libcitadel
101 #define CTDL_EXIT_UNSUP_AUTH 107 // Unsupported auth mode configured
102 #define CTDLEXIT_UNUSER 108 // Could not determine uid to run as
103 #define CTDLEXIT_CRYPTO 109 // Problem initializing SSL or TLS
104 // Any other exit is likely to be from an unexpected abort (segfault etc)
105 // and we want to try restarting.
108 // Reasons why a session would be terminated (set CC->kill_me to these values)
112 KILLME_CLIENT_LOGGED_OUT,
114 KILLME_CLIENT_DISCONNECTED,
116 KILLME_SERVER_SHUTTING_DOWN,
117 KILLME_MAX_SESSIONS_EXCEEDED,
118 KILLME_ADMIN_TERMINATE,
119 KILLME_SELECT_INTERRUPTED,
120 KILLME_SELECT_FAILED,
122 KILLME_SIMULATION_WORKER,
125 KILLME_READSTRING_FAILED,
126 KILLME_MALLOC_FAILED,
134 // Flags that may appear in the "who is online" list
135 #define CS_STEALTH 1 // stealth mode
136 #define CS_CHAT 2 // chat mode
137 #define CS_POSTING 4 // posting
140 // Flags that may appear in an instant message
141 #define EM_BROADCAST 1 // Broadcast message
142 #define EM_GO_AWAY 2 // Server requests client log off
143 #define EM_CHAT 4 // Server requests client enter chat
146 // Various things we need to lock and unlock
171 // message transfer formats
173 MT_CITADEL, // Citadel proprietary
175 MT_MIME, // MIME-formatted message
176 MT_DOWNLOAD, // Download a component
177 MT_SPEW_SECTION // Download a component in a single operation
181 // Message format types in the database
182 #define FMT_CITADEL 0 // Citadel vari-format (proprietary)
183 #define FMT_FIXED 1 // Fixed format (proprietary)
184 #define FMT_RFC822 4 // Standard (headers are in M field)
187 // citadel database tables (define one for each cdb we need to open)
189 CDB_MSGMAIN, // message base
190 CDB_USERS, // user file
191 CDB_ROOMS, // room index
192 CDB_FLOORTAB, // floor index
193 CDB_MSGLISTS, // room message lists
194 CDB_VISIT, // user/room relationships
195 CDB_DIRECTORY, // address book directory
196 CDB_USETABLE, // network use table
197 CDB_BIGMSGS, // larger message bodies
198 CDB_FULLTEXT, // full text search index
199 CDB_EUIDINDEX, // locate msgs by EUID
200 CDB_USERSBYNUMBER, // index of users by number
201 CDB_EXTAUTH, // associates OpenIDs with users
202 CDB_CONFIG, // system configuration database
203 MAXCDB // total number of CDB's defined
207 // Event types for hooks
209 EVT_STOP, // Session is terminating
210 EVT_START, // Session is starting
211 EVT_LOGIN, // A user is logging in
212 EVT_NEWROOM, // Changing rooms
213 EVT_LOGOUT, // A user is logging out
214 EVT_SETPASS, // Setting or changing password
215 EVT_CMD, // Called after each server command
216 EVT_RWHO, // An RWHO command is being executed
217 EVT_ASYNC, // Doing asynchronous messages
218 EVT_STEALTH, // Entering stealth mode
219 EVT_UNSTEALTH, // Exiting stealth mode
220 EVT_TIMER, // Timer events are called once per minute and are not tied to any session
221 EVT_HOUSE, // as needed houskeeping stuff
222 EVT_SHUTDOWN, // Server is shutting down
223 EVT_PURGEUSER, // Deleting a user
224 EVT_NEWUSER, // Creating a user
227 EVT_SMTPSCAN, // called before submitting a msg from SMTP
228 EVT_AFTERUSRMBOXSAVE // called afte a message was saved into a users inbox
232 // Priority levels for paging functions (lower is better)
234 XMSG_PRI_LOCAL, // Other users on -this- server
235 XMSG_PRI_REMOTE, // Other users on a Citadel network
236 XMSG_PRI_FOREIGN, // Contacts on foreign instant message hosts
241 // Flags that may appear in a 'struct visit'
242 #define V_FORGET 1 // User has zapped this room
243 #define V_LOCKOUT 2 // User is locked out of this room
244 #define V_ACCESS 4 // Access is granted to this room
247 // These one-byte field headers are found in the Citadel message store.
248 typedef enum _MsgField {
273 // Private rooms are always flagged with QR_PRIVATE. If neither QR_PASSWORDED
274 // or QR_GUESSNAME is set, then it is invitation-only. Passworded rooms are
275 // flagged with both QR_PRIVATE and QR_PASSWORDED while guess-name rooms are
276 // flagged with both QR_PRIVATE and QR_GUESSNAME. NEVER set all three flags.
279 #endif // CITADEL_DEFS_H