Hi,

I just took the time to update the dash-patch from 20010305 to the
20010501 ldap patch. Remember: it's not my code, but the current
dash-trick patch on the http://www.lifewithqmail.org/ldap site for the
20010501 ldap patch is not correct. Hopefully this one is. So if
anybody's using this one, let the list know the results :)

Franky
--- ../qmail-1.03-patch20010501-orig/qmail-lspawn.c     Sat Jun  2 18:00:12 2001
+++ qmail-lspawn.c      Sat Jun  2 17:48:50 2001
@@ -351,6 +351,9 @@
    int  reply;
    int  at;
    int  i;
+#ifdef DASH_EXT
+   int  dash;
+#endif
    int  force_forward;
    char *r;
    stralloc filter = {0};
@@ -401,38 +404,78 @@
    ret = ldap_lookup(&search, attrs, &info, extra);
 
    if ( ret != 0 && qldap_errno == LDAP_NOSUCH ) {
-      /* this handles the "catch all" extension */
+      /* extensions: catchall and dash-trick */
       at = 0;
       r = mail->s;
       i = mail->len;
       for (at = i - 1; r[at] != '@' && at >= 0 ; at--) ; 
             /* handels also mailwith 2 @ */
-      /* build the search string for the email address */
-      if (!stralloc_copys(&filter,"(" ) ) _exit(QLX_NOMEM);
-      /* optional objectclass */
-      if (qldap_objectclass.len) {
-        if (!stralloc_cats(&filter,"&(")) _exit(QLX_NOMEM);
-        if (!stralloc_cats(&filter,LDAP_OBJECTCLASS)) _exit(QLX_NOMEM);
+#ifdef DASH_EXT
+      dash=0;
+      for (dash = at-1; dash > 0 && ret != 0 && qldap_errno == LDAP_NOSUCH; dash--) {
+        if ( r[dash-1] == '-' ) {
+        /* dash ext */
+       /* build the search string for the email address */
+           if (!stralloc_copys(&filter,"(" ) ) _exit(QLX_NOMEM);
+           /* optional objectclass */
+            if (qldap_objectclass.len) {
+              if (!stralloc_cats(&filter,"&(")) _exit(QLX_NOMEM);
+              if (!stralloc_cats(&filter,LDAP_OBJECTCLASS)) _exit(QLX_NOMEM);
+              if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
+              if (!stralloc_cat(&filter,&qldap_objectclass)) _exit(QLX_NOMEM);
+              if (!stralloc_cats(&filter,")(")) _exit(QLX_NOMEM);
+            } /* end */
+            if (!stralloc_cats(&filter,"|(")) _exit(QLX_NOMEM);
+            if (!stralloc_cats(&filter,LDAP_MAIL)) _exit(QLX_NOMEM);
+            if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
+            if (!stralloc_catb(&filter,r,dash-1)) _exit(QLX_NOMEM);
+            if (!stralloc_catb(&filter,r+at, i-at)) _exit(QLX_NOMEM);
+            if (!stralloc_cats(&filter,")(")) _exit(QLX_NOMEM);
+            if (!stralloc_cats(&filter,LDAP_MAILALTERNATE)) _exit(QLX_NOMEM);
+            if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
+            if (!stralloc_catb(&filter,r,dash-1)) _exit(QLX_NOMEM);
+            if (!stralloc_catb(&filter,r+at, i-at)) _exit(QLX_NOMEM);
+            if (!stralloc_cats(&filter,"))")) _exit(QLX_NOMEM);
+            if (!stralloc_0(&filter)) _exit(QLX_NOMEM);
+
+            debug(16, "retry with filter '%s'\n", filter.s);
+            /* do the search */
+            ret = ldap_lookup(&search, attrs, &info, extra);
+        }
+      }
+
+      if (ret != 0 && qldap_errno == LDAP_NOSUCH) {
+#endif
+       /* catchall */
+        /* build the search string for the email address */
+        if (!stralloc_copys(&filter,"(" ) ) _exit(QLX_NOMEM);
+        /* optional objectclass */
+        if (qldap_objectclass.len) {
+          if (!stralloc_cats(&filter,"&(")) _exit(QLX_NOMEM);
+          if (!stralloc_cats(&filter,LDAP_OBJECTCLASS)) _exit(QLX_NOMEM);
+          if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
+          if (!stralloc_cat(&filter,&qldap_objectclass)) _exit(QLX_NOMEM);
+          if (!stralloc_cats(&filter,")(")) _exit(QLX_NOMEM);
+        } /* end */
+        if (!stralloc_cats(&filter,"|(")) _exit(QLX_NOMEM);
+        if (!stralloc_cats(&filter,LDAP_MAIL)) _exit(QLX_NOMEM);
         if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
-        if (!stralloc_cat(&filter,&qldap_objectclass)) _exit(QLX_NOMEM);
+        if (!stralloc_cats(&filter,LDAP_CATCH_ALL)) _exit(QLX_NOMEM);
+        if (!stralloc_catb(&filter,r+at, i-at)) _exit(QLX_NOMEM);
         if (!stralloc_cats(&filter,")(")) _exit(QLX_NOMEM);
-      } /* end */
-      if (!stralloc_cats(&filter,"|(")) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,LDAP_MAIL)) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,LDAP_CATCH_ALL)) _exit(QLX_NOMEM);
-      if (!stralloc_catb(&filter,r+at, i-at)) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,")(")) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,LDAP_MAILALTERNATE)) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,LDAP_CATCH_ALL)) _exit(QLX_NOMEM);
-      if (!stralloc_catb(&filter,r+at, i-at)) _exit(QLX_NOMEM);
-      if (!stralloc_cats(&filter,"))")) _exit(QLX_NOMEM);
-      if (!stralloc_0(&filter)) _exit(QLX_NOMEM);
+        if (!stralloc_cats(&filter,LDAP_MAILALTERNATE)) _exit(QLX_NOMEM);
+        if (!stralloc_cats(&filter,"=")) _exit(QLX_NOMEM);
+        if (!stralloc_cats(&filter,LDAP_CATCH_ALL)) _exit(QLX_NOMEM);
+        if (!stralloc_catb(&filter,r+at, i-at)) _exit(QLX_NOMEM);
+        if (!stralloc_cats(&filter,"))")) _exit(QLX_NOMEM);
+        if (!stralloc_0(&filter)) _exit(QLX_NOMEM);
       
-      debug(16, "retry with filter '%s'\n", filter.s);
-      /* do the search for the catchall address */
-      ret = ldap_lookup(&search, attrs, &info, extra);
+        debug(16, "retry with filter '%s'\n", filter.s);
+        /* do the search for the catchall address */
+        ret = ldap_lookup(&search, attrs, &info, extra);
+#ifdef DASH_EXT
+      }
+#endif
    }
    alloc_free(filter.s); filter.s = 0;
 
@@ -526,11 +569,24 @@
    }
    if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
 
-   /* At the moment we ignore the dash-field and the extension field *
-    * so we fill up the nughde structure with '\0'                   */
-   
-   if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
-   if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
+#ifdef DASH_EXT
+   /* Here we fill the nughde structure with the dash-field the extension field */
+        if ((dash > 0) && (dash < (at-1))) {
+              if (!stralloc_cats(&nughde,"-")) _exit(QLX_NOMEM);
+              if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
+              if (!stralloc_catb(&nughde,r+dash+1,at-dash-1)) _exit(QLX_NOMEM);
+              if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
+
+     } else {
+#endif
+   /* we ignore the dash-field and the extension field *
+    * so we fill up the nughde structure with '\0'     */
+              if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
+              if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
+
+#ifdef DASH_EXT
+     }
+#endif
 
    /* get the quota for the user of that maildir mbox */
    if ( extra[0].vals != 0 ) {

Reply via email to