1/* $NetBSD$ */ 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 69VSTRING *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 106const 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