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