1/* $NetBSD$ */ 2 3/*++ 4/* NAME 5/* virtual 3h 6/* SUMMARY 7/* virtual mail delivery 8/* SYNOPSIS 9/* #include "virtual.h" 10/* DESCRIPTION 11/* .nf 12 13 /* 14 * System library. 15 */ 16#include <unistd.h> 17 18 /* 19 * Utility library. 20 */ 21#include <vstream.h> 22#include <vstring.h> 23 24 /* 25 * Global library. 26 */ 27#include <deliver_request.h> 28#include <maps.h> 29#include <mbox_conf.h> 30#include <dsn_buf.h> 31#include <dsn.h> 32 33 /* 34 * Mappings. 35 */ 36extern MAPS *virtual_mailbox_maps; 37extern MAPS *virtual_uid_maps; 38extern MAPS *virtual_gid_maps; 39 40 /* 41 * User attributes: these control the privileges for delivery to external 42 * commands, external files, or mailboxes, and the initial environment of 43 * external commands. 44 */ 45typedef struct USER_ATTR { 46 uid_t uid; /* file/command access */ 47 gid_t gid; /* file/command access */ 48 char *mailbox; /* mailbox file or directory */ 49} USER_ATTR; 50 51 /* 52 * Critical macros. Not for obscurity, but to ensure consistency. 53 */ 54#define RESET_USER_ATTR(usr_attr, level) { \ 55 usr_attr.uid = 0; usr_attr.gid = 0; usr_attr.mailbox = 0; \ 56 if (msg_verbose) \ 57 msg_info("%s[%d]: reset user_attr", myname, level); \ 58 } 59 60 /* 61 * The delivery attributes are inherited from files, from aliases, and from 62 * whatnot. Some of the information is changed on the fly. DELIVER_ATTR 63 * structures are therefore passed by value, so there is no need to undo 64 * changes. 65 */ 66typedef struct DELIVER_ATTR { 67 int level; /* recursion level */ 68 VSTREAM *fp; /* open queue file */ 69 char *queue_name; /* mail queue id */ 70 char *queue_id; /* mail queue id */ 71 long offset; /* data offset */ 72 const char *sender; /* taken from envelope */ 73 char *dsn_envid; /* DSN envelope ID */ 74 int dsn_ret; /* DSN headers/full */ 75 RECIPIENT rcpt; /* from delivery request */ 76 char *user; /* recipient lookup handle */ 77 const char *delivered; /* for loop detection */ 78 char *relay; /* relay host */ 79 MSG_STATS msg_stats; /* time profile */ 80 DSN_BUF *why; /* delivery status */ 81} DELIVER_ATTR; 82 83extern void deliver_attr_init(DELIVER_ATTR *); 84extern void deliver_attr_dump(DELIVER_ATTR *); 85extern void deliver_attr_free(DELIVER_ATTR *); 86 87#define FEATURE_NODELIVERED (1<<0) /* no delivered-to */ 88 89 /* 90 * Rather than schlepping around dozens of arguments, here is one that has 91 * all. Well, almost. The user attributes are just a bit too sensitive, so 92 * they are passed around separately. 93 */ 94typedef struct LOCAL_STATE { 95 int level; /* nesting level, for logging */ 96 DELIVER_ATTR msg_attr; /* message/recipient attributes */ 97 DELIVER_REQUEST *request; /* as from queue manager */ 98} LOCAL_STATE; 99 100 /* 101 * Bundle up some often-user attributes. 102 */ 103#define BOUNCE_FLAGS(request) DEL_REQ_TRACE_FLAGS((request)->flags) 104 105#define BOUNCE_ATTR(attr) \ 106 attr.queue_id, &attr.msg_stats, &attr.rcpt, attr.relay, \ 107 DSN_FROM_DSN_BUF(attr.why) 108#define SENT_ATTR(attr) \ 109 attr.queue_id, &attr.msg_stats, &attr.rcpt, attr.relay, \ 110 DSN_FROM_DSN_BUF(attr.why) 111#define COPY_ATTR(attr) \ 112 attr.sender, attr.rcpt.orig_addr, attr.delivered, attr.fp 113 114#define MSG_LOG_STATE(m, p) \ 115 msg_info("%s[%d]: recip %s deliver %s", m, \ 116 p.level, \ 117 p.msg_attr.rcpt.address ? p.msg_attr.rcpt.address : "", \ 118 p.msg_attr.delivered ? p.msg_attr.delivered : "") 119 120 /* 121 * "inner" nodes of the delivery graph. 122 */ 123extern int deliver_recipient(LOCAL_STATE, USER_ATTR); 124 125 /* 126 * "leaf" nodes of the delivery graph. 127 */ 128extern int deliver_mailbox(LOCAL_STATE, USER_ATTR, int *); 129extern int deliver_file(LOCAL_STATE, USER_ATTR, char *); 130extern int deliver_maildir(LOCAL_STATE, USER_ATTR); 131extern int deliver_unknown(LOCAL_STATE); 132 133 /* 134 * Mailbox lock protocol. 135 */ 136extern int virtual_mbox_lock_mask; 137 138 /* 139 * Silly little macros. 140 */ 141#define STR(s) vstring_str(s) 142 143/* LICENSE 144/* .ad 145/* .fi 146/* The Secure Mailer license must be distributed with this software. 147/* AUTHOR(S) 148/* Wietse Venema 149/* IBM T.J. Watson Research 150/* P.O. Box 704 151/* Yorktown Heights, NY 10598, USA 152/*--*/ 153