1 /*        $NetBSD: smtputf8.c,v 1.3 2025/02/25 19:15:46 christos Exp $          */
2 
3 /*++
4 /* NAME
5 /*        smtputf8 3
6 /* SUMMARY
7 /*        SMTPUTF8 support
8 /* SYNOPSIS
9 /*        #include <smtputf8.h>
10 /*
11 /*        int       smtputf8_autodetect(class)
12 /*        int       class;
13 /* DESCRIPTION
14 /*        smtputf8_autodetect() determines whether the cleanup server
15 /*        should perform SMTPUTF8 detection, depending on the declared
16 /*        source class and the setting of the smtputf8_autodetect_classes
17 /*        configuration parameter.
18 /*
19 /*        Specify one of the following:
20 /* .IP MAIL_SRC_MASK_SENDMAIL
21 /*        Submission with the Postfix sendmail(1) command.
22 /* .IP MAIL_SRC_MASK_SMTPD
23 /*        Mail received with the smtpd(8) daemon.
24 /* .IP MAIL_SRC_MASK_QMQPD
25 /*        Mail received with the qmqpd(8) daemon.
26 /* .IP MAIL_SRC_MASK_FORWARD
27 /*        Local forwarding or aliasing.
28 /* .IP MAIL_SRC_MASK_BOUNCE
29 /*        Submission by the bounce(8) daemon.
30 /* .IP MAIL_SRC_MASK_NOTIFY
31 /*        Postmaster notification from the smtp(8) or smtpd(8) daemon.
32 /* .IP MAIL_SRC_MASK_VERIFY
33 /*        Address verification probe.
34 /* DIAGNOSTICS
35 /*        Panic: no valid class argument.
36 /*
37 /*        Specify one of the following:
38 /*        Warning: the smtputf8_autodetect_classes parameter specifies
39 /*        an invalid source category name.
40 /* LICENSE
41 /* .ad
42 /* .fi
43 /*        The Secure Mailer license must be distributed with this software.
44 /* AUTHOR(S)
45 /*        Wietse Venema
46 /*        IBM T.J. Watson Research
47 /*        P.O. Box 704
48 /*        Yorktown Heights, NY 10598, USA
49 /*--*/
50 
51 /* System library. */
52 
53 #include <sys_defs.h>
54 
55 /* Utility library. */
56 
57 #include <name_mask.h>
58 #include <msg.h>
59 
60 /* Global library. */
61 
62 #include <mail_params.h>
63 #include <cleanup_user.h>
64 #include <mail_proto.h>
65 #include <smtputf8.h>
66 
67 /* smtputf8_autodetect - enable SMTPUTF8 autodetection */
68 
smtputf8_autodetect(int class)69 int     smtputf8_autodetect(int class)
70 {
71     static const char myname[] = "smtputf8_autodetect";
72     static const NAME_MASK table[] = {
73           MAIL_SRC_NAME_SENDMAIL, MAIL_SRC_MASK_SENDMAIL,
74           MAIL_SRC_NAME_SMTPD, MAIL_SRC_MASK_SMTPD,
75           MAIL_SRC_NAME_QMQPD, MAIL_SRC_MASK_QMQPD,
76           MAIL_SRC_NAME_FORWARD, MAIL_SRC_MASK_FORWARD,
77           MAIL_SRC_NAME_BOUNCE, MAIL_SRC_MASK_BOUNCE,
78           MAIL_SRC_NAME_NOTIFY, MAIL_SRC_MASK_NOTIFY,
79           MAIL_SRC_NAME_VERIFY, MAIL_SRC_MASK_VERIFY,
80           MAIL_SRC_NAME_ALL, MAIL_SRC_MASK_ALL,
81           0,
82     };
83     int     autodetect_classes = 0;
84 
85     if (class == 0 || (class & ~MAIL_SRC_MASK_ALL) != 0)
86           msg_panic("%s: bad source class: %d", myname, class);
87     if (*var_smtputf8_autoclass) {
88           autodetect_classes =
89               name_mask(VAR_SMTPUTF8_AUTOCLASS, table, var_smtputf8_autoclass);
90           if (autodetect_classes == 0)
91               msg_warn("%s: bad input: %s", VAR_SMTPUTF8_AUTOCLASS,
92                          var_smtputf8_autoclass);
93           if (autodetect_classes & class)
94               return (CLEANUP_FLAG_AUTOUTF8);
95     }
96     return (0);
97 }
98