svn commit: r321021 - in head/mail/qmailadmin: . files

Bryan Drewery bdrewery at FreeBSD.org
Sat Jun 15 23:19:54 UTC 2013


Author: bdrewery
Date: Sat Jun 15 23:19:53 2013
New Revision: 321021
URL: http://svnweb.freebsd.org/changeset/ports/321021

Log:
  - Fix configuring ezmlm-idx-7 mailing lists. Only apply the
    patch [1] when using ezmlm-idx as it is not backwards
    compatible with ezmlm.
  
  Reported by:	Marko Lerota <mlerota at claresco.hr>
  Obtained from:	https://sourceforge.net/p/qmailadmin/patches/36/

Added:
  head/mail/qmailadmin/files/extra-ezmlm-idx7.patch   (contents, props changed)
Deleted:
  head/mail/qmailadmin/files/patch-mailinglist.c
Modified:
  head/mail/qmailadmin/Makefile

Modified: head/mail/qmailadmin/Makefile
==============================================================================
--- head/mail/qmailadmin/Makefile	Sat Jun 15 21:39:15 2013	(r321020)
+++ head/mail/qmailadmin/Makefile	Sat Jun 15 23:19:53 2013	(r321021)
@@ -3,7 +3,7 @@
 
 PORTNAME=	qmailadmin
 PORTVERSION=	1.2.15
-PORTREVISION=	3
+PORTREVISION=	4
 PORTEPOCH=	2
 CATEGORIES=	mail www
 MASTER_SITES=	SF/${PORTNAME}/${PORTNAME}-stable/${PORTVERSION} \
@@ -78,6 +78,10 @@ SPAM_NEEDS_EMAIL_CONFIGURE_ENABLE=	spamc
 
 .include <bsd.port.options.mk>
 
+.if ${PORT_OPTIONS:MIDX}
+EXTRA_PATCHES+=		${FILESDIR}/extra-ezmlm-idx7.patch
+.endif
+
 .if ${PORT_OPTIONS:MSPAM_DETECTION} && defined(SPAM_COMMAND)
 CONFIGURE_ARGS+=	--enable-spam-command="${SPAM_COMMAND}"
 .endif

Added: head/mail/qmailadmin/files/extra-ezmlm-idx7.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/mail/qmailadmin/files/extra-ezmlm-idx7.patch	Sat Jun 15 23:19:53 2013	(r321021)
@@ -0,0 +1,378 @@
+Index: mailinglist.c
+===================================================================
+--- mailinglist.c	(revision 312)
++++ mailinglist.c	(working copy)
+@@ -59,6 +59,10 @@
+ #define REPLYTO_LIST 2
+ #define REPLYTO_ADDRESS 3
+ 
++#define GROUP_SUBSCRIBER 0
++#define GROUP_MODERATOR 1
++#define GROUP_DIGEST 2
++
+ void set_options();
+ void default_options();
+ 
+@@ -533,7 +537,7 @@
+     arguments[argc++]=TmpBuf3;
+     arguments[argc++]=ActionUser;
+     arguments[argc++]=Domain;
+-    arguments[argc]=NULL;
++    arguments[argc]=(char *) NULL;
+ 
+     execv(TmpBuf1, arguments);
+     exit(127);
+@@ -541,29 +545,6 @@
+     wait(&pid);
+   }
+ 
+-  /* 
+-   * ezmlm-make -e leaves .qmail-listname-(accept||reject) links for some reason.
+-   * (causing file permission errors in "show mailing lists") Also, it doesn't 
+-   * delete dir/digest/ when turning off digests.  This section cleans up...
+-   */
+-  if(listopt['M'-'A'] == 'M') { /* moderation off */
+-    sprintf(tmp, "%s/.qmail-%s-accept-default", RealDir, dotqmail_name);
+-    unlink (tmp);
+-    sprintf(tmp, "%s/.qmail-%s-reject-default", RealDir, dotqmail_name);
+-    unlink (tmp);
+-  }
+-  if(listopt['D'-'A'] == 'D') { /* digest off */
+-    sprintf(tmp, "%s/.qmail-%s-digest-return-default", RealDir, dotqmail_name);
+-    unlink (tmp);
+-    sprintf(tmp, "%s/.qmail-%s-digest-owner", RealDir, dotqmail_name);
+-    unlink (tmp);
+-
+-    /* delete the digest directory */
+-    sprintf(tmp, "%s/%s/digest", RealDir, ActionUser);
+-    vdelfiles(tmp);
+-    chdir(RealDir);
+-  }
+-
+   /* Check for prefix setting */
+   GetValue(TmpCGI, tmp, "prefix=", sizeof(tmp));
+   
+@@ -617,10 +598,10 @@
+ #ifdef EZMLMIDX
+   /* if this is a new list, add owner as subscriber */
+   if (newlist && (*list_owner != '\0')) {
+-    ezmlm_sub ("", list_owner);
++    ezmlm_sub (GROUP_SUBSCRIBER, list_owner);
+     if (listopt['M'-'A'] == 'm') { /* moderation on */
+       /* add owner as moderator/remote admin as well */
+-      ezmlm_sub ("mod", list_owner);
++      ezmlm_sub (GROUP_MODERATOR, list_owner);
+     }
+   }
+ #endif
+@@ -680,14 +661,14 @@
+     close(handles[0]);
+     dup2(handles[1],fileno(stdout));
+     sprintf(TmpBuf1, "%s/ezmlm-list", EZMLMDIR);
+-    if(mod == 1) {
+-        sprintf(TmpBuf2, "%s/%s/mod", RealDir, ActionUser);
+-    } else if(mod == 2) {
+-        sprintf(TmpBuf2, "%s/%s/digest", RealDir, ActionUser);
++    sprintf(TmpBuf2, "%s/%s", RealDir, ActionUser);
++    if(mod == GROUP_MODERATOR) {
++        execl(TmpBuf1, "ezmlm-list", TmpBuf2, "mod", (char *)NULL);
++    } else if(mod == GROUP_DIGEST) {
++        execl(TmpBuf1, "ezmlm-list", TmpBuf2, "digest", (char *)NULL);
+     } else {
+-        sprintf(TmpBuf2, "%s/%s/", RealDir, ActionUser);
++    	execl(TmpBuf1, "ezmlm-list", TmpBuf2, (char *)NULL);
+     }
+-    execl(TmpBuf1, "ezmlm-list", TmpBuf2, NULL);
+     exit(127);
+   } else {
+     close(handles[1]);
+@@ -790,7 +771,7 @@
+ void addlistdig() { addlistgroup( "add_listdig.html" ); }
+ 
+ /* returns 0 for success */
+-int ezmlm_sub (char *dir, char *email)
++int ezmlm_sub (int mod, char *email)
+ {
+  int pid;
+  char subpath[MAX_BUFF];
+@@ -799,9 +780,14 @@
+   pid=fork();
+   if (pid==0) {
+     snprintf(subpath, sizeof(subpath), "%s/ezmlm-sub", EZMLMDIR);
+-    snprintf(listpath, sizeof(listpath), "%s/%s/%s",
+-      RealDir, ActionUser, dir);
+-    execl(subpath, "ezmlm-sub", listpath, email, NULL);
++    snprintf(listpath, sizeof(listpath), "%s/%s", RealDir, ActionUser);
++    if (mod == GROUP_MODERATOR) {
++        execl(subpath, "ezmlm-sub", listpath, "mod", email, (char *)NULL);
++    } else if (mod == GROUP_DIGEST) {
++        execl(subpath, "ezmlm-sub", listpath, "digest", email, (char *)NULL);
++    } else {
++        execl(subpath, "ezmlm-sub", listpath, email, (char *)NULL);
++    }
+     exit(127);
+   } else wait(&pid);
+ 
+@@ -824,9 +810,9 @@
+ 
+   if ( check_email_addr(Newu) ) {
+     snprinth (StatusMessage, sizeof(StatusMessage), "%s %H\n", html_text[148], Newu);
+-    if (mod == 1) {
++    if (mod == GROUP_MODERATOR) {
+       addlistmod();
+-    } else if (mod == 2) {
++    } else if (mod == GROUP_DIGEST) {
+       addlistdig();
+     } else {
+       addlistuser();
+@@ -835,18 +821,16 @@
+     exit(0);
+   }
+ 
+-  if(mod == 1 ) {
+-    ezmlm_sub ("mod", Newu);
++  ezmlm_sub (mod, Newu);
++  if(mod == GROUP_MODERATOR ) {
+     snprinth (StatusMessage, sizeof(StatusMessage), "%H %s %H@%H\n", Newu, 
+         html_text[194], ActionUser, Domain);
+     send_template( "add_listmod.html" );
+-  } else if(mod == 2) {
+-    ezmlm_sub ("digest", Newu);
++  } else if(mod == GROUP_DIGEST) {
+     snprinth (StatusMessage, sizeof(StatusMessage), "%H %s %H@%H\n", Newu, 
+         html_text[240], ActionUser, Domain);
+     send_template( "add_listdig.html" );
+   } else {
+-    ezmlm_sub ("", Newu);
+     snprinth (StatusMessage, sizeof(StatusMessage), "%H %s %H@%H\n", Newu, 
+         html_text[193], ActionUser, Domain);
+     send_template( "add_listuser.html" );
+@@ -888,21 +872,21 @@
+   pid=fork();
+   if (pid==0) {
+     sprintf(TmpBuf1, "%s/ezmlm-unsub", EZMLMDIR);
+-    if(mod == 1) {
+-        sprintf(TmpBuf2, "%s/%s/mod", RealDir, ActionUser);
+-    } else if(mod == 2 ) {
+-        sprintf(TmpBuf2, "%s/%s/digest", RealDir, ActionUser);
++    sprintf(TmpBuf2, "%s/%s", RealDir, ActionUser);
++    if(mod == GROUP_MODERATOR) {
++        execl(TmpBuf1, "ezmlm-unsub", TmpBuf2, "mod", Newu, (char *)NULL);
++    } else if(mod == GROUP_DIGEST ) {
++        execl(TmpBuf1, "ezmlm-unsub", TmpBuf2, "digest", Newu, (char *)NULL);
+     } else {
+-        sprintf(TmpBuf2, "%s/%s/", RealDir, ActionUser);
++        execl(TmpBuf1, "ezmlm-unsub", TmpBuf2, Newu, (char *)NULL);
+     }
+-    execl(TmpBuf1, "ezmlm-unsub", TmpBuf2, Newu, NULL);
+     exit(127);
+   } else wait(&pid);
+ 
+-  if(mod == 1) {
++  if(mod == GROUP_MODERATOR) {
+     snprinth (StatusMessage, sizeof(StatusMessage), "%H %s %H@%H\n", Newu, html_text[197],
+         ActionUser, Domain);
+-  } else if(mod == 2) {
++  } else if(mod == GROUP_DIGEST) {
+     snprinth (StatusMessage, sizeof(StatusMessage), "%H %s %H@%H\n", Newu, html_text[242],
+         ActionUser, Domain);
+   } else {
+@@ -1092,42 +1076,96 @@
+   // default to false for lowercase letters
+   for (c = 'a'; c <= 'z'; checkopt[(int) c++] = 0);
+ 
+-  // figure out some options in the -default file
++  // ------ newer configuration reads
++
++  // -s: Subscription moderation. touching dir/modsub
++  sprintf(TmpBuf, "%s/modsub", ActionUser);
++  checkopt['s'] = file_exists(TmpBuf);
++  // -h: Help  subscription. Don't require confirmation. Not recommented!
++  sprintf(TmpBuf, "%s/nosubconfirm", ActionUser);
++  checkopt['h'] = file_exists(TmpBuf);
++  // -j Jump off. Unsubscribe  does not require confirmation.
++  sprintf(TmpBuf, "%s/nounsubconfirm", ActionUser);
++  checkopt['j'] = file_exists(TmpBuf);
++
++  // -m: Message  moderation. touch dir/modpost
++  sprintf(TmpBuf, "%s/modpost", ActionUser);   // valid for newer ezmlm-versions
++  checkopt['m'] = file_exists(TmpBuf);
++  // -o: Reject others than; applicable to message moderated lists only
++  sprintf(TmpBuf, "%s/modpostonly", ActionUser);
++  checkopt['o'] = file_exists(TmpBuf);
++  // -u: User posts only. subscribers, digest-subscribers and dir/allow
++  sprintf(TmpBuf, "%s/subpostonly", ActionUser);
++  checkopt['u'] = file_exists(TmpBuf);
++
++  // -f: Subject Prefix. outgoing subject will be pre-fixed with the list name
++  sprintf(TmpBuf, "%s/prefix", ActionUser);
++  checkopt['f'] = file_exists(TmpBuf);
++  // -t: Message Trailer. create dir/text/trailer
++  sprintf(TmpBuf, "%s/addtrailer", ActionUser);
++  checkopt['t'] = file_exists(TmpBuf);
++
++  // -a: Archived: touch dir/archived and dir/indexed
++  sprintf(TmpBuf, "%s/archived", ActionUser);
++  checkopt['a'] = file_exists(TmpBuf);
++  // -i: indexed for WWW archive access
++  sprintf(TmpBuf, "%s/threaded", ActionUser);
++  checkopt['i'] = file_exists(TmpBuf);
++  // -p: Public archive. touch dir/public
++  sprintf(TmpBuf, "%s/public", ActionUser);
++  checkopt['p'] = file_exists(TmpBuf);
++  // -g: Guard archive. Access requests from unrecognized SENDERs will be rejected.
++  sprintf(TmpBuf, "%s/subgetonly", ActionUser);
++  checkopt['g'] = file_exists(TmpBuf);
++  // -b: Block archive. Only moderators are allowed to access the archive.
++  sprintf(TmpBuf, "%s/modgetonly", ActionUser);
++  checkopt['b'] = file_exists(TmpBuf);
++
++  // -d: Digest
++  sprintf(TmpBuf, "%s/digested", ActionUser);
++  checkopt['d'] = file_exists(TmpBuf);
++
++  // -r: Remote admin. touching dir/remote
++  sprintf(TmpBuf, "%s/remote", ActionUser);
++  checkopt['r'] = file_exists(TmpBuf);
++  // -l List subscribers. administrators can request a subscriber
++  sprintf(TmpBuf, "%s/modcanlist", ActionUser);
++  checkopt['l'] = file_exists(TmpBuf);
++  // -n New text file. administrators may edit texts
++  sprintf(TmpBuf, "%s/modcanedit", ActionUser);
++  checkopt['n'] = file_exists(TmpBuf);
++
++  // ------ end of newer configuration reads
++
++  // ------ read in old ezmlm's values
++  // figure out some options in the -default file;
+   sprintf(TmpBuf, ".qmail-%s-default", dotqmail_name);
+   if( (fs=fopen(TmpBuf, "r")) !=NULL ) {
+     while(fgets(TmpBuf2, sizeof(TmpBuf2), fs)) {
++      // -b: Block archive. Only moderators are allowed to access the archive.
+       if((get_ezmlmidx_line_arguments(TmpBuf2, "ezmlm-get", 'P')) > 0) {
+         checkopt['b'] = 1;
+       }
++      // -g: Guard archive. Access requests from unrecognized SENDERs will be rejected.
+       if((get_ezmlmidx_line_arguments(TmpBuf2, "ezmlm-get", 's')) > 0) {
+         checkopt['g'] = 1;
+       }
++      // -h: Help  subscription. Don't require confirmation. Not recommented!
+       if((get_ezmlmidx_line_arguments(TmpBuf2, "ezmlm-manage", 'S')) > 0) {
+         checkopt['h'] = 1;
+       }
++      // -j Jump off. Unsubscribe  does not require confirmation.
+       if((get_ezmlmidx_line_arguments(TmpBuf2, "ezmlm-manage", 'U')) > 0) {
+         checkopt['j'] = 1;
+       }
++      // -l List subscribers. administrators can request a subscriber
+       if((get_ezmlmidx_line_arguments(TmpBuf2, "ezmlm-manage", 'l')) > 0) {
+         checkopt['l'] = 1;
+       }
++      // -n New text file. administrators may edit texts
+       if((get_ezmlmidx_line_arguments(TmpBuf2, "ezmlm-manage", 'e')) > 0) {
+         checkopt['n'] = 1;
+       }
+-      if((strstr(TmpBuf2, "ezmlm-request")) != 0) {
+-        checkopt['q'] = 1;
+-      }
+-    }
+-    fclose(fs);
+-  }
+-
+-  // figure out some options in the -accept-default file
+-  sprintf(TmpBuf, ".qmail-%s-accept-default", dotqmail_name);
+-  if( (fs=fopen(TmpBuf, "r")) !=NULL ) {
+-    while(fgets(TmpBuf2, sizeof(TmpBuf2), fs)) {
+-      if(strstr(TmpBuf2, "ezmlm-archive") !=0) {
+-        checkopt['i'] = 1;
+-      }
+     }
+     fclose(fs);
+   }
+@@ -1136,43 +1174,21 @@
+   sprintf(TmpBuf, ".qmail-%s", dotqmail_name);
+   if( (fs=fopen(TmpBuf, "r")) !=NULL ) {
+     while(fgets(TmpBuf2, sizeof(TmpBuf2), fs)) {
++      // -o: Reject others than; applicable to message moderated lists only
+       if((get_ezmlmidx_line_arguments(TmpBuf2, "ezmlm-store", 'P')) > 0) {
+         checkopt['o'] = 1;
+       }
+-      if((strstr(TmpBuf2, "ezmlm-gate")) != 0 || (strstr(TmpBuf2, "ezmlm-issubn")) != 0) {
+-        checkopt['u'] = 1;
+-      }
+-      if(strstr(TmpBuf2, "ezmlm-archive") !=0) {
+-        checkopt['i'] = 1;
+-      }
+     }
+     fclose(fs);
+   }
+ 
+-  sprintf(TmpBuf, ".qmail-%s-accept-default", dotqmail_name);
+-  checkopt['m'] = file_exists(TmpBuf);
+-
+-  sprintf(TmpBuf, "%s/archived", ActionUser);
+-  checkopt['a'] = file_exists(TmpBuf);
+-  
+-  sprintf(TmpBuf, "%s/digest/bouncer", ActionUser);
+-  checkopt['d'] = file_exists(TmpBuf);
+-  
+-  sprintf(TmpBuf, "%s/prefix", ActionUser);
+-  checkopt['f'] = file_exists(TmpBuf);
+-
+-  sprintf(TmpBuf, "%s/public", ActionUser);
+-  checkopt['p'] = file_exists(TmpBuf);
+-  
+-  sprintf(TmpBuf, "%s/remote", ActionUser);
+-  checkopt['r'] = file_exists(TmpBuf);
+-  
+-  sprintf(TmpBuf, "%s/modsub", ActionUser);
+-  checkopt['s'] = file_exists(TmpBuf);
+-  
++  // -t: Message Trailer. create dir/text/trailer
+   sprintf(TmpBuf, "%s/text/trailer", ActionUser);
+-  checkopt['t'] = file_exists(TmpBuf);
+-  
++  if (file_exists(TmpBuf)) {
++    checkopt['t'] = 1;
++  }
++  // ------ end of read in old ezmlm's values
++
+   /* update the uppercase option letters (just the opposite of the lowercase) */
+   for (c = 'A'; c <= 'Z'; c++)
+   {
+@@ -1208,7 +1224,7 @@
+   checkopt['n'] = 0; /* Remote admins can edit text files */
+   checkopt['o'] = 0; /* Others rejected (for Moderated lists only */
+   checkopt['p'] = 1; /* Public */
+-  checkopt['q'] = 1; /* Service listname-request */
++  checkopt['q'] = 1; /* Service listname-request, no longer supported */
+   checkopt['r'] = 0; /* Remote Administration */
+   checkopt['s'] = 0; /* Subscriptions are moderated */
+   checkopt['t'] = 0; /* Add Trailer to outgoing messages */
+@@ -1293,12 +1309,7 @@
+   build_option_str ("CHECKBOX", "opt5", "d", html_text[271]);
+   sprintf (TmpBuf, html_text[272], listname);
+   printf ("<SMALL>(%s)</SMALL>", TmpBuf);
+-  printf ("<BR>\n");
+-  sprintf (TmpBuf, html_text[273], listname);
+-  build_option_str ("CHECKBOX", "opt6", "q", TmpBuf);
+-  printf ("<BR>\n");
+-  sprintf (TmpBuf, html_text[274], listname, listname, listname);
+-  printf ("    <SMALL>(%s)</SMALL></P>", TmpBuf);
++  printf ("</P>");
+ 
+   /* Remote Administration */
+   printf ("<P><B><U>%s</U></B><BR>\n", html_text[275]);
+Index: mailinglist.h
+--- mailinglist.h	(revision 312)
++++ mailinglist.h	(working copy)
+@@ -13,7 +13,7 @@
+ void dellistgroupnow(int mod);
+ void delmailinglist();
+ void delmailinglistnow();
+-int ezmlm_sub (char *dir, char *email);
++int ezmlm_sub (int mod, char *email);
+ void modmailinglist();
+ void modmailinglistnow();
+ void show_list_group(char *template);
+


More information about the svn-ports-all mailing list