smtpd.h revision 1.438
1/* $OpenBSD: smtpd.h,v 1.438 2013/11/30 10:11:57 eric Exp $ */ 2 3/* 4 * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org> 5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> 6 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21#ifndef nitems 22#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 23#endif 24 25#include "smtpd-defines.h" 26#include "smtpd-api.h" 27#include "ioev.h" 28#include "iobuf.h" 29 30#define CONF_FILE "/etc/mail/smtpd.conf" 31#define MAILNAME_FILE "/etc/mail/mailname" 32#define CA_FILE "/etc/ssl/cert.pem" 33 34#define PROC_COUNT 10 35 36#define MAX_HOPS_COUNT 100 37#define DEFAULT_MAX_BODY_SIZE (35*1024*1024) 38#define MAX_TAG_SIZE 32 39#define MAX_FILTER_NAME 32 40 41#define EXPAND_BUFFER 1024 42 43#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 44#define SMTPD_USER "_smtpd" 45#define SMTPD_QUEUE_USER "_smtpq" 46#define SMTPD_SOCKET "/var/run/smtpd.sock" 47#ifndef SMTPD_NAME 48#define SMTPD_NAME "OpenSMTPD" 49#endif 50#define SMTPD_VERSION "5.4" 51#define SMTPD_BANNER "220 %s ESMTP %s" 52#define SMTPD_SESSION_TIMEOUT 300 53#define SMTPD_BACKLOG 5 54 55#define PATH_SMTPCTL "/usr/sbin/smtpctl" 56 57#define PATH_CHROOT "/var/empty" 58#define PATH_SPOOL "/var/spool/smtpd" 59#define PATH_OFFLINE "/offline" 60#define PATH_PURGE "/purge" 61#define PATH_TEMPORARY "/temporary" 62 63#define PATH_FILTERS "/usr/libexec/smtpd" 64#define PATH_TABLES "/usr/libexec/smtpd" 65 66#define F_STARTTLS 0x01 67#define F_SMTPS 0x02 68#define F_TLS_OPTIONAL 0x04 69#define F_SSL (F_STARTTLS | F_SMTPS) 70#define F_AUTH 0x08 71#define F_BACKUP 0x10 /* XXX - MUST BE SYNC-ED WITH RELAY_BACKUP */ 72#define F_STARTTLS_REQUIRE 0x20 73#define F_AUTH_REQUIRE 0x40 74#define F_LMTP 0x80 75#define F_MASK_SOURCE 0x100 76#define F_TLS_VERIFY 0x200 77 78/* must match F_* for mta */ 79#define RELAY_STARTTLS 0x01 80#define RELAY_SMTPS 0x02 81#define RELAY_TLS_OPTIONAL 0x04 82#define RELAY_SSL (RELAY_STARTTLS | RELAY_SMTPS) 83#define RELAY_AUTH 0x08 84#define RELAY_BACKUP 0x10 /* XXX - MUST BE SYNC-ED WITH F_BACKUP */ 85#define RELAY_MX 0x20 86#define RELAY_LMTP 0x80 87#define RELAY_TLS_VERIFY 0x200 88 89struct userinfo { 90 char username[SMTPD_MAXLOGNAME]; 91 char directory[SMTPD_MAXPATHLEN]; 92 uid_t uid; 93 gid_t gid; 94}; 95 96struct netaddr { 97 struct sockaddr_storage ss; 98 int bits; 99}; 100 101struct relayhost { 102 uint16_t flags; 103 char hostname[SMTPD_MAXHOSTNAMELEN]; 104 uint16_t port; 105 char cert[SMTPD_MAXPATHLEN]; 106 char authtable[SMTPD_MAXPATHLEN]; 107 char authlabel[SMTPD_MAXPATHLEN]; 108 char sourcetable[SMTPD_MAXPATHLEN]; 109 char heloname[SMTPD_MAXHOSTNAMELEN]; 110 char helotable[SMTPD_MAXPATHLEN]; 111}; 112 113struct credentials { 114 char username[SMTPD_MAXLINESIZE]; 115 char password[SMTPD_MAXLINESIZE]; 116}; 117 118struct destination { 119 char name[SMTPD_MAXHOSTNAMELEN]; 120}; 121 122struct source { 123 struct sockaddr_storage addr; 124}; 125 126struct addrname { 127 struct sockaddr_storage addr; 128 char name[SMTPD_MAXHOSTNAMELEN]; 129}; 130 131union lookup { 132 struct expand *expand; 133 struct credentials creds; 134 struct netaddr netaddr; 135 struct source source; 136 struct destination domain; 137 struct userinfo userinfo; 138 struct mailaddr mailaddr; 139 struct addrname addrname; 140}; 141 142/* 143 * Bump IMSG_VERSION whenever a change is made to enum imsg_type. 144 * This will ensure that we can never use a wrong version of smtpctl with smtpd. 145 */ 146#define IMSG_VERSION 7 147 148enum imsg_type { 149 IMSG_NONE, 150 IMSG_CTL_OK, /* answer to smtpctl requests */ 151 IMSG_CTL_FAIL, 152 IMSG_CTL_SHUTDOWN, 153 IMSG_CTL_VERBOSE, 154 IMSG_CTL_PAUSE_EVP, 155 IMSG_CTL_PAUSE_MDA, 156 IMSG_CTL_PAUSE_MTA, 157 IMSG_CTL_PAUSE_SMTP, 158 IMSG_CTL_RESUME_EVP, 159 IMSG_CTL_RESUME_MDA, 160 IMSG_CTL_RESUME_MTA, 161 IMSG_CTL_RESUME_SMTP, 162 IMSG_CTL_RESUME_ROUTE, 163 IMSG_CTL_LIST_MESSAGES, 164 IMSG_CTL_LIST_ENVELOPES, 165 IMSG_CTL_REMOVE, 166 IMSG_CTL_SCHEDULE, 167 168 IMSG_CTL_TRACE, 169 IMSG_CTL_UNTRACE, 170 IMSG_CTL_PROFILE, 171 IMSG_CTL_UNPROFILE, 172 173 IMSG_CTL_MTA_SHOW_HOSTS, 174 IMSG_CTL_MTA_SHOW_RELAYS, 175 IMSG_CTL_MTA_SHOW_ROUTES, 176 IMSG_CTL_MTA_SHOW_HOSTSTATS, 177 178 IMSG_CONF_START, 179 IMSG_CONF_SSL, 180 IMSG_CONF_LISTENER, 181 IMSG_CONF_TABLE, 182 IMSG_CONF_TABLE_CONTENT, 183 IMSG_CONF_RULE, 184 IMSG_CONF_RULE_SOURCE, 185 IMSG_CONF_RULE_SENDER, 186 IMSG_CONF_RULE_DESTINATION, 187 IMSG_CONF_RULE_RECIPIENT, 188 IMSG_CONF_RULE_MAPPING, 189 IMSG_CONF_RULE_USERS, 190 IMSG_CONF_FILTER, 191 IMSG_CONF_END, 192 193 IMSG_LKA_UPDATE_TABLE, 194 IMSG_LKA_EXPAND_RCPT, 195 IMSG_LKA_SECRET, 196 IMSG_LKA_SOURCE, 197 IMSG_LKA_HELO, 198 IMSG_LKA_USERINFO, 199 IMSG_LKA_AUTHENTICATE, 200 IMSG_LKA_SSL_INIT, 201 IMSG_LKA_SSL_VERIFY_CERT, 202 IMSG_LKA_SSL_VERIFY_CHAIN, 203 IMSG_LKA_SSL_VERIFY, 204 205 IMSG_DELIVERY_OK, 206 IMSG_DELIVERY_TEMPFAIL, 207 IMSG_DELIVERY_PERMFAIL, 208 IMSG_DELIVERY_LOOP, 209 IMSG_DELIVERY_HOLD, 210 IMSG_DELIVERY_RELEASE, 211 212 IMSG_BOUNCE_INJECT, 213 214 IMSG_MDA_DELIVER, 215 IMSG_MDA_DONE, 216 217 IMSG_MFA_REQ_CONNECT, 218 IMSG_MFA_REQ_HELO, 219 IMSG_MFA_REQ_MAIL, 220 IMSG_MFA_REQ_RCPT, 221 IMSG_MFA_REQ_DATA, 222 IMSG_MFA_REQ_EOM, 223 IMSG_MFA_EVENT_RSET, 224 IMSG_MFA_EVENT_COMMIT, 225 IMSG_MFA_EVENT_ROLLBACK, 226 IMSG_MFA_EVENT_DISCONNECT, 227 IMSG_MFA_SMTP_RESPONSE, 228 229 IMSG_MTA_TRANSFER, 230 IMSG_MTA_SCHEDULE, 231 232 IMSG_QUEUE_CREATE_MESSAGE, 233 IMSG_QUEUE_SUBMIT_ENVELOPE, 234 IMSG_QUEUE_COMMIT_ENVELOPES, 235 IMSG_QUEUE_REMOVE_MESSAGE, 236 IMSG_QUEUE_COMMIT_MESSAGE, 237 IMSG_QUEUE_MESSAGE_FD, 238 IMSG_QUEUE_MESSAGE_FILE, 239 IMSG_QUEUE_REMOVE, 240 IMSG_QUEUE_EXPIRE, 241 IMSG_QUEUE_BOUNCE, 242 243 IMSG_PARENT_FORWARD_OPEN, 244 IMSG_PARENT_FORK_MDA, 245 IMSG_PARENT_KILL_MDA, 246 247 IMSG_SMTP_ENQUEUE_FD, 248 249 IMSG_DNS_HOST, 250 IMSG_DNS_HOST_END, 251 IMSG_DNS_PTR, 252 IMSG_DNS_MX, 253 IMSG_DNS_MX_PREFERENCE, 254 255 IMSG_STAT_INCREMENT, 256 IMSG_STAT_DECREMENT, 257 IMSG_STAT_SET, 258 259 IMSG_DIGEST, 260 IMSG_STATS, 261 IMSG_STATS_GET, 262}; 263 264enum blockmodes { 265 BM_NORMAL, 266 BM_NONBLOCK 267}; 268 269enum smtp_proc_type { 270 PROC_PARENT = 0, 271 PROC_SMTP, 272 PROC_MFA, 273 PROC_LKA, 274 PROC_QUEUE, 275 PROC_MDA, 276 PROC_MTA, 277 PROC_CONTROL, 278 PROC_SCHEDULER, 279 280 PROC_FILTER, 281 PROC_CLIENT, 282}; 283 284enum table_type { 285 T_NONE = 0, 286 T_DYNAMIC = 0x01, /* table with external source */ 287 T_LIST = 0x02, /* table holding a list */ 288 T_HASH = 0x04, /* table holding a hash table */ 289}; 290 291struct table { 292 char t_name[SMTPD_MAXLINESIZE]; 293 enum table_type t_type; 294 char t_config[SMTPD_MAXPATHLEN]; 295 296 struct dict t_dict; 297 298 void *t_handle; 299 struct table_backend *t_backend; 300 void *t_iter; 301}; 302 303struct table_backend { 304 const unsigned int services; 305 int (*config)(struct table *); 306 void *(*open)(struct table *); 307 int (*update)(struct table *); 308 void (*close)(void *); 309 int (*lookup)(void *, const char *, enum table_service, union lookup *); 310 int (*fetch)(void *, enum table_service, union lookup *); 311}; 312 313 314enum dest_type { 315 DEST_DOM, 316 DEST_VDOM 317}; 318 319enum action_type { 320 A_NONE, 321 A_RELAY, 322 A_RELAYVIA, 323 A_MAILDIR, 324 A_MBOX, 325 A_FILENAME, 326 A_MDA, 327 A_LMTP 328}; 329 330enum decision { 331 R_REJECT, 332 R_ACCEPT 333}; 334 335struct rule { 336 TAILQ_ENTRY(rule) r_entry; 337 enum decision r_decision; 338 uint8_t r_nottag; 339 char r_tag[MAX_TAG_SIZE]; 340 341 uint8_t r_notsources; 342 struct table *r_sources; 343 344 uint8_t r_notsenders; 345 struct table *r_senders; 346 347 uint8_t r_notrecipients; 348 struct table *r_recipients; 349 350 uint8_t r_notdestination; 351 enum dest_type r_desttype; 352 struct table *r_destination; 353 354 enum action_type r_action; 355 union rule_dest { 356 char buffer[EXPAND_BUFFER]; 357 struct relayhost relayhost; 358 } r_value; 359 360 struct mailaddr *r_as; 361 struct table *r_mapping; 362 struct table *r_userbase; 363 time_t r_qexpire; 364 uint8_t r_forwardonly; 365}; 366 367struct delivery_mda { 368 enum action_type method; 369 char usertable[SMTPD_MAXPATHLEN]; 370 char username[SMTPD_MAXLOGNAME]; 371 char buffer[EXPAND_BUFFER]; 372}; 373 374struct delivery_mta { 375 struct relayhost relay; 376}; 377 378enum bounce_type { 379 B_ERROR, 380 B_WARNING, 381}; 382 383struct delivery_bounce { 384 enum bounce_type type; 385 time_t delay; 386 time_t expire; 387}; 388 389enum expand_type { 390 EXPAND_INVALID, 391 EXPAND_USERNAME, 392 EXPAND_FILENAME, 393 EXPAND_FILTER, 394 EXPAND_INCLUDE, 395 EXPAND_ADDRESS, 396 EXPAND_ERROR 397}; 398 399struct expandnode { 400 RB_ENTRY(expandnode) entry; 401 TAILQ_ENTRY(expandnode) tq_entry; 402 enum expand_type type; 403 int sameuser; 404 int alias; 405 struct rule *rule; 406 struct expandnode *parent; 407 unsigned int depth; 408 struct table *mapping; 409 struct table *userbase; 410 union { 411 /* 412 * user field handles both expansion user and system user 413 * so we MUST make it large enough to fit a mailaddr user 414 */ 415 char user[SMTPD_MAXLOCALPARTSIZE]; 416 char buffer[EXPAND_BUFFER]; 417 struct mailaddr mailaddr; 418 } u; 419}; 420 421struct expand { 422 RB_HEAD(expandtree, expandnode) tree; 423 TAILQ_HEAD(xnodes, expandnode) *queue; 424 int alias; 425 size_t nb_nodes; 426 struct rule *rule; 427 struct expandnode *parent; 428}; 429 430#define SMTPD_ENVELOPE_VERSION 2 431struct envelope { 432 TAILQ_ENTRY(envelope) entry; 433 434 char tag[MAX_TAG_SIZE]; 435 436 uint32_t version; 437 uint64_t id; 438 enum envelope_flags flags; 439 440 char smtpname[SMTPD_MAXHOSTNAMELEN]; 441 char helo[SMTPD_MAXHOSTNAMELEN]; 442 char hostname[SMTPD_MAXHOSTNAMELEN]; 443 char errorline[SMTPD_MAXLINESIZE]; 444 struct sockaddr_storage ss; 445 446 struct mailaddr sender; 447 struct mailaddr rcpt; 448 struct mailaddr dest; 449 450 enum delivery_type type; 451 union { 452 struct delivery_mda mda; 453 struct delivery_mta mta; 454 struct delivery_bounce bounce; 455 } agent; 456 457 uint16_t retry; 458 time_t creation; 459 time_t expire; 460 time_t lasttry; 461 time_t nexttry; 462 time_t lastbounce; 463}; 464 465struct listener { 466 uint16_t flags; 467 int fd; 468 struct sockaddr_storage ss; 469 in_port_t port; 470 struct timeval timeout; 471 struct event ev; 472 char ssl_cert_name[SMTPD_MAXPATHLEN]; 473 struct ssl *ssl; 474 void *ssl_ctx; 475 char tag[MAX_TAG_SIZE]; 476 char authtable[SMTPD_MAXLINESIZE]; 477 char hostname[SMTPD_MAXHOSTNAMELEN]; 478 char hostnametable[SMTPD_MAXPATHLEN]; 479 TAILQ_ENTRY(listener) entry; 480}; 481 482struct smtpd { 483 char sc_conffile[SMTPD_MAXPATHLEN]; 484 size_t sc_maxsize; 485 486#define SMTPD_OPT_VERBOSE 0x00000001 487#define SMTPD_OPT_NOACTION 0x00000002 488 uint32_t sc_opts; 489 490#define SMTPD_CONFIGURING 0x00000001 491#define SMTPD_EXITING 0x00000002 492#define SMTPD_MDA_PAUSED 0x00000004 493#define SMTPD_MTA_PAUSED 0x00000008 494#define SMTPD_SMTP_PAUSED 0x00000010 495#define SMTPD_MDA_BUSY 0x00000020 496#define SMTPD_MTA_BUSY 0x00000040 497#define SMTPD_BOUNCE_BUSY 0x00000080 498#define SMTPD_SMTP_DISABLED 0x00000100 499 uint32_t sc_flags; 500 501#define QUEUE_COMPRESSION 0x00000001 502#define QUEUE_ENCRYPTION 0x00000002 503#define QUEUE_EVPCACHE 0x00000004 504 uint32_t sc_queue_flags; 505 char *sc_queue_key; 506 size_t sc_queue_evpcache_size; 507 508 size_t sc_mda_max_session; 509 size_t sc_mda_max_user_session; 510 size_t sc_mda_task_hiwat; 511 size_t sc_mda_task_lowat; 512 size_t sc_mda_task_release; 513 514 size_t sc_mta_max_deferred; 515 516 size_t sc_scheduler_max_inflight; 517 size_t sc_scheduler_max_evp_batch_size; 518 size_t sc_scheduler_max_msg_batch_size; 519 size_t sc_scheduler_max_schedule; 520 521 int sc_qexpire; 522#define MAX_BOUNCE_WARN 4 523 time_t sc_bounce_warn[MAX_BOUNCE_WARN]; 524 char sc_hostname[SMTPD_MAXHOSTNAMELEN]; 525 struct stat_backend *sc_stat; 526 struct compress_backend *sc_comp; 527 528 time_t sc_uptime; 529 530 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 531 532 TAILQ_HEAD(rulelist, rule) *sc_rules, *sc_rules_reload; 533 534 struct dict *sc_ssl_dict; 535 536 struct dict *sc_tables_dict; /* keyed lookup */ 537 538 struct dict *sc_limits_dict; 539 540 struct dict sc_filters; 541 uint32_t filtermask; 542}; 543 544#define TRACE_DEBUG 0x0001 545#define TRACE_IMSG 0x0002 546#define TRACE_IO 0x0004 547#define TRACE_SMTP 0x0008 548#define TRACE_MFA 0x0010 549#define TRACE_MTA 0x0020 550#define TRACE_BOUNCE 0x0040 551#define TRACE_SCHEDULER 0x0080 552#define TRACE_LOOKUP 0x0100 553#define TRACE_STAT 0x0200 554#define TRACE_RULES 0x0400 555#define TRACE_MPROC 0x0800 556#define TRACE_EXPAND 0x1000 557#define TRACE_TABLES 0x2000 558#define TRACE_QUEUE 0x4000 559 560#define PROFILE_TOSTAT 0x0001 561#define PROFILE_IMSG 0x0002 562#define PROFILE_QUEUE 0x0004 563 564struct forward_req { 565 uint64_t id; 566 uint8_t status; 567 568 char user[SMTPD_MAXLOGNAME]; 569 uid_t uid; 570 gid_t gid; 571 char directory[SMTPD_MAXPATHLEN]; 572}; 573 574struct deliver { 575 char to[SMTPD_MAXPATHLEN]; 576 char from[SMTPD_MAXPATHLEN]; 577 char user[SMTPD_MAXLOGNAME]; 578 short mode; 579 580 struct userinfo userinfo; 581}; 582 583#define MAX_FILTER_PER_CHAIN 16 584struct filter { 585 int chain; 586 int done; 587 char name[MAX_FILTER_NAME]; 588 char path[SMTPD_MAXPATHLEN]; 589 char filters[MAX_FILTER_NAME][MAX_FILTER_PER_CHAIN]; 590}; 591 592struct mta_host { 593 SPLAY_ENTRY(mta_host) entry; 594 struct sockaddr *sa; 595 char *ptrname; 596 int refcount; 597 size_t nconn; 598 time_t lastconn; 599 time_t lastptrquery; 600 601#define HOST_IGNORE 0x01 602 int flags; 603}; 604 605struct mta_mx { 606 TAILQ_ENTRY(mta_mx) entry; 607 struct mta_host *host; 608 int preference; 609}; 610 611struct mta_domain { 612 SPLAY_ENTRY(mta_domain) entry; 613 char *name; 614 int flags; 615 TAILQ_HEAD(, mta_mx) mxs; 616 int mxstatus; 617 int refcount; 618 size_t nconn; 619 time_t lastconn; 620 time_t lastmxquery; 621}; 622 623struct mta_source { 624 SPLAY_ENTRY(mta_source) entry; 625 struct sockaddr *sa; 626 int refcount; 627 size_t nconn; 628 time_t lastconn; 629}; 630 631struct mta_connector { 632 struct mta_source *source; 633 struct mta_relay *relay; 634 635#define CONNECTOR_ERROR_FAMILY 0x0001 636#define CONNECTOR_ERROR_SOURCE 0x0002 637#define CONNECTOR_ERROR_MX 0x0004 638#define CONNECTOR_ERROR_ROUTE_NET 0x0008 639#define CONNECTOR_ERROR_ROUTE_SMTP 0x0010 640#define CONNECTOR_ERROR_ROUTE 0x0018 641#define CONNECTOR_ERROR 0x00ff 642 643#define CONNECTOR_LIMIT_HOST 0x0100 644#define CONNECTOR_LIMIT_ROUTE 0x0200 645#define CONNECTOR_LIMIT_SOURCE 0x0400 646#define CONNECTOR_LIMIT_RELAY 0x0800 647#define CONNECTOR_LIMIT_CONN 0x1000 648#define CONNECTOR_LIMIT_DOMAIN 0x2000 649#define CONNECTOR_LIMIT 0xff00 650 651#define CONNECTOR_NEW 0x10000 652#define CONNECTOR_WAIT 0x20000 653 int flags; 654 655 int refcount; 656 size_t nconn; 657 time_t lastconn; 658}; 659 660struct mta_route { 661 SPLAY_ENTRY(mta_route) entry; 662 uint64_t id; 663 struct mta_source *src; 664 struct mta_host *dst; 665#define ROUTE_NEW 0x01 666#define ROUTE_RUNQ 0x02 667#define ROUTE_KEEPALIVE 0x04 668#define ROUTE_DISABLED 0xf0 669#define ROUTE_DISABLED_NET 0x10 670#define ROUTE_DISABLED_SMTP 0x20 671 int flags; 672 int nerror; 673 int penalty; 674 int refcount; 675 size_t nconn; 676 time_t lastconn; 677 time_t lastdisc; 678 time_t lastpenalty; 679}; 680 681struct mta_limits { 682 size_t maxconn_per_host; 683 size_t maxconn_per_route; 684 size_t maxconn_per_source; 685 size_t maxconn_per_connector; 686 size_t maxconn_per_relay; 687 size_t maxconn_per_domain; 688 689 time_t conndelay_host; 690 time_t conndelay_route; 691 time_t conndelay_source; 692 time_t conndelay_connector; 693 time_t conndelay_relay; 694 time_t conndelay_domain; 695 696 time_t discdelay_route; 697 698 size_t max_mail_per_session; 699 time_t sessdelay_transaction; 700 time_t sessdelay_keepalive; 701 702 int family; 703 704 int task_hiwat; 705 int task_lowat; 706 int task_release; 707}; 708 709struct mta_relay { 710 SPLAY_ENTRY(mta_relay) entry; 711 uint64_t id; 712 713 struct mta_domain *domain; 714 struct mta_limits *limits; 715 int flags; 716 char *backupname; 717 int backuppref; 718 char *sourcetable; 719 uint16_t port; 720 char *cert; 721 char *authtable; 722 char *authlabel; 723 char *helotable; 724 char *heloname; 725 char *secret; 726 727 int state; 728 size_t ntask; 729 TAILQ_HEAD(, mta_task) tasks; 730 731 struct tree connectors; 732 size_t sourceloop; 733 time_t lastsource; 734 time_t nextsource; 735 736 int fail; 737 char *failstr; 738 739#define RELAY_WAIT_MX 0x01 740#define RELAY_WAIT_PREFERENCE 0x02 741#define RELAY_WAIT_SECRET 0x04 742#define RELAY_WAIT_LIMITS 0x08 743#define RELAY_WAIT_SOURCE 0x10 744#define RELAY_WAIT_CONNECTOR 0x20 745#define RELAY_WAITMASK 0x3f 746 int status; 747 748 int refcount; 749 size_t nconn; 750 size_t nconn_ready; 751 time_t lastconn; 752}; 753 754struct mta_envelope { 755 TAILQ_ENTRY(mta_envelope) entry; 756 uint64_t id; 757 uint64_t session; 758 time_t creation; 759 char *dest; 760 char *rcpt; 761 struct mta_task *task; 762 int delivery; 763}; 764 765struct mta_task { 766 TAILQ_ENTRY(mta_task) entry; 767 struct mta_relay *relay; 768 uint32_t msgid; 769 TAILQ_HEAD(, mta_envelope) envelopes; 770 char *sender; 771}; 772 773struct passwd; 774 775struct queue_backend { 776 int (*init)(struct passwd *, int); 777}; 778 779struct compress_backend { 780 size_t (*compress_chunk)(void *, size_t, void *, size_t); 781 size_t (*uncompress_chunk)(void *, size_t, void *, size_t); 782 int (*compress_file)(FILE *, FILE *); 783 int (*uncompress_file)(FILE *, FILE *); 784}; 785 786/* auth structures */ 787enum auth_type { 788 AUTH_BSD, 789 AUTH_PWD, 790}; 791 792struct auth_backend { 793 int (*authenticate)(char *, char *); 794}; 795 796 797/* delivery_backend */ 798struct delivery_backend { 799 int allow_root; 800 void (*open)(struct deliver *); 801}; 802 803struct scheduler_backend { 804 int (*init)(void); 805 806 int (*insert)(struct scheduler_info *); 807 size_t (*commit)(uint32_t); 808 size_t (*rollback)(uint32_t); 809 810 int (*update)(struct scheduler_info *); 811 int (*delete)(uint64_t); 812 int (*hold)(uint64_t, uint64_t); 813 int (*release)(int, uint64_t, int); 814 815 int (*batch)(int, struct scheduler_batch *); 816 817 size_t (*messages)(uint32_t, uint32_t *, size_t); 818 size_t (*envelopes)(uint64_t, struct evpstate *, size_t); 819 int (*schedule)(uint64_t); 820 int (*remove)(uint64_t); 821 int (*suspend)(uint64_t); 822 int (*resume)(uint64_t); 823}; 824 825enum stat_type { 826 STAT_COUNTER, 827 STAT_TIMESTAMP, 828 STAT_TIMEVAL, 829 STAT_TIMESPEC, 830}; 831 832struct stat_value { 833 enum stat_type type; 834 union stat_v { 835 size_t counter; 836 time_t timestamp; 837 struct timeval tv; 838 struct timespec ts; 839 } u; 840}; 841 842#define STAT_KEY_SIZE 1024 843struct stat_kv { 844 void *iter; 845 char key[STAT_KEY_SIZE]; 846 struct stat_value val; 847}; 848 849struct stat_backend { 850 void (*init)(void); 851 void (*close)(void); 852 void (*increment)(const char *, size_t); 853 void (*decrement)(const char *, size_t); 854 void (*set)(const char *, const struct stat_value *); 855 int (*iter)(void **, char **, struct stat_value *); 856}; 857 858struct stat_digest { 859 time_t startup; 860 time_t timestamp; 861 862 size_t clt_connect; 863 size_t clt_disconnect; 864 865 size_t evp_enqueued; 866 size_t evp_dequeued; 867 868 size_t evp_expired; 869 size_t evp_removed; 870 size_t evp_bounce; 871 872 size_t dlv_ok; 873 size_t dlv_permfail; 874 size_t dlv_tempfail; 875 size_t dlv_loop; 876}; 877 878 879struct mproc { 880 pid_t pid; 881 char *name; 882 int proc; 883 void (*handler)(struct mproc *, struct imsg *); 884 struct imsgbuf imsgbuf; 885 886 char *m_buf; 887 size_t m_alloc; 888 size_t m_pos; 889 uint32_t m_type; 890 uint32_t m_peerid; 891 pid_t m_pid; 892 int m_fd; 893 894 int enable; 895 short events; 896 struct event ev; 897 void *data; 898 899 off_t msg_in; 900 off_t msg_out; 901 off_t bytes_in; 902 off_t bytes_out; 903 size_t bytes_queued; 904 size_t bytes_queued_max; 905}; 906 907struct msg { 908 const uint8_t *pos; 909 const uint8_t *end; 910}; 911 912extern enum smtp_proc_type smtpd_process; 913 914extern int verbose; 915extern int profiling; 916 917extern struct mproc *p_control; 918extern struct mproc *p_parent; 919extern struct mproc *p_lka; 920extern struct mproc *p_mda; 921extern struct mproc *p_mfa; 922extern struct mproc *p_mta; 923extern struct mproc *p_queue; 924extern struct mproc *p_scheduler; 925extern struct mproc *p_smtp; 926 927extern struct smtpd *env; 928extern void (*imsg_callback)(struct mproc *, struct imsg *); 929 930struct imsgproc { 931 pid_t pid; 932 struct event ev; 933 struct imsgbuf *ibuf; 934 char *path; 935 char *name; 936 void (*cb)(struct imsg *, void *); 937 void *cb_arg; 938}; 939 940/* inter-process structures */ 941 942struct bounce_req_msg { 943 uint64_t evpid; 944 time_t timestamp; 945 struct delivery_bounce bounce; 946}; 947 948enum mfa_resp_status { 949 MFA_OK, 950 MFA_FAIL, 951 MFA_CLOSE, 952}; 953 954enum dns_error { 955 DNS_OK = 0, 956 DNS_RETRY, 957 DNS_EINVAL, 958 DNS_ENONAME, 959 DNS_ENOTFOUND, 960}; 961 962enum lka_resp_status { 963 LKA_OK, 964 LKA_TEMPFAIL, 965 LKA_PERMFAIL 966}; 967 968enum ca_resp_status { 969 CA_OK, 970 CA_FAIL 971}; 972 973struct ca_cert_req_msg { 974 uint64_t reqid; 975 char name[SMTPD_MAXPATHLEN]; 976}; 977 978struct ca_cert_resp_msg { 979 uint64_t reqid; 980 enum ca_resp_status status; 981 char *cert; 982 off_t cert_len; 983 char *key; 984 off_t key_len; 985}; 986 987struct ca_vrfy_req_msg { 988 uint64_t reqid; 989 char pkiname[SMTPD_MAXHOSTNAMELEN]; 990 unsigned char *cert; 991 off_t cert_len; 992 size_t n_chain; 993 size_t chain_offset; 994 unsigned char **chain_cert; 995 off_t *chain_cert_len; 996}; 997 998struct ca_vrfy_resp_msg { 999 uint64_t reqid; 1000 enum ca_resp_status status; 1001}; 1002 1003 1004/* aliases.c */ 1005int aliases_get(struct expand *, const char *); 1006int aliases_virtual_check(struct table *, const struct mailaddr *); 1007int aliases_virtual_get(struct expand *, const struct mailaddr *); 1008int alias_parse(struct expandnode *, const char *); 1009 1010 1011/* auth.c */ 1012struct auth_backend *auth_backend_lookup(enum auth_type); 1013 1014 1015/* bounce.c */ 1016void bounce_add(uint64_t); 1017void bounce_fd(int); 1018 1019 1020/* ca.c */ 1021int ca_X509_verify(void *, void *, const char *, const char *, const char **); 1022 1023 1024/* compress_backend.c */ 1025struct compress_backend *compress_backend_lookup(const char *); 1026size_t compress_chunk(void *, size_t, void *, size_t); 1027size_t uncompress_chunk(void *, size_t, void *, size_t); 1028int compress_file(FILE *, FILE *); 1029int uncompress_file(FILE *, FILE *); 1030 1031/* config.c */ 1032#define PURGE_LISTENERS 0x01 1033#define PURGE_TABLES 0x02 1034#define PURGE_RULES 0x04 1035#define PURGE_SSL 0x08 1036#define PURGE_EVERYTHING 0xff 1037void purge_config(uint8_t); 1038void init_pipes(void); 1039void config_process(enum smtp_proc_type); 1040void config_peer(enum smtp_proc_type); 1041void config_done(void); 1042 1043 1044/* control.c */ 1045pid_t control(void); 1046int control_create_socket(void); 1047 1048 1049/* crypto.c */ 1050int crypto_setup(const char *, size_t); 1051int crypto_encrypt_file(FILE *, FILE *); 1052int crypto_decrypt_file(FILE *, FILE *); 1053size_t crypto_encrypt_buffer(const char *, size_t, char *, size_t); 1054size_t crypto_decrypt_buffer(const char *, size_t, char *, size_t); 1055 1056 1057/* delivery.c */ 1058struct delivery_backend *delivery_backend_lookup(enum action_type); 1059 1060 1061/* dns.c */ 1062void dns_query_host(uint64_t, const char *); 1063void dns_query_ptr(uint64_t, const struct sockaddr *); 1064void dns_query_mx(uint64_t, const char *); 1065void dns_query_mx_preference(uint64_t, const char *, const char *); 1066void dns_imsg(struct mproc *, struct imsg *); 1067 1068 1069/* enqueue.c */ 1070int enqueue(int, char **); 1071 1072 1073/* envelope.c */ 1074void envelope_set_errormsg(struct envelope *, char *, ...); 1075int envelope_load_buffer(struct envelope *, const char *, size_t); 1076int envelope_dump_buffer(const struct envelope *, char *, size_t); 1077 1078 1079/* expand.c */ 1080int expand_cmp(struct expandnode *, struct expandnode *); 1081void expand_insert(struct expand *, struct expandnode *); 1082struct expandnode *expand_lookup(struct expand *, struct expandnode *); 1083void expand_clear(struct expand *); 1084void expand_free(struct expand *); 1085int expand_line(struct expand *, const char *, int); 1086int expand_to_text(struct expand *, char *, size_t); 1087RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp); 1088 1089 1090/* forward.c */ 1091int forwards_get(int, struct expand *); 1092 1093 1094/* imsgproc.c */ 1095void imsgproc_init(void); 1096struct imsgproc *imsgproc_fork(const char *, const char *, 1097 void (*)(struct imsg *, void *), void *); 1098void imsgproc_set_read(struct imsgproc *); 1099void imsgproc_set_write(struct imsgproc *); 1100void imsgproc_set_read_write(struct imsgproc *); 1101void imsgproc_reset_callback(struct imsgproc *, void (*)(struct imsg *, void *), void *); 1102 1103/* limit.c */ 1104void limit_mta_set_defaults(struct mta_limits *); 1105int limit_mta_set(struct mta_limits *, const char*, int64_t); 1106 1107/* lka.c */ 1108pid_t lka(void); 1109 1110 1111/* lka_session.c */ 1112void lka_session(uint64_t, struct envelope *); 1113void lka_session_forward_reply(struct forward_req *, int); 1114 1115 1116/* log.c */ 1117void vlog(int, const char *, va_list); 1118 1119 1120/* mda.c */ 1121pid_t mda(void); 1122 1123 1124/* mfa.c */ 1125pid_t mfa(void); 1126void mfa_ready(void); 1127 1128/* mfa_session.c */ 1129void mfa_filter_prepare(void); 1130void mfa_filter_init(void); 1131void mfa_filter_connect(uint64_t, const struct sockaddr *, 1132 const struct sockaddr *, const char *); 1133void mfa_filter_mailaddr(uint64_t, int, const struct mailaddr *); 1134void mfa_filter_line(uint64_t, int, const char *); 1135void mfa_filter_eom(uint64_t, int, size_t); 1136void mfa_filter(uint64_t, int); 1137void mfa_filter_event(uint64_t, int); 1138void mfa_build_fd_chain(uint64_t, int); 1139 1140/* mproc.c */ 1141int mproc_fork(struct mproc *, const char*, const char *); 1142void mproc_init(struct mproc *, int); 1143void mproc_clear(struct mproc *); 1144void mproc_enable(struct mproc *); 1145void mproc_disable(struct mproc *); 1146void m_compose(struct mproc *, uint32_t, uint32_t, pid_t, int, void *, size_t); 1147void m_composev(struct mproc *, uint32_t, uint32_t, pid_t, int, 1148 const struct iovec *, int); 1149void m_forward(struct mproc *, struct imsg *); 1150void m_create(struct mproc *, uint32_t, uint32_t, pid_t, int); 1151void m_add(struct mproc *, const void *, size_t); 1152void m_add_int(struct mproc *, int); 1153void m_add_u32(struct mproc *, uint32_t); 1154void m_add_time(struct mproc *, time_t); 1155void m_add_string(struct mproc *, const char *); 1156void m_add_data(struct mproc *, const void *, size_t); 1157void m_add_evpid(struct mproc *, uint64_t); 1158void m_add_msgid(struct mproc *, uint32_t); 1159void m_add_id(struct mproc *, uint64_t); 1160void m_add_sockaddr(struct mproc *, const struct sockaddr *); 1161void m_add_mailaddr(struct mproc *, const struct mailaddr *); 1162void m_add_envelope(struct mproc *, const struct envelope *); 1163void m_close(struct mproc *); 1164 1165void m_msg(struct msg *, struct imsg *); 1166int m_is_eom(struct msg *); 1167void m_end(struct msg *); 1168void m_get_int(struct msg *, int *); 1169void m_get_u32(struct msg *, uint32_t *); 1170void m_get_time(struct msg *, time_t *); 1171void m_get_string(struct msg *, const char **); 1172void m_get_data(struct msg *, const void **, size_t *); 1173void m_get_evpid(struct msg *, uint64_t *); 1174void m_get_msgid(struct msg *, uint32_t *); 1175void m_get_id(struct msg *, uint64_t *); 1176void m_get_sockaddr(struct msg *, struct sockaddr *); 1177void m_get_mailaddr(struct msg *, struct mailaddr *); 1178void m_get_envelope(struct msg *, struct envelope *); 1179 1180 1181/* mta.c */ 1182pid_t mta(void); 1183void mta_route_ok(struct mta_relay *, struct mta_route *); 1184void mta_route_error(struct mta_relay *, struct mta_route *); 1185void mta_route_down(struct mta_relay *, struct mta_route *); 1186void mta_route_collect(struct mta_relay *, struct mta_route *); 1187void mta_source_error(struct mta_relay *, struct mta_route *, const char *); 1188void mta_delivery_log(struct mta_envelope *, const char *, const char *, int, const char *); 1189void mta_delivery_notify(struct mta_envelope *, int, const char *, uint32_t); 1190void mta_delivery(struct mta_envelope *, const char *, const char *, int, const char *, uint32_t); 1191struct mta_task *mta_route_next_task(struct mta_relay *, struct mta_route *); 1192const char *mta_host_to_text(struct mta_host *); 1193const char *mta_relay_to_text(struct mta_relay *); 1194 1195/* mta_session.c */ 1196void mta_session(struct mta_relay *, struct mta_route *); 1197void mta_session_imsg(struct mproc *, struct imsg *); 1198 1199 1200/* parse.y */ 1201int parse_config(struct smtpd *, const char *, int); 1202int cmdline_symset(char *); 1203 1204 1205/* queue.c */ 1206pid_t queue(void); 1207void queue_ok(uint64_t); 1208void queue_tempfail(uint64_t, uint32_t, const char *); 1209void queue_permfail(uint64_t, const char *); 1210void queue_loop(uint64_t); 1211void queue_flow_control(void); 1212 1213 1214/* queue_backend.c */ 1215uint32_t queue_generate_msgid(void); 1216uint64_t queue_generate_evpid(uint32_t); 1217int queue_init(const char *, int); 1218int queue_message_create(uint32_t *); 1219int queue_message_delete(uint32_t); 1220int queue_message_commit(uint32_t); 1221int queue_message_fd_r(uint32_t); 1222int queue_message_fd_rw(uint32_t); 1223int queue_message_corrupt(uint32_t); 1224int queue_envelope_create(struct envelope *); 1225int queue_envelope_delete(uint64_t); 1226int queue_envelope_load(uint64_t, struct envelope *); 1227int queue_envelope_update(struct envelope *); 1228int queue_envelope_walk(struct envelope *); 1229 1230 1231/* ruleset.c */ 1232struct rule *ruleset_match(const struct envelope *); 1233 1234 1235/* scheduler.c */ 1236pid_t scheduler(void); 1237 1238 1239/* scheduler_bakend.c */ 1240struct scheduler_backend *scheduler_backend_lookup(const char *); 1241void scheduler_info(struct scheduler_info *, struct envelope *, uint32_t); 1242time_t scheduler_compute_schedule(struct scheduler_info *); 1243 1244 1245/* smtp.c */ 1246pid_t smtp(void); 1247void smtp_collect(void); 1248 1249 1250/* smtp_session.c */ 1251int smtp_session(struct listener *, int, const struct sockaddr_storage *, 1252 const char *); 1253void smtp_session_imsg(struct mproc *, struct imsg *); 1254 1255 1256/* smtpd.c */ 1257void imsg_dispatch(struct mproc *, struct imsg *); 1258void post_fork(int); 1259const char *proc_name(enum smtp_proc_type); 1260const char *proc_title(enum smtp_proc_type); 1261const char *imsg_to_str(int); 1262 1263 1264/* ssl_smtpd.c */ 1265void *ssl_mta_init(char *, off_t, char *, off_t); 1266void *ssl_smtp_init(void *, char *, off_t, char *, off_t); 1267 1268 1269/* stat_backend.c */ 1270struct stat_backend *stat_backend_lookup(const char *); 1271void stat_increment(const char *, size_t); 1272void stat_decrement(const char *, size_t); 1273void stat_set(const char *, const struct stat_value *); 1274struct stat_value *stat_counter(size_t); 1275struct stat_value *stat_timestamp(time_t); 1276struct stat_value *stat_timeval(struct timeval *); 1277struct stat_value *stat_timespec(struct timespec *); 1278 1279 1280/* table.c */ 1281struct table *table_find(const char *, const char *); 1282struct table *table_create(const char *, const char *, const char *, 1283 const char *); 1284int table_config(struct table *); 1285int table_open(struct table *); 1286int table_update(struct table *); 1287void table_close(struct table *); 1288int table_check_use(struct table *, uint32_t, uint32_t); 1289int table_check_type(struct table *, uint32_t); 1290int table_check_service(struct table *, uint32_t); 1291int table_lookup(struct table *, const char *, enum table_service, 1292 union lookup *); 1293int table_fetch(struct table *, enum table_service, union lookup *); 1294void table_destroy(struct table *); 1295void table_add(struct table *, const char *, const char *); 1296void table_delete(struct table *, const char *); 1297int table_domain_match(const char *, const char *); 1298int table_netaddr_match(const char *, const char *); 1299int table_mailaddr_match(const char *, const char *); 1300void table_open_all(void); 1301void table_dump_all(void); 1302void table_close_all(void); 1303const void *table_get(struct table *, const char *); 1304int table_parse_lookup(enum table_service, const char *, const char *, 1305 union lookup *); 1306 1307 1308/* to.c */ 1309int email_to_mailaddr(struct mailaddr *, char *); 1310int text_to_netaddr(struct netaddr *, const char *); 1311int text_to_mailaddr(struct mailaddr *, const char *); 1312int text_to_relayhost(struct relayhost *, const char *); 1313int text_to_userinfo(struct userinfo *, const char *); 1314int text_to_credentials(struct credentials *, const char *); 1315int text_to_expandnode(struct expandnode *, const char *); 1316uint64_t text_to_evpid(const char *); 1317uint32_t text_to_msgid(const char *); 1318const char *sa_to_text(const struct sockaddr *); 1319const char *ss_to_text(const struct sockaddr_storage *); 1320const char *time_to_text(time_t); 1321const char *duration_to_text(time_t); 1322const char *relayhost_to_text(const struct relayhost *); 1323const char *rule_to_text(struct rule *); 1324const char *sockaddr_to_text(struct sockaddr *); 1325const char *mailaddr_to_text(const struct mailaddr *); 1326const char *expandnode_to_text(struct expandnode *); 1327 1328/* util.c */ 1329typedef struct arglist arglist; 1330struct arglist { 1331 char **list; 1332 uint num; 1333 uint nalloc; 1334}; 1335void addargs(arglist *, char *, ...) 1336 __attribute__((format(printf, 2, 3))); 1337int bsnprintf(char *, size_t, const char *, ...) 1338 __attribute__((format (printf, 3, 4))); 1339int mkdirs(char *, mode_t); 1340int safe_fclose(FILE *); 1341int hostname_match(const char *, const char *); 1342int valid_localpart(const char *); 1343int valid_domainpart(const char *); 1344int secure_file(int, char *, char *, uid_t, int); 1345int lowercase(char *, const char *, size_t); 1346void xlowercase(char *, const char *, size_t); 1347int uppercase(char *, const char *, size_t); 1348uint64_t generate_uid(void); 1349void fdlimit(double); 1350int availdesc(void); 1351int ckdir(const char *, mode_t, uid_t, gid_t, int); 1352int rmtree(char *, int); 1353int mvpurge(char *, char *); 1354int mktmpfile(void); 1355const char *parse_smtp_response(char *, size_t, char **, int *); 1356void *xmalloc(size_t, const char *); 1357void *xcalloc(size_t, size_t, const char *); 1358char *xstrdup(const char *, const char *); 1359void *xmemdup(const void *, size_t, const char *); 1360char *strip(char *); 1361void iobuf_xinit(struct iobuf *, size_t, size_t, const char *); 1362void iobuf_xfqueue(struct iobuf *, const char *, const char *, ...); 1363void log_envelope(const struct envelope *, const char *, const char *, 1364 const char *); 1365void session_socket_blockmode(int, enum blockmodes); 1366void session_socket_no_linger(int); 1367int session_socket_error(int); 1368int getmailname(char *, size_t); 1369 1370 1371/* waitq.c */ 1372int waitq_wait(void *, void (*)(void *, void *, void *), void *); 1373void waitq_run(void *, void *); 1374 1375/* runq.c */ 1376struct runq; 1377 1378int runq_init(struct runq **, void (*)(struct runq *, void *)); 1379int runq_schedule(struct runq *, time_t, void (*)(struct runq *, void *), void *); 1380int runq_delay(struct runq *, unsigned int, void (*)(struct runq *, void *), void *); 1381int runq_cancel(struct runq *, void (*)(struct runq *, void *), void *); 1382int runq_pending(struct runq *, void (*)(struct runq *, void *), void *, time_t *); 1383int runq_next(struct runq *, void (**)(struct runq *, void *), void **, time_t *); 1384