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));
}