1 /*        $NetBSD: sasl_mech_filter.c,v 1.2 2022/10/08 16:12:45 christos Exp $  */
2 
3 /*++
4 /* NAME
5 /*        sasl_mech_filter 3
6 /* SUMMARY
7 /*        Filter SASL mechanism names
8 /* SYNOPSIS
9 /*        #include sasl_mech_filter.h
10 /*
11 /*        const char *sasl_mech_filter(
12 /*        STRING_LIST *filter,
13 /*        const char *words)
14 /* DESCRIPTION
15 /*        sasl_mech_filter() applies the specified filter to a list
16 /*        of SASL mechanism names. The filter is case-insensitive,
17 /*        but preserves the case of input words.
18 /*
19 /*        Arguments:
20 /* .IP filter
21 /*        Null pointer or filter specification. If this is a nulll
22 /*        pointer, no filter will be applied.
23 /* .IP words
24 /*        List of SASL authentication mechanisms (separated by blanks).
25 /*        If the string is empty, the filter will not be applied.
26 /* DIAGNOSTICS
27 /*        Fatal errors: memory allocation, table lookup error.
28 /* LICENSE
29 /* .ad
30 /* .fi
31 /*        The Secure Mailer license must be distributed with this software.
32 /* AUTHOR(S)
33 /*        Original author:
34 /*        Till Franke
35 /*        SuSE Rhein/Main AG
36 /*        65760 Eschborn, Germany
37 /*
38 /*        Adopted by:
39 /*        Wietse Venema
40 /*        IBM T.J. Watson Research
41 /*        P.O. Box 704
42 /*        Yorktown Heights, NY 10598, USA
43 /*
44 /*        Wietse Venema
45 /*        Google, Inc.
46 /*        111 8th Avenue
47 /*        New York, NY 10011, USA
48 /*--*/
49 
50 /* System library. */
51 
52 #include <sys_defs.h>
53 #include <string.h>
54 #ifdef STRCASECMP_IN_STRINGS_H
55 #include <strings.h>
56 #endif
57 
58 /* Utility library. */
59 
60 #include <msg.h>
61 #include <mymalloc.h>
62 #include <stringops.h>
63 
64 /* Global library. */
65 
66 #include <sasl_mech_filter.h>
67 
68 #ifdef USE_SASL_AUTH
69 
70 /* sasl_mech_filter - filter a SASL mechanism list */
71 
sasl_mech_filter(STRING_LIST * filter,const char * words)72 const char *sasl_mech_filter(STRING_LIST *filter,
73                                            const char *words)
74 {
75     const char myname[] = "sasl_mech_filter";
76     static VSTRING *buf;
77     char   *mech_list;
78     char   *save_mech;
79     char   *mech;
80 
81     /*
82      * NOOP if there is no filter, or if the mechanism list is empty.
83      */
84     if (filter == 0 || *words == 0)
85           return (words);
86 
87     if (buf == 0)
88           buf = vstring_alloc(10);
89 
90     VSTRING_RESET(buf);
91     VSTRING_TERMINATE(buf);
92 
93     save_mech = mech_list = mystrdup(words);
94 
95     while ((mech = mystrtok(&mech_list, " \t")) != 0) {
96           if (string_list_match(filter, mech)) {
97               if (VSTRING_LEN(buf) > 0)
98                     VSTRING_ADDCH(buf, ' ');
99               vstring_strcat(buf, mech);
100               if (msg_verbose)
101                     msg_info("%s: keep SASL mechanism: '%s'", myname, mech);
102           } else if (filter->error) {
103               msg_fatal("%s: SASL mechanism filter failed for: '%s'",
104                           myname, mech);
105           } else {
106               if (msg_verbose)
107                     msg_info("%s: drop SASL mechanism: '%s'", myname, mech);
108           }
109     }
110     myfree(save_mech);
111 
112     return (vstring_str(buf));
113 }
114 
115 #endif
116