Wietse Venema: > A. Schulze: > > <wish> > > smtpd_recipient_restrictions = > > check_foo_to_allow_something, > > reject "you did this or that wrong, call +49 ... for assistance" > > </wish> > > > > Is that possible? > > smtpd_recipient_restrictions does not support free text and the > main.cf parser does not support quotes. > > Fortunately, neither is needed. > > An improved "static" table would do the job: > > check_recipient_access static:{reject you did this or that ...} > > I'll post a patch in a little while. This takes four lines of code.
Four lines would be cheating. It takes more lines when done right. Below is a patch for Postfix 2.12 versions after 20141005. Wietse *** /var/tmp/postfix-2.12-20141119/src/util/dict_static.c 2012-01-07 10:37:11.000000000 -0500 --- src/util/dict_static.c 2014-11-21 17:17:40.000000000 -0500 *************** *** 37,42 **** --- 37,43 ---- #include "mymalloc.h" #include "msg.h" + #include "stringops.h" #include "dict.h" #include "dict_static.h" *************** *** 56,69 **** /* dict_static_open - make association with static variable */ ! DICT *dict_static_open(const char *name, int unused_flags, int dict_flags) { DICT *dict; dict = dict_alloc(DICT_TYPE_STATIC, name, sizeof(*dict)); dict->lookup = dict_static_lookup; dict->close = dict_static_close; dict->flags = dict_flags | DICT_FLAG_FIXED; dict->owner.status = DICT_OWNER_TRUSTED; ! return (DICT_DEBUG (dict)); } --- 57,98 ---- /* dict_static_open - make association with static variable */ ! DICT *dict_static_open(const char *name, int open_flags, int dict_flags) { DICT *dict; + const char *err; + char *cp, *saved_name = 0; + /* + * Let the optimizer worry about eliminating redundant code. + */ + #define DICT_STATIC_OPEN_RETURN(d) do { \ + DICT *__d = (d); \ + if (saved_name != 0) \ + myfree(saved_name); \ + return (__d); \ + } while (0) + + /* + * Optionally strip surrounding braces and whitespace. + */ + if (name[0] == CHARS_BRACE[0]) { + saved_name = cp = mystrdup(name); + if ((err = extpar(&cp, CHARS_BRACE, EXTPAR_FLAG_STRIP)) != 0) + DICT_STATIC_OPEN_RETURN(dict_surrogate(DICT_TYPE_STATIC, name, + open_flags, dict_flags, + "bad %s:name syntax: %s", + DICT_TYPE_STATIC, err)); + name = cp; + } + + /* + * Bundle up the request. + */ dict = dict_alloc(DICT_TYPE_STATIC, name, sizeof(*dict)); dict->lookup = dict_static_lookup; dict->close = dict_static_close; dict->flags = dict_flags | DICT_FLAG_FIXED; dict->owner.status = DICT_OWNER_TRUSTED; ! DICT_STATIC_OPEN_RETURN(DICT_DEBUG (dict)); }