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

Reply via email to