1 /* $OpenBSD: smtpd-api.h,v 1.36 2018/12/23 16:06:24 gilles Exp $ */ 2 3 /* 4 * Copyright (c) 2013 Eric Faurot <eric@openbsd.org> 5 * Copyright (c) 2011 Gilles Chehade <gilles@poolp.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _SMTPD_API_H_ 21 #define _SMTPD_API_H_ 22 23 #include "dict.h" 24 #include "tree.h" 25 26 struct mailaddr { 27 char user[SMTPD_MAXLOCALPARTSIZE]; 28 char domain[SMTPD_MAXDOMAINPARTSIZE]; 29 }; 30 31 #define PROC_QUEUE_API_VERSION 2 32 33 enum { 34 PROC_QUEUE_OK, 35 PROC_QUEUE_FAIL, 36 PROC_QUEUE_INIT, 37 PROC_QUEUE_CLOSE, 38 PROC_QUEUE_MESSAGE_CREATE, 39 PROC_QUEUE_MESSAGE_DELETE, 40 PROC_QUEUE_MESSAGE_COMMIT, 41 PROC_QUEUE_MESSAGE_FD_R, 42 PROC_QUEUE_ENVELOPE_CREATE, 43 PROC_QUEUE_ENVELOPE_DELETE, 44 PROC_QUEUE_ENVELOPE_LOAD, 45 PROC_QUEUE_ENVELOPE_UPDATE, 46 PROC_QUEUE_ENVELOPE_WALK, 47 }; 48 49 #define PROC_SCHEDULER_API_VERSION 2 50 51 struct scheduler_info; 52 53 enum { 54 PROC_SCHEDULER_OK, 55 PROC_SCHEDULER_FAIL, 56 PROC_SCHEDULER_INIT, 57 PROC_SCHEDULER_INSERT, 58 PROC_SCHEDULER_COMMIT, 59 PROC_SCHEDULER_ROLLBACK, 60 PROC_SCHEDULER_UPDATE, 61 PROC_SCHEDULER_DELETE, 62 PROC_SCHEDULER_HOLD, 63 PROC_SCHEDULER_RELEASE, 64 PROC_SCHEDULER_BATCH, 65 PROC_SCHEDULER_MESSAGES, 66 PROC_SCHEDULER_ENVELOPES, 67 PROC_SCHEDULER_SCHEDULE, 68 PROC_SCHEDULER_REMOVE, 69 PROC_SCHEDULER_SUSPEND, 70 PROC_SCHEDULER_RESUME, 71 }; 72 73 enum envelope_flags { 74 EF_AUTHENTICATED = 0x01, 75 EF_BOUNCE = 0x02, 76 EF_INTERNAL = 0x04, /* Internal expansion forward */ 77 78 /* runstate, not saved on disk */ 79 80 EF_PENDING = 0x10, 81 EF_INFLIGHT = 0x20, 82 EF_SUSPEND = 0x40, 83 EF_HOLD = 0x80, 84 }; 85 86 struct evpstate { 87 uint64_t evpid; 88 uint16_t flags; 89 uint16_t retry; 90 time_t time; 91 }; 92 93 enum delivery_type { 94 D_MDA, 95 D_MTA, 96 D_BOUNCE, 97 }; 98 99 struct scheduler_info { 100 uint64_t evpid; 101 enum delivery_type type; 102 uint16_t retry; 103 time_t creation; 104 time_t ttl; 105 time_t lasttry; 106 time_t lastbounce; 107 time_t nexttry; 108 }; 109 110 #define SCHED_REMOVE 0x01 111 #define SCHED_EXPIRE 0x02 112 #define SCHED_UPDATE 0x04 113 #define SCHED_BOUNCE 0x08 114 #define SCHED_MDA 0x10 115 #define SCHED_MTA 0x20 116 117 #define PROC_TABLE_API_VERSION 2 118 119 struct table_open_params { 120 uint32_t version; 121 char name[LINE_MAX]; 122 }; 123 124 enum table_service { 125 K_NONE = 0x000, 126 K_ALIAS = 0x001, /* returns struct expand */ 127 K_DOMAIN = 0x002, /* returns struct destination */ 128 K_CREDENTIALS = 0x004, /* returns struct credentials */ 129 K_NETADDR = 0x008, /* returns struct netaddr */ 130 K_USERINFO = 0x010, /* returns struct userinfo */ 131 K_SOURCE = 0x020, /* returns struct source */ 132 K_MAILADDR = 0x040, /* returns struct mailaddr */ 133 K_ADDRNAME = 0x080, /* returns struct addrname */ 134 K_MAILADDRMAP = 0x100, /* returns struct maddrmap */ 135 K_RELAYHOST = 0x200, /* returns struct relayhost */ 136 K_STRING = 0x400, 137 K_REGEX = 0x800, 138 }; 139 #define K_ANY 0xfff 140 141 enum { 142 PROC_TABLE_OK, 143 PROC_TABLE_FAIL, 144 PROC_TABLE_OPEN, 145 PROC_TABLE_CLOSE, 146 PROC_TABLE_UPDATE, 147 PROC_TABLE_CHECK, 148 PROC_TABLE_LOOKUP, 149 PROC_TABLE_FETCH, 150 }; 151 152 enum enhanced_status_code { 153 /* 0.0 */ 154 ESC_OTHER_STATUS = 00, 155 156 /* 1.x */ 157 ESC_OTHER_ADDRESS_STATUS = 10, 158 ESC_BAD_DESTINATION_MAILBOX_ADDRESS = 11, 159 ESC_BAD_DESTINATION_SYSTEM_ADDRESS = 12, 160 ESC_BAD_DESTINATION_MAILBOX_ADDRESS_SYNTAX = 13, 161 ESC_DESTINATION_MAILBOX_ADDRESS_AMBIGUOUS = 14, 162 ESC_DESTINATION_ADDRESS_VALID = 15, 163 ESC_DESTINATION_MAILBOX_HAS_MOVED = 16, 164 ESC_BAD_SENDER_MAILBOX_ADDRESS_SYNTAX = 17, 165 ESC_BAD_SENDER_SYSTEM_ADDRESS = 18, 166 167 /* 2.x */ 168 ESC_OTHER_MAILBOX_STATUS = 20, 169 ESC_MAILBOX_DISABLED = 21, 170 ESC_MAILBOX_FULL = 22, 171 ESC_MESSAGE_LENGTH_TOO_LARGE = 23, 172 ESC_MAILING_LIST_EXPANSION_PROBLEM = 24, 173 174 /* 3.x */ 175 ESC_OTHER_MAIL_SYSTEM_STATUS = 30, 176 ESC_MAIL_SYSTEM_FULL = 31, 177 ESC_SYSTEM_NOT_ACCEPTING_MESSAGES = 32, 178 ESC_SYSTEM_NOT_CAPABLE_OF_SELECTED_FEATURES = 33, 179 ESC_MESSAGE_TOO_BIG_FOR_SYSTEM = 34, 180 ESC_SYSTEM_INCORRECTLY_CONFIGURED = 35, 181 182 /* 4.x */ 183 ESC_OTHER_NETWORK_ROUTING_STATUS = 40, 184 ESC_NO_ANSWER_FROM_HOST = 41, 185 ESC_BAD_CONNECTION = 42, 186 ESC_DIRECTORY_SERVER_FAILURE = 43, 187 ESC_UNABLE_TO_ROUTE = 44, 188 ESC_MAIL_SYSTEM_CONGESTION = 45, 189 ESC_ROUTING_LOOP_DETECTED = 46, 190 ESC_DELIVERY_TIME_EXPIRED = 47, 191 192 /* 5.x */ 193 ESC_INVALID_RECIPIENT = 50, 194 ESC_INVALID_COMMAND = 51, 195 ESC_SYNTAX_ERROR = 52, 196 ESC_TOO_MANY_RECIPIENTS = 53, 197 ESC_INVALID_COMMAND_ARGUMENTS = 54, 198 ESC_WRONG_PROTOCOL_VERSION = 55, 199 200 /* 6.x */ 201 ESC_OTHER_MEDIA_ERROR = 60, 202 ESC_MEDIA_NOT_SUPPORTED = 61, 203 ESC_CONVERSION_REQUIRED_AND_PROHIBITED = 62, 204 ESC_CONVERSION_REQUIRED_BUT_NOT_SUPPORTED = 63, 205 ESC_CONVERSION_WITH_LOSS_PERFORMED = 64, 206 ESC_CONVERSION_FAILED = 65, 207 208 /* 7.x */ 209 ESC_OTHER_SECURITY_STATUS = 70, 210 ESC_DELIVERY_NOT_AUTHORIZED_MESSAGE_REFUSED = 71, 211 ESC_MAILING_LIST_EXPANSION_PROHIBITED = 72, 212 ESC_SECURITY_CONVERSION_REQUIRED_NOT_POSSIBLE = 73, 213 ESC_SECURITY_FEATURES_NOT_SUPPORTED = 74, 214 ESC_CRYPTOGRAPHIC_FAILURE = 75, 215 ESC_CRYPTOGRAPHIC_ALGORITHM_NOT_SUPPORTED = 76, 216 ESC_MESSAGE_INTEGRITY_FAILURE = 77, 217 }; 218 219 enum enhanced_status_class { 220 ESC_STATUS_OK = 2, 221 ESC_STATUS_TEMPFAIL = 4, 222 ESC_STATUS_PERMFAIL = 5, 223 }; 224 225 static inline uint32_t 226 evpid_to_msgid(uint64_t evpid) 227 { 228 return (evpid >> 32); 229 } 230 231 static inline uint64_t 232 msgid_to_evpid(uint32_t msgid) 233 { 234 return ((uint64_t)msgid << 32); 235 } 236 237 238 /* esc.c */ 239 const char *esc_code(enum enhanced_status_class, enum enhanced_status_code); 240 const char *esc_description(enum enhanced_status_code); 241 242 243 /* queue */ 244 void queue_api_on_close(int(*)(void)); 245 void queue_api_on_message_create(int(*)(uint32_t *)); 246 void queue_api_on_message_commit(int(*)(uint32_t, const char*)); 247 void queue_api_on_message_delete(int(*)(uint32_t)); 248 void queue_api_on_message_fd_r(int(*)(uint32_t)); 249 void queue_api_on_envelope_create(int(*)(uint32_t, const char *, size_t, uint64_t *)); 250 void queue_api_on_envelope_delete(int(*)(uint64_t)); 251 void queue_api_on_envelope_update(int(*)(uint64_t, const char *, size_t)); 252 void queue_api_on_envelope_load(int(*)(uint64_t, char *, size_t)); 253 void queue_api_on_envelope_walk(int(*)(uint64_t *, char *, size_t)); 254 void queue_api_on_message_walk(int(*)(uint64_t *, char *, size_t, 255 uint32_t, int *, void **)); 256 void queue_api_no_chroot(void); 257 void queue_api_set_chroot(const char *); 258 void queue_api_set_user(const char *); 259 int queue_api_dispatch(void); 260 261 /* scheduler */ 262 void scheduler_api_on_init(int(*)(void)); 263 void scheduler_api_on_insert(int(*)(struct scheduler_info *)); 264 void scheduler_api_on_commit(size_t(*)(uint32_t)); 265 void scheduler_api_on_rollback(size_t(*)(uint32_t)); 266 void scheduler_api_on_update(int(*)(struct scheduler_info *)); 267 void scheduler_api_on_delete(int(*)(uint64_t)); 268 void scheduler_api_on_hold(int(*)(uint64_t, uint64_t)); 269 void scheduler_api_on_release(int(*)(int, uint64_t, int)); 270 void scheduler_api_on_batch(int(*)(int, int *, size_t *, uint64_t *, int *)); 271 void scheduler_api_on_messages(size_t(*)(uint32_t, uint32_t *, size_t)); 272 void scheduler_api_on_envelopes(size_t(*)(uint64_t, struct evpstate *, size_t)); 273 void scheduler_api_on_schedule(int(*)(uint64_t)); 274 void scheduler_api_on_remove(int(*)(uint64_t)); 275 void scheduler_api_on_suspend(int(*)(uint64_t)); 276 void scheduler_api_on_resume(int(*)(uint64_t)); 277 void scheduler_api_no_chroot(void); 278 void scheduler_api_set_chroot(const char *); 279 void scheduler_api_set_user(const char *); 280 int scheduler_api_dispatch(void); 281 282 /* table */ 283 void table_api_on_update(int(*)(void)); 284 void table_api_on_check(int(*)(int, struct dict *, const char *)); 285 void table_api_on_lookup(int(*)(int, struct dict *, const char *, char *, size_t)); 286 void table_api_on_fetch(int(*)(int, struct dict *, char *, size_t)); 287 int table_api_dispatch(void); 288 const char *table_api_get_name(void); 289 290 #endif 291