Fix blind list alias expansion
[mmh] / uip / aliasbr.c
index b00f51b..3faa373 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <h/mh.h>
 #include <h/aliasbr.h>
+#include <h/addrsbr.h>
 #include <h/utils.h>
 #include <grp.h>
 #include <pwd.h>
@@ -99,9 +100,47 @@ akval(struct aka *ak, char *s)
        if (!s)
                return s;  /* XXX */
 
-       for (; ak; ak = ak->ak_next)
-               if (aleq(s, ak->ak_name))
-                       return akresult(ak);
+       for (; ak; ak = ak->ak_next) {
+               if (aleq (s, ak->ak_name)) {
+                       return akresult (ak);
+               } else if (strchr (s, ':')) {
+                       /*
+                       ** The first address in a blind list will contain the
+                       ** alias name, so try to match, but just with just the
+                       ** address (not including the list name).  If there's a
+                       ** match, then replace the alias part with its
+                       ** expansion.
+                       */
+
+                       char *name = getname(s);
+                       char *cp = NULL;
+
+                       if (name) {
+                               /*
+                               ** s is of the form "Blind list: address".  If address
+                               ** is an alias, expand it.
+                               */
+                               struct mailname *mp = getm(name, NULL, 0, AD_NAME, NULL);
+
+                               if (mp  &&  mp->m_ingrp) {
+                                       char *gname = add (mp->m_gname, NULL);
+
+                                       if (gname  &&  aleq(name, ak->ak_name)) {
+                                               /* Will leak cp. */
+                                               cp = concat (gname, akresult (ak), NULL);
+                                               free(gname);
+                                       }
+                               }
+                       mnfree(mp);
+                       }
+                       /* Need to flush getname after use. */
+                       while (getname("")) continue;
+
+                       if (cp) {
+                               return cp;
+                       }
+               }
+       }
 
        return mh_xstrdup(s);
 }