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 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