smtpd.h revision 1.292
1/* $OpenBSD: smtpd.h,v 1.292 2012/05/12 21:49:31 gilles Exp $ */ 2 3/* 4 * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> 5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.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 nitems 21#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 22#endif 23 24#include "filter.h" 25#include "ioev.h" 26#include "iobuf.h" 27 28#define IMSG_SIZE_CHECK(p) do { \ 29 if (IMSG_DATA_SIZE(&imsg) != sizeof(*p)) \ 30 fatalx("bad length imsg received"); \ 31 } while (0) 32#define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE) 33 34 35#define CONF_FILE "/etc/mail/smtpd.conf" 36#define MAX_LISTEN 16 37#define PROC_COUNT 9 38#define MAX_NAME_SIZE 64 39 40#define MAX_HOPS_COUNT 100 41 42#define MAX_TAG_SIZE 32 43/* SYNC WITH filter.h */ 44//#define MAX_LINE_SIZE 1024 45//#define MAX_LOCALPART_SIZE 128 46//#define MAX_DOMAINPART_SIZE MAXHOSTNAMELEN 47 48/* return and forward path size */ 49#define MAX_FILTER_NAME 32 50#define MAX_PATH_SIZE 256 51#define MAX_RULEBUFFER_LEN 256 52 53#define SMTPD_QUEUE_INTERVAL (15 * 60) 54#define SMTPD_QUEUE_MAXINTERVAL (4 * 60 * 60) 55#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 56#define SMTPD_USER "_smtpd" 57#define SMTPD_FILTER_USER "_smtpmfa" 58#define SMTPD_SOCKET "/var/run/smtpd.sock" 59#define SMTPD_BANNER "220 %s ESMTP OpenSMTPD" 60#define SMTPD_SESSION_TIMEOUT 300 61#define SMTPD_BACKLOG 5 62 63#define PATH_SMTPCTL "/usr/sbin/smtpctl" 64 65#define DIRHASH_BUCKETS 4096 66 67#define PATH_SPOOL "/var/spool/smtpd" 68#define PATH_OFFLINE "/offline" 69#define PATH_PURGE "/purge" 70 71/* number of MX records to lookup */ 72#define MAX_MX_COUNT 10 73 74/* max response delay under flood conditions */ 75#define MAX_RESPONSE_DELAY 60 76 77/* how many responses per state are undelayed */ 78#define FAST_RESPONSES 2 79 80/* max len of any smtp line */ 81#define SMTP_LINE_MAX 1024 82 83#define F_STARTTLS 0x01 84#define F_SMTPS 0x02 85#define F_AUTH 0x04 86#define F_SSL (F_SMTPS|F_STARTTLS) 87 88#define F_SCERT 0x01 89#define F_CCERT 0x02 90 91#define ADVERTISE_TLS(s) \ 92 ((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE)) 93 94#define ADVERTISE_AUTH(s) \ 95 ((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \ 96 !((s)->s_flags & F_AUTHENTICATED)) 97 98 99 100typedef u_int32_t objid_t; 101 102struct netaddr { 103 struct sockaddr_storage ss; 104 int bits; 105}; 106 107struct relayhost { 108 u_int8_t flags; 109 char hostname[MAXHOSTNAMELEN]; 110 u_int16_t port; 111 char cert[PATH_MAX]; 112 char authmap[MAX_PATH_SIZE]; 113}; 114 115enum imsg_type { 116 IMSG_NONE, 117 IMSG_CTL_OK, /* answer to smtpctl requests */ 118 IMSG_CTL_FAIL, 119 IMSG_CTL_SHUTDOWN, 120 IMSG_CTL_VERBOSE, 121 IMSG_CONF_START, 122 IMSG_CONF_SSL, 123 IMSG_CONF_LISTENER, 124 IMSG_CONF_MAP, 125 IMSG_CONF_MAP_CONTENT, 126 IMSG_CONF_RULE, 127 IMSG_CONF_RULE_SOURCE, 128 IMSG_CONF_FILTER, 129 IMSG_CONF_END, 130 IMSG_LKA_MAIL, 131 IMSG_LKA_RCPT, 132 IMSG_LKA_SECRET, 133 IMSG_LKA_RULEMATCH, 134 IMSG_MDA_SESS_NEW, 135 IMSG_MDA_DONE, 136 137 IMSG_MFA_CONNECT, 138 IMSG_MFA_HELO, 139 IMSG_MFA_MAIL, 140 IMSG_MFA_RCPT, 141 IMSG_MFA_DATALINE, 142 IMSG_MFA_QUIT, 143 IMSG_MFA_CLOSE, 144 IMSG_MFA_RSET, 145 146 IMSG_QUEUE_CREATE_MESSAGE, 147 IMSG_QUEUE_SUBMIT_ENVELOPE, 148 IMSG_QUEUE_COMMIT_ENVELOPES, 149 IMSG_QUEUE_REMOVE_MESSAGE, 150 IMSG_QUEUE_COMMIT_MESSAGE, 151 IMSG_QUEUE_TEMPFAIL, 152 IMSG_QUEUE_PAUSE_MDA, 153 IMSG_QUEUE_PAUSE_MTA, 154 IMSG_QUEUE_RESUME_MDA, 155 IMSG_QUEUE_RESUME_MTA, 156 157 IMSG_QUEUE_DELIVERY_OK, 158 IMSG_QUEUE_DELIVERY_TEMPFAIL, 159 IMSG_QUEUE_DELIVERY_PERMFAIL, 160 IMSG_QUEUE_MESSAGE_FD, 161 IMSG_QUEUE_MESSAGE_FILE, 162 IMSG_QUEUE_SCHEDULE, 163 IMSG_QUEUE_REMOVE, 164 165 IMSG_RUNNER_REMOVE, 166 IMSG_RUNNER_SCHEDULE, 167 168 IMSG_BATCH_CREATE, 169 IMSG_BATCH_APPEND, 170 IMSG_BATCH_CLOSE, 171 IMSG_BATCH_DONE, 172 173 IMSG_PARENT_FORWARD_OPEN, 174 IMSG_PARENT_FORK_MDA, 175 176 IMSG_PARENT_AUTHENTICATE, 177 IMSG_PARENT_SEND_CONFIG, 178 179 IMSG_STATS, 180 IMSG_SMTP_ENQUEUE, 181 IMSG_SMTP_PAUSE, 182 IMSG_SMTP_RESUME, 183 184 IMSG_DNS_HOST, 185 IMSG_DNS_HOST_END, 186 IMSG_DNS_MX, 187 IMSG_DNS_PTR 188}; 189 190enum blockmodes { 191 BM_NORMAL, 192 BM_NONBLOCK 193}; 194 195struct imsgev { 196 struct imsgbuf ibuf; 197 void (*handler)(int, short, void *); 198 struct event ev; 199 void *data; 200 int proc; 201 short events; 202}; 203 204struct ctl_conn { 205 TAILQ_ENTRY(ctl_conn) entry; 206 u_int8_t flags; 207#define CTL_CONN_NOTIFY 0x01 208 struct imsgev iev; 209}; 210TAILQ_HEAD(ctl_connlist, ctl_conn); 211 212struct ctl_id { 213 objid_t id; 214 char name[MAX_NAME_SIZE]; 215}; 216 217enum smtp_proc_type { 218 PROC_PARENT = 0, 219 PROC_SMTP, 220 PROC_MFA, 221 PROC_LKA, 222 PROC_QUEUE, 223 PROC_MDA, 224 PROC_MTA, 225 PROC_CONTROL, 226 PROC_RUNNER, 227} smtpd_process; 228 229struct peer { 230 enum smtp_proc_type id; 231 void (*cb)(int, short, void *); 232}; 233 234enum map_src { 235 S_NONE, 236 S_PLAIN, 237 S_DB 238}; 239 240enum map_kind { 241 K_NONE, 242 K_ALIAS, 243 K_VIRTUAL, 244 K_CREDENTIALS 245}; 246 247enum mapel_type { 248 ME_STRING, 249 ME_NET, 250 ME_NETMASK 251}; 252 253struct mapel { 254 TAILQ_ENTRY(mapel) me_entry; 255 union mapel_data { 256 char med_string[MAX_LINE_SIZE]; 257 struct netaddr med_addr; 258 } me_key; 259 union mapel_data me_val; 260}; 261 262struct map { 263 TAILQ_ENTRY(map) m_entry; 264 char m_name[MAX_LINE_SIZE]; 265 objid_t m_id; 266 enum mapel_type m_eltype; 267 enum map_src m_src; 268 char m_config[MAXPATHLEN]; 269 TAILQ_HEAD(mapel_list, mapel) m_contents; 270}; 271 272 273struct map_backend { 274 void *(*open)(char *); 275 void (*close)(void *); 276 void *(*lookup)(void *, char *, enum map_kind); 277}; 278 279 280enum cond_type { 281 C_ALL, 282 C_NET, 283 C_DOM, 284 C_VDOM 285}; 286 287struct cond { 288 TAILQ_ENTRY(cond) c_entry; 289 objid_t c_map; 290 enum cond_type c_type; 291}; 292 293enum action_type { 294 A_INVALID, 295 A_RELAY, 296 A_RELAYVIA, 297 A_MAILDIR, 298 A_MBOX, 299 A_FILENAME, 300 A_MDA 301}; 302 303#define IS_MAILBOX(x) ((x).r_action == A_MAILDIR || (x).r_action == A_MBOX || (x).r_action == A_FILENAME) 304#define IS_RELAY(x) ((x).r_action == A_RELAY || (x).r_action == A_RELAYVIA) 305#define IS_EXT(x) ((x).r_action == A_EXT) 306 307struct rule { 308 TAILQ_ENTRY(rule) r_entry; 309 char r_tag[MAX_TAG_SIZE]; 310 int r_accept; 311 struct map *r_sources; 312 struct cond r_condition; 313 enum action_type r_action; 314 union rule_dest { 315 char buffer[MAX_RULEBUFFER_LEN]; 316 struct relayhost relayhost; 317 } r_value; 318 319 char *r_user; 320 struct mailaddr *r_as; 321 objid_t r_amap; 322 time_t r_qexpire; 323}; 324 325struct mailaddr { 326 char user[MAX_LOCALPART_SIZE]; 327 char domain[MAX_DOMAINPART_SIZE]; 328}; 329 330enum delivery_type { 331 D_INVALID = 0, 332 D_MDA, 333 D_MTA, 334 D_BOUNCE 335}; 336 337enum delivery_status { 338 DS_PERMFAILURE = 0x1, 339 DS_TEMPFAILURE = 0x2, 340}; 341 342enum delivery_flags { 343 DF_AUTHENTICATED = 0x1, 344 DF_ENQUEUED = 0x2, 345 DF_BOUNCE = 0x4, 346 DF_INTERNAL = 0x8 /* internal expansion forward */ 347}; 348 349union delivery_data { 350 char user[MAXLOGNAME]; 351 char buffer[MAX_RULEBUFFER_LEN]; 352 struct mailaddr mailaddr; 353}; 354 355struct delivery_mda { 356 enum action_type method; 357 union delivery_data to; 358 char as_user[MAXLOGNAME]; 359}; 360 361struct delivery_mta { 362 struct relayhost relay; 363}; 364 365enum expand_type { 366 EXPAND_INVALID, 367 EXPAND_USERNAME, 368 EXPAND_FILENAME, 369 EXPAND_FILTER, 370 EXPAND_INCLUDE, 371 EXPAND_ADDRESS 372}; 373 374enum expand_flags { 375 F_EXPAND_NONE, 376 F_EXPAND_DONE 377}; 378 379struct expandnode { 380 RB_ENTRY(expandnode) entry; 381 size_t refcnt; 382 enum expand_flags flags; 383 enum expand_type type; 384 char as_user[MAXLOGNAME]; 385 union delivery_data u; 386}; 387 388RB_HEAD(expandtree, expandnode); 389 390#define SMTPD_ENVELOPE_VERSION 1 391struct envelope { 392 TAILQ_ENTRY(envelope) entry; 393 394 char tag[MAX_TAG_SIZE]; 395 struct rule rule; 396 397 u_int64_t session_id; 398 u_int64_t batch_id; 399 400 u_int32_t version; 401 u_int64_t id; 402 enum delivery_type type; 403 404 char helo[MAXHOSTNAMELEN]; 405 char hostname[MAXHOSTNAMELEN]; 406 char errorline[MAX_LINE_SIZE + 1]; 407 struct sockaddr_storage ss; 408 409 struct mailaddr sender; 410 struct mailaddr rcpt; 411 struct mailaddr dest; 412 413 union delivery_method { 414 struct delivery_mda mda; 415 struct delivery_mta mta; 416 } agent; 417 418 time_t creation; 419 time_t lasttry; 420 time_t expire; 421 u_int8_t retry; 422 enum delivery_flags flags; 423}; 424TAILQ_HEAD(deliverylist, envelope); 425 426enum envelope_field { 427 EVP_VERSION, 428 EVP_ID, 429 EVP_TYPE, 430 EVP_HELO, 431 EVP_HOSTNAME, 432 EVP_ERRORLINE, 433 EVP_SOCKADDR, 434 EVP_SENDER, 435 EVP_RCPT, 436 EVP_DEST, 437 EVP_CTIME, 438 EVP_EXPIRE, 439 EVP_RETRY, 440 EVP_LASTTRY, 441 EVP_FLAGS, 442 EVP_MDA_METHOD, 443 EVP_MDA_BUFFER, 444 EVP_MDA_USER, 445 EVP_MTA_RELAY_HOST, 446 EVP_MTA_RELAY_PORT, 447 EVP_MTA_RELAY_FLAGS, 448 EVP_MTA_RELAY_CERT, 449 EVP_MTA_RELAY_AUTHMAP 450}; 451 452 453enum child_type { 454 CHILD_INVALID, 455 CHILD_DAEMON, 456 CHILD_MDA, 457 CHILD_ENQUEUE_OFFLINE, 458}; 459 460struct child { 461 SPLAY_ENTRY(child) entry; 462 pid_t pid; 463 enum child_type type; 464 enum smtp_proc_type title; 465 int mda_out; 466 u_int32_t mda_id; 467 char *path; 468}; 469 470enum session_state { 471 S_NEW = 0, 472 S_CONNECTED, 473 S_INIT, 474 S_GREETED, 475 S_TLS, 476 S_AUTH_INIT, 477 S_AUTH_USERNAME, 478 S_AUTH_PASSWORD, 479 S_AUTH_FINALIZE, 480 S_RSET, 481 S_HELO, 482 S_MAIL_MFA, 483 S_MAIL_QUEUE, 484 S_MAIL, 485 S_RCPT_MFA, 486 S_RCPT, 487 S_DATA, 488 S_DATA_QUEUE, 489 S_DATACONTENT, 490 S_DONE, 491 S_QUIT, 492 S_CLOSE 493}; 494#define STATE_COUNT 22 495 496struct ssl { 497 SPLAY_ENTRY(ssl) ssl_nodes; 498 char ssl_name[PATH_MAX]; 499 char *ssl_ca; 500 off_t ssl_ca_len; 501 char *ssl_cert; 502 off_t ssl_cert_len; 503 char *ssl_key; 504 off_t ssl_key_len; 505 char *ssl_dhparams; 506 off_t ssl_dhparams_len; 507 u_int8_t flags; 508}; 509 510struct listener { 511 u_int8_t flags; 512 int fd; 513 struct sockaddr_storage ss; 514 in_port_t port; 515 struct timeval timeout; 516 struct event ev; 517 char ssl_cert_name[PATH_MAX]; 518 struct ssl *ssl; 519 void *ssl_ctx; 520 char tag[MAX_TAG_SIZE]; 521 TAILQ_ENTRY(listener) entry; 522}; 523 524struct auth { 525 u_int64_t id; 526 char user[MAXLOGNAME]; 527 char pass[MAX_LINE_SIZE + 1]; 528 int success; 529}; 530 531enum session_flags { 532 F_EHLO = 0x01, 533 F_8BITMIME = 0x02, 534 F_SECURE = 0x04, 535 F_AUTHENTICATED = 0x08, 536 F_WAITIMSG = 0x10, 537 F_ZOMBIE = 0x20, 538}; 539 540struct session { 541 SPLAY_ENTRY(session) s_nodes; 542 u_int64_t s_id; 543 544 struct iobuf s_iobuf; 545 struct io s_io; 546 547 enum session_flags s_flags; 548 enum session_state s_state; 549 struct sockaddr_storage s_ss; 550 char s_hostname[MAXHOSTNAMELEN]; 551 struct event s_ev; 552 struct listener *s_l; 553 void *s_ssl; 554 struct timeval s_tv; 555 struct envelope s_msg; 556 short s_nresp[STATE_COUNT]; 557 size_t rcptcount; 558 long s_datalen; 559 560 struct auth s_auth; 561 int s_dstatus; 562 563 FILE *datafp; 564 int mboxfd; 565 int messagefd; 566}; 567 568 569struct smtpd { 570 char sc_conffile[MAXPATHLEN]; 571 size_t sc_maxsize; 572 573#define SMTPD_OPT_VERBOSE 0x00000001 574#define SMTPD_OPT_NOACTION 0x00000002 575 u_int32_t sc_opts; 576#define SMTPD_CONFIGURING 0x00000001 577#define SMTPD_EXITING 0x00000002 578#define SMTPD_MDA_PAUSED 0x00000004 579#define SMTPD_MTA_PAUSED 0x00000008 580#define SMTPD_SMTP_PAUSED 0x00000010 581#define SMTPD_MDA_BUSY 0x00000020 582#define SMTPD_MTA_BUSY 0x00000040 583#define SMTPD_BOUNCE_BUSY 0x00000080 584 u_int32_t sc_flags; 585 struct timeval sc_qintval; 586 int sc_qexpire; 587 u_int32_t sc_maxconn; 588 struct event sc_ev; 589 int *sc_pipes[PROC_COUNT] 590 [PROC_COUNT]; 591 struct imsgev *sc_ievs[PROC_COUNT]; 592 int sc_instances[PROC_COUNT]; 593 int sc_instance; 594 char *sc_title[PROC_COUNT]; 595 struct passwd *sc_pw; 596 char sc_hostname[MAXHOSTNAMELEN]; 597 struct queue_backend *sc_queue; 598 struct scheduler_backend *sc_scheduler; 599 600 TAILQ_HEAD(filterlist, filter) *sc_filters; 601 602 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 603 TAILQ_HEAD(maplist, map) *sc_maps, *sc_maps_reload; 604 TAILQ_HEAD(rulelist, rule) *sc_rules, *sc_rules_reload; 605 SPLAY_HEAD(sessiontree, session) sc_sessions; 606 SPLAY_HEAD(ssltree, ssl) *sc_ssl; 607 SPLAY_HEAD(childtree, child) children; 608 SPLAY_HEAD(lkatree, lka_session) lka_sessions; 609 SPLAY_HEAD(mfatree, mfa_session) mfa_sessions; 610 SPLAY_HEAD(mtatree, mta_session) mta_sessions; 611 LIST_HEAD(mdalist, mda_session) mda_sessions; 612 613 struct stats *stats; 614 u_int64_t filtermask; 615}; 616 617#define TRACE_VERBOSE 0x0001 618#define TRACE_IMSG 0x0002 619#define TRACE_IO 0x0004 620#define TRACE_SMTP 0x0008 621#define TRACE_MTA 0x0010 622#define TRACE_BOUNCE 0x0020 623 624enum { 625 STATS_SMTP_SESSION = 0, 626 STATS_SMTP_SESSION_INET4, 627 STATS_SMTP_SESSION_INET6, 628 STATS_SMTP_SMTPS, 629 STATS_SMTP_STARTTLS, 630 631 STATS_MTA_SESSION, 632 633 STATS_MDA_SESSION, 634 635 STATS_CONTROL_SESSION, 636 637 STATS_LKA_SESSION, 638 STATS_LKA_SESSION_MX, 639 STATS_LKA_SESSION_HOST, 640 STATS_LKA_SESSION_CNAME, 641 STATS_LKA_FAILURE, 642 643 STATS_RUNNER, 644 STATS_RUNNER_BOUNCES, 645 646 STATS_QUEUE_LOCAL, 647 STATS_QUEUE_REMOTE, 648 649 STATS_RAMQUEUE_ENVELOPE, 650 STATS_RAMQUEUE_MESSAGE, 651 STATS_RAMQUEUE_BATCH, 652 STATS_RAMQUEUE_HOST, 653 654 STATS_MAX, 655}; 656 657#define STAT_COUNT 0 658#define STAT_ACTIVE 1 659#define STAT_MAXACTIVE 2 660 661struct stat_counter { 662 size_t count; 663 size_t active; 664 size_t maxactive; 665}; 666 667struct s_parent { 668 time_t start; 669}; 670 671struct s_session { 672 size_t read_error; 673 size_t read_timeout; 674 size_t read_eof; 675 size_t write_error; 676 size_t write_timeout; 677 size_t write_eof; 678 size_t toofast; 679 size_t tempfail; 680 size_t linetoolong; 681 size_t delays; 682}; 683 684struct stats { 685 struct s_parent parent; 686 struct s_session mta; 687 struct s_session smtp; 688 689 struct stat_counter counters[STATS_MAX]; 690}; 691 692struct submit_status { 693 u_int64_t id; 694 int code; 695 union submit_path { 696 struct mailaddr maddr; 697 u_int32_t msgid; 698 u_int64_t evpid; 699 char errormsg[MAX_LINE_SIZE + 1]; 700 char dataline[MAX_LINE_SIZE + 1]; 701 } u; 702 enum delivery_flags flags; 703 struct sockaddr_storage ss; 704 struct envelope envelope; 705}; 706 707struct forward_req { 708 u_int64_t id; 709 u_int8_t status; 710 char as_user[MAXLOGNAME]; 711 struct envelope envelope; 712}; 713 714enum dns_status { 715 DNS_OK = 0, 716 DNS_RETRY, 717 DNS_EINVAL, 718 DNS_ENONAME, 719 DNS_ENOTFOUND, 720}; 721 722struct dns { 723 u_int64_t id; 724 char host[MAXHOSTNAMELEN]; 725 int port; 726 int error; 727 int type; 728 struct imsgev *asker; 729 struct sockaddr_storage ss; 730 struct dns *next; 731}; 732 733struct secret { 734 u_int64_t id; 735 char mapname[MAX_PATH_SIZE]; 736 char host[MAXHOSTNAMELEN]; 737 char secret[MAX_LINE_SIZE]; 738}; 739 740struct mda_session { 741 LIST_ENTRY(mda_session) entry; 742 struct envelope msg; 743 struct msgbuf w; 744 struct event ev; 745 u_int32_t id; 746 FILE *datafp; 747}; 748 749struct deliver { 750 char to[PATH_MAX]; 751 char from[PATH_MAX]; 752 char user[MAXLOGNAME]; 753 short mode; 754}; 755 756struct rulematch { 757 u_int64_t id; 758 struct submit_status ss; 759}; 760 761enum lka_session_flags { 762 F_ERROR = 0x1 763}; 764 765struct lka_session { 766 SPLAY_ENTRY(lka_session) nodes; 767 u_int64_t id; 768 769 struct deliverylist deliverylist; 770 struct expandtree expandtree; 771 772 u_int8_t iterations; 773 u_int32_t pending; 774 enum lka_session_flags flags; 775 struct submit_status ss; 776}; 777 778struct filter { 779 TAILQ_ENTRY(filter) f_entry; 780 pid_t pid; 781 struct event ev; 782 struct imsgbuf *ibuf; 783 char name[MAX_FILTER_NAME]; 784 char path[MAXPATHLEN]; 785}; 786 787struct mfa_session { 788 SPLAY_ENTRY(mfa_session) nodes; 789 u_int64_t id; 790 791 enum session_state state; 792 struct submit_status ss; 793 struct filter *filter; 794 struct filter_msg fm; 795}; 796 797enum mta_state { 798 MTA_INIT, 799 MTA_SECRET, 800 MTA_DATA, 801 MTA_MX, 802 MTA_CONNECT, 803 MTA_DONE, 804 MTA_SMTP_READY, 805 MTA_SMTP_BANNER, 806 MTA_SMTP_EHLO, 807 MTA_SMTP_HELO, 808 MTA_SMTP_STARTTLS, 809 MTA_SMTP_AUTH, 810 MTA_SMTP_MAIL, 811 MTA_SMTP_RCPT, 812 MTA_SMTP_DATA, 813 MTA_SMTP_QUIT, 814 MTA_SMTP_BODY, 815 MTA_SMTP_DONE, 816 MTA_SMTP_RSET, 817}; 818 819/* mta session flags */ 820#define MTA_FORCE_ANYSSL 0x01 821#define MTA_FORCE_SMTPS 0x02 822#define MTA_ALLOW_PLAIN 0x04 823#define MTA_USE_AUTH 0x08 824#define MTA_FORCE_MX 0x10 825#define MTA_USE_CERT 0x20 826#define MTA_TLS 0x40 827 828struct mta_relay { 829 TAILQ_ENTRY(mta_relay) entry; 830 struct sockaddr_storage sa; 831 char fqdn[MAXHOSTNAMELEN]; 832 int used; 833}; 834 835struct mta_task; 836 837#define MTA_EXT_STARTTLS 0x01 838#define MTA_EXT_AUTH 0x02 839#define MTA_EXT_PIPELINING 0x04 840 841struct mta_session { 842 SPLAY_ENTRY(mta_session) entry; 843 u_int64_t id; 844 enum mta_state state; 845 char *host; 846 int port; 847 int flags; 848 TAILQ_HEAD(,mta_relay) relays; 849 char *authmap; 850 char *secret; 851 FILE *datafp; 852 853 TAILQ_HEAD(,mta_task) tasks; 854 855 struct envelope *currevp; 856 struct iobuf iobuf; 857 struct io io; 858 int ext; /* extension */ 859 struct ssl *ssl; 860}; 861 862struct mta_batch { 863 u_int64_t id; 864 struct relayhost relay; 865 866 u_int32_t msgid; 867}; 868 869/* maps return structures */ 870struct map_credentials { 871 char username[MAX_LINE_SIZE]; 872 char password[MAX_LINE_SIZE]; 873}; 874 875struct map_alias { 876 size_t nbnodes; 877 struct expandtree expandtree; 878}; 879 880struct map_virtual { 881 size_t nbnodes; 882 struct expandtree expandtree; 883}; 884 885 886/* queue structures */ 887enum queue_type { 888 QT_INVALID=0, 889 QT_FS 890}; 891 892enum queue_kind { 893 Q_INCOMING, 894 Q_QUEUE, 895 Q_CORRUPT 896}; 897 898enum queue_op { 899 QOP_INVALID=0, 900 QOP_CREATE, 901 QOP_DELETE, 902 QOP_UPDATE, 903 QOP_COMMIT, 904 QOP_LOAD, 905 QOP_FD_R, 906 QOP_FD_RW, 907 QOP_CORRUPT, 908}; 909 910struct queue_backend { 911 int (*init)(int); 912 int (*message)(enum queue_kind, enum queue_op, u_int32_t *); 913 int (*envelope)(enum queue_kind, enum queue_op, struct envelope *); 914 915 void *(*qwalk_new)(enum queue_kind, u_int32_t); 916 int (*qwalk)(void *, u_int64_t *); 917 void (*qwalk_close)(void *); 918}; 919 920 921/* auth structures */ 922enum auth_type { 923 AUTH_BSD, 924 AUTH_PWD, 925}; 926 927struct auth_backend { 928 int (*authenticate)(char *, char *); 929}; 930 931 932/* user structures */ 933enum user_type { 934 USER_PWD, 935}; 936 937#define MAXPASSWORDLEN 128 938struct mta_user { 939 char username[MAXLOGNAME]; 940 char directory[MAXPATHLEN]; 941 char password[MAXPASSWORDLEN]; 942 uid_t uid; 943 gid_t gid; 944}; 945 946struct user_backend { 947 int (*getbyname)(struct mta_user *, char *); 948 int (*getbyuid)(struct mta_user *, uid_t); 949}; 950 951 952/* delivery_backend */ 953struct delivery_backend { 954 void (*open)(struct deliver *); 955}; 956 957 958/* scheduler_backend */ 959enum scheduler_type { 960 SCHED_RAMQUEUE, 961}; 962 963struct scheduler_backend { 964 void (*init)(void); 965 int (*setup)(time_t, time_t); 966 967 int (*next)(u_int64_t *, time_t *); 968 969 void (*insert)(struct envelope *); 970 void (*schedule)(u_int64_t); 971 void (*remove)(u_int64_t); 972 973 void *(*host)(char *); 974 void *(*message)(u_int32_t); 975 void *(*batch)(u_int64_t); 976 void *(*queue)(void); 977 void (*close)(void *); 978 979 int (*fetch)(void *, u_int64_t *); 980 int (*force)(u_int64_t); 981 982 void (*display)(void); /* may be NULL */ 983}; 984 985 986 987extern struct smtpd *env; 988extern void (*imsg_callback)(struct imsgev *, struct imsg *); 989 990 991/* aliases.c */ 992int aliases_exist(objid_t, char *); 993int aliases_get(objid_t, struct expandtree *, char *); 994int aliases_vdomain_exists(objid_t, char *); 995int aliases_virtual_exist(objid_t, struct mailaddr *); 996int aliases_virtual_get(objid_t, struct expandtree *, struct mailaddr *); 997int alias_parse(struct expandnode *, char *); 998 999 1000/* auth.c */ 1001struct auth_backend *auth_backend_lookup(enum auth_type); 1002 1003 1004/* bounce.c */ 1005int bounce_session(int, struct envelope *); 1006int bounce_session_switch(FILE *, enum session_state *, char *, struct envelope *); 1007void bounce_event(int, short, void *); 1008int bounce_record_message(struct envelope *, struct envelope *); 1009 1010/* config.c */ 1011#define PURGE_LISTENERS 0x01 1012#define PURGE_MAPS 0x02 1013#define PURGE_RULES 0x04 1014#define PURGE_SSL 0x08 1015#define PURGE_EVERYTHING 0xff 1016void purge_config(u_int8_t); 1017void unconfigure(void); 1018void configure(void); 1019void init_pipes(void); 1020void config_pipes(struct peer *, u_int); 1021void config_peers(struct peer *, u_int); 1022 1023 1024/* control.c */ 1025pid_t control(void); 1026void session_socket_blockmode(int, enum blockmodes); 1027void session_socket_no_linger(int); 1028int session_socket_error(int); 1029 1030 1031/* delivery.c */ 1032struct delivery_backend *delivery_backend_lookup(enum action_type); 1033 1034 1035/* dns.c */ 1036void dns_query_host(char *, int, u_int64_t); 1037void dns_query_mx(char *, int, u_int64_t); 1038void dns_query_ptr(struct sockaddr_storage *, u_int64_t); 1039void dns_async(struct imsgev *, int, struct dns *); 1040 1041 1042/* enqueue.c */ 1043int enqueue(int, char **); 1044int enqueue_offline(int, char **); 1045 1046 1047/* envelope.c */ 1048void envelope_set_errormsg(struct envelope *, char *, ...); 1049char *envelope_ascii_field_name(enum envelope_field); 1050int envelope_ascii_load(enum envelope_field, struct envelope *, char *); 1051int envelope_ascii_dump(enum envelope_field, struct envelope *, char *, 1052 size_t); 1053 1054 1055/* expand.c */ 1056int expand_cmp(struct expandnode *, struct expandnode *); 1057void expandtree_increment_node(struct expandtree *, struct expandnode *); 1058void expandtree_decrement_node(struct expandtree *, struct expandnode *); 1059void expandtree_remove_node(struct expandtree *, struct expandnode *); 1060struct expandnode *expandtree_lookup(struct expandtree *, struct expandnode *); 1061void expandtree_free_nodes(struct expandtree *); 1062RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp); 1063 1064 1065/* forward.c */ 1066int forwards_get(int, struct expandtree *, char *); 1067 1068 1069/* lka.c */ 1070pid_t lka(void); 1071int lka_session_cmp(struct lka_session *, struct lka_session *); 1072SPLAY_PROTOTYPE(lkatree, lka_session, nodes, lka_session_cmp); 1073 1074/* lka_session.c */ 1075struct lka_session *lka_session_init(struct submit_status *); 1076void lka_session_fail(struct lka_session *); 1077void lka_session_destroy(struct lka_session *); 1078 1079 1080/* map.c */ 1081void *map_lookup(objid_t, char *, enum map_kind); 1082struct map *map_find(objid_t); 1083struct map *map_findbyname(const char *); 1084 1085 1086/* mda.c */ 1087pid_t mda(void); 1088 1089 1090/* mfa.c */ 1091pid_t mfa(void); 1092int mfa_session_cmp(struct mfa_session *, struct mfa_session *); 1093SPLAY_PROTOTYPE(mfatree, mfa_session, nodes, mfa_session_cmp); 1094 1095/* mta.c */ 1096pid_t mta(void); 1097 1098/* mta_session.c */ 1099void mta_session_imsg(struct imsgev *, struct imsg *); 1100 1101/* parse.y */ 1102int parse_config(struct smtpd *, const char *, int); 1103int cmdline_symset(char *); 1104 1105 1106/* queue.c */ 1107pid_t queue(void); 1108void queue_submit_envelope(struct envelope *); 1109void queue_commit_envelopes(struct envelope *); 1110 1111 1112/* queue_backend.c */ 1113u_int32_t queue_generate_msgid(void); 1114u_int64_t queue_generate_evpid(u_int32_t msgid); 1115struct queue_backend *queue_backend_lookup(enum queue_type); 1116int queue_message_create(enum queue_kind, u_int32_t *); 1117int queue_message_delete(enum queue_kind, u_int32_t); 1118int queue_message_commit(enum queue_kind, u_int32_t); 1119int queue_message_fd_r(enum queue_kind, u_int32_t); 1120int queue_message_fd_rw(enum queue_kind, u_int32_t); 1121int queue_message_corrupt(enum queue_kind, u_int32_t); 1122int queue_envelope_create(enum queue_kind, struct envelope *); 1123int queue_envelope_delete(enum queue_kind, struct envelope *); 1124int queue_envelope_load(enum queue_kind, u_int64_t, struct envelope *); 1125int queue_envelope_update(enum queue_kind, struct envelope *); 1126void *qwalk_new(enum queue_kind, u_int32_t); 1127int qwalk(void *, u_int64_t *); 1128void qwalk_close(void *); 1129 1130 1131/* runner.c */ 1132pid_t runner(void); 1133void message_reset_flags(struct envelope *); 1134 1135 1136/* scheduler.c */ 1137struct scheduler_backend *scheduler_backend_lookup(enum scheduler_type); 1138 1139 1140/* smtp.c */ 1141pid_t smtp(void); 1142void smtp_resume(void); 1143 1144 1145/* smtp_session.c */ 1146void session_init(struct listener *, struct session *); 1147int session_cmp(struct session *, struct session *); 1148void session_io(struct io *, int); 1149void session_pickup(struct session *, struct submit_status *); 1150void session_destroy(struct session *, const char *); 1151void session_respond(struct session *, char *, ...) 1152 __attribute__ ((format (printf, 2, 3))); 1153 1154SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp); 1155 1156 1157/* smtpd.c */ 1158int child_cmp(struct child *, struct child *); 1159void imsg_event_add(struct imsgev *); 1160void imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 1161 int, void *, u_int16_t); 1162void imsg_dispatch(int, short, void *); 1163const char * proc_to_str(int); 1164const char * imsg_to_str(int); 1165SPLAY_PROTOTYPE(childtree, child, entry, child_cmp); 1166 1167 1168/* ssl.c */ 1169void ssl_init(void); 1170void ssl_transaction(struct session *); 1171void ssl_session_init(struct session *); 1172void ssl_session_destroy(struct session *); 1173int ssl_load_certfile(const char *, u_int8_t); 1174void ssl_setup(struct listener *); 1175int ssl_cmp(struct ssl *, struct ssl *); 1176void *ssl_mta_init(struct ssl *); 1177SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp); 1178 1179 1180/* ssl_privsep.c */ 1181int ssl_ctx_use_private_key(void *, char *, off_t); 1182int ssl_ctx_use_certificate_chain(void *, char *, off_t); 1183 1184/* stats.c */ 1185void stat_init(struct stat_counter *, int); 1186size_t stat_get(int, int); 1187size_t stat_increment(int); 1188size_t stat_decrement(int); 1189 1190 1191/* user.c */ 1192struct user_backend *user_backend_lookup(enum user_type); 1193 1194 1195/* util.c */ 1196typedef struct arglist arglist; 1197struct arglist { 1198 char **list; 1199 u_int num; 1200 u_int nalloc; 1201}; 1202void addargs(arglist *, char *, ...) 1203 __attribute__((format(printf, 2, 3))); 1204int bsnprintf(char *, size_t, const char *, ...) 1205 __attribute__ ((format (printf, 3, 4))); 1206int safe_fclose(FILE *); 1207int hostname_match(char *, char *); 1208int email_to_mailaddr(struct mailaddr *, char *); 1209int valid_localpart(char *); 1210int valid_domainpart(char *); 1211char *ss_to_text(struct sockaddr_storage *); 1212int valid_message_id(char *); 1213int valid_message_uid(char *); 1214char *time_to_text(time_t); 1215int secure_file(int, char *, char *, uid_t, int); 1216void lowercase(char *, char *, size_t); 1217void sa_set_port(struct sockaddr *, int); 1218u_int64_t generate_uid(void); 1219void fdlimit(double); 1220int availdesc(void); 1221u_int32_t evpid_to_msgid(u_int64_t); 1222u_int64_t msgid_to_evpid(u_int32_t); 1223void log_imsg(int, int, struct imsg*); 1224int ckdir(const char *, mode_t, uid_t, gid_t, int); 1225int rmtree(char *, int); 1226int mvpurge(char *, char *); 1227const char *parse_smtp_response(char *, size_t, char **, int *); 1228