1 /*	$NetBSD: verp_sender.c,v 1.1.1.1 2009/06/23 10:08:48 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	verp_sender 3
6 /* SUMMARY
7 /*	quote local part of mailbox
8 /* SYNOPSIS
9 /*	#include <verp_sender.h>
10 /*
11 /*	VSTRING	*verp_sender(dst, delims, sender, recipient)
12 /*	VSTRING	*dst;
13 /*	const char *delims;
14 /*	const char *sender;
15 /*	const RECIPIENT *recipient;
16 /*
17 /*	const char *verp_delims_verify(delims)
18 /*	const char *delims;
19 /* DESCRIPTION
20 /*	verp_sender() encodes the recipient address in the sender
21 /*	address, using the specified delimiters. For example,
22 /*	with delims +=, sender \fIprefix@origin\fR, and
23 /*	recipient \fIuser@domain\fR the result is
24 /*	\fIprefix+user=domain@origin\fR.
25 /*
26 /*	verp_delims_verify() determines if the specified VERP delimiters
27 /*	have reasonable values. What is reasonable is configured with
28 /*	the verp_delimiter_filter configuration parameter. The result
29 /*	is null in case of success, a description of the problem in
30 /*	case of error.
31 /*
32 /*	Arguments:
33 /* .IP dst
34 /*	The result. The buffer is null terminated.
35 /* .IP delims
36 /*	VERP formatting characters.
37 /* .IP sender
38 /*	Sender envelope address.
39 /* .IP recipient
40 /*	Recipient envelope address.
41 /* LICENSE
42 /* .ad
43 /* .fi
44 /*	The Secure Mailer license must be distributed with this software.
45 /* AUTHOR(S)
46 /*	Wietse Venema
47 /*	IBM T.J. Watson Research
48 /*	P.O. Box 704
49 /*	Yorktown Heights, NY 10598, USA
50 /*--*/
51 
52 /* System library. */
53 
54 #include <sys_defs.h>
55 #include <string.h>
56 
57 /* Utility library. */
58 
59 #include <vstring.h>
60 
61 /* Global library. */
62 
63 #include <mail_params.h>
64 #include <recipient_list.h>
65 #include <verp_sender.h>
66 
67 /* verp_sender - encode recipient into envelope sender address */
68 
69 VSTRING *verp_sender(VSTRING *buf, const char *delimiters,
70 		             const char *sender, const RECIPIENT *rcpt_info)
71 {
72     ssize_t send_local_len;
73     ssize_t rcpt_local_len;
74     const char *recipient;
75     const char *cp;
76 
77     /*
78      * Change prefix@origin into prefix+user=domain@origin.
79      *
80      * Fix 20090115: Use the Postfix original recipient, because that is what
81      * the VERP consumer expects.
82      */
83     send_local_len = ((cp = strrchr(sender, '@')) != 0 ?
84 		      cp - sender : strlen(sender));
85     recipient = (rcpt_info->orig_addr[0] ?
86 		 rcpt_info->orig_addr : rcpt_info->address);
87     rcpt_local_len = ((cp = strrchr(recipient, '@')) != 0 ?
88 		      cp - recipient : strlen(recipient));
89     vstring_strncpy(buf, sender, send_local_len);
90     VSTRING_ADDCH(buf, delimiters[0] & 0xff);
91     vstring_strncat(buf, recipient, rcpt_local_len);
92     if (recipient[rcpt_local_len] && recipient[rcpt_local_len + 1]) {
93 	VSTRING_ADDCH(buf, delimiters[1] & 0xff);
94 	vstring_strcat(buf, recipient + rcpt_local_len + 1);
95     }
96     if (sender[send_local_len] && sender[send_local_len + 1]) {
97 	VSTRING_ADDCH(buf, '@');
98 	vstring_strcat(buf, sender + send_local_len + 1);
99     }
100     VSTRING_TERMINATE(buf);
101     return (buf);
102 }
103 
104 /* verp_delims_verify - sanitize VERP delimiters */
105 
106 const char *verp_delims_verify(const char *delims)
107 {
108     if (strlen(delims) != 2)
109 	return ("bad VERP delimiter character count");
110     if (strchr(var_verp_filter, delims[0]) == 0)
111 	return ("bad first VERP delimiter character");
112     if (strchr(var_verp_filter, delims[1]) == 0)
113 	return ("bad second VERP delimiter character");
114     return (0);
115 }
116