Home | History | Annotate | Line # | Download | only in global
      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