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