From 17891ed6af9ff997d1fff129f67ec72aedf2b8a4 Mon Sep 17 00:00:00 2001 From: James Antill Date: Mon, 8 Aug 2022 12:40:40 -0400 Subject: [PATCH] Import rpm: be748fff6a6b044ba3f9e9264defbe13572d3747 --- .gitignore | 1 + httpd-mailman.conf | 24 + mailman-2.1-build.patch | 715 +++++++++ mailman-2.1-mailmanctl-status.patch | 109 ++ mailman-2.1.11-cron.patch | 132 ++ mailman-2.1.12-multimail.patch | 387 +++++ mailman-2.1.13-FHS.patch | 243 ++++ mailman-2.1.13-archive-reply.patch | 21 + mailman-2.1.13-env-python.patch | 25 + mailman-2.1.15-check_perms.patch | 22 + mailman-2.1.29-cmd_reply_encoding.patch | 16 + mailman-2.1.29-login_content_injection.patch | 13 + mailman-2.1.29-options_content_njection.patch | 22 + mailman-2.1.9-unicode.patch | 48 + mailman-CVE-2020-12137.patch | 14 + mailman-bouncer_oom_crash.patch | 78 + mailman-crontab-edit | 47 + mailman-migrate-fhs | 293 ++++ mailman-python-compile.patch | 13 + mailman-specify_python_version.patch | 70 + mailman-tmpfiles.conf | 2 + mailman-update-cfg | 13 + mailman.INSTALL.REDHAT.in | 476 ++++++ mailman.logrotate | 8 + mailman.service | 20 + mailman.spec | 1280 +++++++++++++++++ mm_cfg.py | 100 ++ sources | 1 + 28 files changed, 4193 insertions(+) create mode 100644 .gitignore create mode 100644 httpd-mailman.conf create mode 100644 mailman-2.1-build.patch create mode 100644 mailman-2.1-mailmanctl-status.patch create mode 100644 mailman-2.1.11-cron.patch create mode 100644 mailman-2.1.12-multimail.patch create mode 100644 mailman-2.1.13-FHS.patch create mode 100644 mailman-2.1.13-archive-reply.patch create mode 100644 mailman-2.1.13-env-python.patch create mode 100644 mailman-2.1.15-check_perms.patch create mode 100644 mailman-2.1.29-cmd_reply_encoding.patch create mode 100644 mailman-2.1.29-login_content_injection.patch create mode 100644 mailman-2.1.29-options_content_njection.patch create mode 100644 mailman-2.1.9-unicode.patch create mode 100644 mailman-CVE-2020-12137.patch create mode 100644 mailman-bouncer_oom_crash.patch create mode 100755 mailman-crontab-edit create mode 100755 mailman-migrate-fhs create mode 100644 mailman-python-compile.patch create mode 100644 mailman-specify_python_version.patch create mode 100644 mailman-tmpfiles.conf create mode 100755 mailman-update-cfg create mode 100644 mailman.INSTALL.REDHAT.in create mode 100644 mailman.logrotate create mode 100644 mailman.service create mode 100644 mailman.spec create mode 100644 mm_cfg.py create mode 100644 sources diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..02d184b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/mailman-2.1.29.tgz diff --git a/httpd-mailman.conf b/httpd-mailman.conf new file mode 100644 index 0000000..58dbc90 --- /dev/null +++ b/httpd-mailman.conf @@ -0,0 +1,24 @@ +# +# httpd configuration settings for use with mailman. +# + +ScriptAlias /mailman/ @MMDIR@/cgi-bin/ + + AllowOverride None + Options ExecCGI + Require all granted + + + +Alias /pipermail/ @VARMMDIR@/archives/public/ + + Options MultiViews FollowSymLinks + AllowOverride None + Require all granted + AddDefaultCharset Off + + +# Uncomment the following line, replacing www.example.com with your server's +# name, to redirect queries to /mailman to the listinfo page (recommended). + +# RedirectMatch ^/mailman[/]*$ http://www.example.com/mailman/listinfo diff --git a/mailman-2.1-build.patch b/mailman-2.1-build.patch new file mode 100644 index 0000000..3c5d99d --- /dev/null +++ b/mailman-2.1-build.patch @@ -0,0 +1,715 @@ +diff --git a/Mailman/Archiver/Makefile.in b/Mailman/Archiver/Makefile.in +index 65e46cb..dc3a1c6 100644 +--- a/Mailman/Archiver/Makefile.in ++++ b/Mailman/Archiver/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -47,7 +46,7 @@ pipermail.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -63,8 +62,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/Bouncers/Makefile.in b/Mailman/Bouncers/Makefile.in +index 8865a9f..8878cd9 100644 +--- a/Mailman/Bouncers/Makefile.in ++++ b/Mailman/Bouncers/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -45,7 +44,7 @@ MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,8 +60,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/Cgi/Makefile.in b/Mailman/Cgi/Makefile.in +index 47929e9..e20c07e 100644 +--- a/Mailman/Cgi/Makefile.in ++++ b/Mailman/Cgi/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -47,7 +46,7 @@ CGI_MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -63,8 +62,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(CGIDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/Commands/Makefile.in b/Mailman/Commands/Makefile.in +index 645d78b..12bbc1b 100644 +--- a/Mailman/Commands/Makefile.in ++++ b/Mailman/Commands/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -45,7 +44,7 @@ MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,8 +60,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/Gui/Makefile.in b/Mailman/Gui/Makefile.in +index 000441e..9273b8a 100644 +--- a/Mailman/Gui/Makefile.in ++++ b/Mailman/Gui/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -45,7 +44,7 @@ MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,8 +60,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/Handlers/Makefile.in b/Mailman/Handlers/Makefile.in +index 71e5576..56ee2eb 100644 +--- a/Mailman/Handlers/Makefile.in ++++ b/Mailman/Handlers/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -45,7 +44,7 @@ MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,8 +60,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/Logging/Makefile.in b/Mailman/Logging/Makefile.in +index e185775..ad5c128 100644 +--- a/Mailman/Logging/Makefile.in ++++ b/Mailman/Logging/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -45,7 +44,7 @@ MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,8 +60,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/MTA/Makefile.in b/Mailman/MTA/Makefile.in +index 0338806..e1de296 100644 +--- a/Mailman/MTA/Makefile.in ++++ b/Mailman/MTA/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -45,7 +44,7 @@ MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,8 +60,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Mailman/Makefile.in b/Mailman/Makefile.in +index 93c7efd..45439f0 100644 +--- a/Mailman/Makefile.in ++++ b/Mailman/Makefile.in +@@ -20,8 +20,6 @@ + + # Variables set by configure + +-VERSION= @VERSION@ +- + VPATH= @srcdir@ + srcdir= @srcdir@ + bindir= @bindir@ +@@ -30,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -48,7 +45,7 @@ SUBDIRS= Cgi Logging Archiver Handlers Bouncers Queue MTA Gui Commands + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -79,12 +76,6 @@ install: install-here + (cd $$d; $(MAKE) DESTDIR=$(DESTDIR) install); \ + done + +-finish: +- @for d in $(SUBDIRS); \ +- do \ +- (cd $$d; $(MAKE) DESTDIR=$(DESTDIR) finish); \ +- done +- + clean: + for d in $(SUBDIRS); \ + do \ +diff --git a/Mailman/Queue/Makefile.in b/Mailman/Queue/Makefile.in +index 179f3d9..e0e97ad 100644 +--- a/Mailman/Queue/Makefile.in ++++ b/Mailman/Queue/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -45,7 +44,7 @@ MODULES= *.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,8 +60,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/Makefile.in b/Makefile.in +index 40e04f5..eb40844 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -61,11 +61,10 @@ SUBDIRS= bin cron misc Mailman scripts src templates messages tests + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +-DIRSETGID= chmod g+s + + DATE = $(shell python -c 'import time; print time.strftime("%d-%b-%Y"),') + LANGPACK = README-I18N.en templates messages +@@ -85,14 +84,24 @@ install: doinstall update + + doinstall: $(SUBDIRS) + @echo "Creating architecture independent directories..." ++ dir=$(DESTDIR)$(prefix); \ ++ if test ! -d $$dir; then \ ++ echo "Creating directory hierarchy $$dir"; \ ++ $(INSTALL) -d -m $(DIRMODE) $$dir; \ ++ else true; \ ++ fi; ++ dir=$(DESTDIR)$(var_prefix); \ ++ if test ! -d $$dir; then \ ++ echo "Creating directory hierarchy $$dir"; \ ++ $(INSTALL) -d -m $(DIRMODE) $$dir; \ ++ else true; \ ++ fi; + @for d in $(VAR_DIRS); \ + do \ + dir=$(DESTDIR)$(var_prefix)/$$d; \ + if test ! -d $$dir; then \ + echo "Creating directory hierarchy $$dir"; \ +- $(srcdir)/mkinstalldirs $$dir; \ +- chmod $(DIRMODE) $$dir; \ +- $(DIRSETGID) $$dir; \ ++ $(INSTALL) -d -m $(DIRMODE) $$dir; \ + else true; \ + fi; \ + done +@@ -102,9 +111,7 @@ doinstall: $(SUBDIRS) + dir=$(DESTDIR)$(prefix)/$$d; \ + if test ! -d $$dir; then \ + echo "Creating directory hierarchy $$dir"; \ +- $(srcdir)/mkinstalldirs $$dir; \ +- chmod $(DIRMODE) $$dir; \ +- $(DIRSETGID) $$dir; \ ++ $(INSTALL) -d -m $(DIRMODE) $$dir; \ + else true; \ + fi; \ + done +@@ -114,9 +121,7 @@ doinstall: $(SUBDIRS) + dir=$(DESTDIR)$(exec_prefix)/$$d; \ + if test ! -d $$dir; then \ + echo "Creating directory hierarchy $$dir"; \ +- $(srcdir)/mkinstalldirs $$dir; \ +- chmod $(DIRMODE) $$dir; \ +- $(DIRSETGID) $$dir; \ ++ $(INSTALL) -d -m $(DIRMODE) $$dir; \ + else true; \ + fi; \ + done +diff --git a/bin/Makefile.in b/bin/Makefile.in +index 22c24b0..d795333 100644 +--- a/bin/Makefile.in ++++ b/bin/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -56,7 +55,7 @@ BUILDDIR= ../build/bin + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -72,8 +71,6 @@ install: + $(INSTALL) -m $(EXEMODE) $(BUILDDIR)/$$f $(DESTDIR)$(SCRIPTSDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/cron/Makefile.in b/cron/Makefile.in +index 2a7c8fd..c14d119 100644 +--- a/cron/Makefile.in ++++ b/cron/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -68,8 +67,6 @@ install: + $(INSTALL) -m $(EXEMODE) $(BUILDDIR)/$$f $(DESTDIR)$(CRONDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/messages/Makefile.in b/messages/Makefile.in +index 2bbec3f..0b8b7d6 100644 +--- a/messages/Makefile.in ++++ b/messages/Makefile.in +@@ -32,7 +32,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -43,7 +42,6 @@ OPT= @OPT@ + CFLAGS= $(OPT) $(DEFS) + PACKAGEDIR= $(prefix)/messages + SHELL= /bin/sh +-DIRSETGID= chmod g+s + MSGFMT= @PYTHON@ ../build/bin/msgfmt.py + MSGMERGE= msgmerge + +@@ -60,7 +58,7 @@ TARGETS= $(MOFILES) + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -90,9 +88,8 @@ doinstall: mofiles + do \ + dir=$(DESTDIR)$(prefix)/$$d; \ + echo "Creating language directory $$dir"; \ +- $(srcdir)/../mkinstalldirs $$dir; \ +- chmod $(DIRMODE) $$dir; \ +- $(DIRSETGID) $$dir; \ ++ $(INSTALL) -d -m $(DIRMODE) `dirname $$dir`; \ ++ $(INSTALL) -d -m $(DIRMODE) $$dir; \ + done + @for d in $(LANGUAGES); \ + do \ +@@ -113,8 +110,6 @@ doinstall: mofiles + + mofiles: $(MOFILES) + +-finish: +- + clean: + -rm -f */LC_MESSAGES/mailman.mo + +diff --git a/misc/Makefile.in b/misc/Makefile.in +index 5125cd8..af99c04 100644 +--- a/misc/Makefile.in ++++ b/misc/Makefile.in +@@ -30,7 +30,6 @@ var_prefix= @VAR_PREFIX@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + PYTHON= @PYTHON@ + +@@ -62,7 +61,7 @@ PACKAGES= $(EMAILPKG) $(JACODECSPKG) $(KOCODECSPKG) + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + DATAMODE= 664 +@@ -101,8 +100,6 @@ install-packages: + (cd $(PKGDIR)/$$p ; umask 02 ; PYTHONPATH=$(PYTHONLIBDIR) $(PYTHON) $(SETUPCMD)); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/scripts/Makefile.in b/scripts/Makefile.in +index 49b82ec..cea250c 100644 +--- a/scripts/Makefile.in ++++ b/scripts/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -49,7 +48,7 @@ SCRIPTS= bounces confirm driver join leave owner post request + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -68,8 +67,6 @@ install: + $(INSTALL) -m $(FILEMODE) $(srcdir)/join $(DESTDIR)$(SCRIPTSDIR)/subscribe + $(INSTALL) -m $(FILEMODE) $(srcdir)/leave $(DESTDIR)$(SCRIPTSDIR)/unsubscribe + +-finish: +- + clean: + + distclean: +diff --git a/src/Makefile.in b/src/Makefile.in +index ce52356..7ed820b 100644 +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -28,7 +28,6 @@ bindir= @bindir@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + PYTHON= @PYTHON@ + +@@ -65,10 +64,9 @@ COMMON_FLAGS= -DPREFIX="\"$(prefix)\"" \ + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 +-EXEMODE= 755 ++DIRMODE= 2775 ++EXEMODE= 2755 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +-DIRSETGID= chmod g+s + + # Fixed definitions + +@@ -112,20 +110,10 @@ install: all + do \ + exe=$(DESTDIR)$(CGIDIR)/$$f$(CGIEXT); \ + $(INSTALL_PROGRAM) $$f $$exe; \ +- $(DIRSETGID) $$exe; \ + done + for f in $(MAIL_PROGS); \ + do \ + $(INSTALL_PROGRAM) $$f $(DESTDIR)$(MAILDIR); \ +- $(DIRSETGID) $(DESTDIR)$(MAILDIR)/$$f; \ +- done +- +-finish: +- -for f in $(SUID_CGI_PROGS); \ +- do \ +- exe=$(DESTDIR)$(CGIDIR)/$$f$(CGIEXT); \ +- chown $(MAILMAN_USER) $$exe; \ +- chmod u+s $$exe; \ + done + + clean: +diff --git a/templates/Makefile.in b/templates/Makefile.in +index 3dfee3a..b23d7c1 100644 +--- a/templates/Makefile.in ++++ b/templates/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + TRUE= @TRUE@ + +@@ -48,7 +47,7 @@ LANGUAGES= ar ast ca cs da de el en es et eu fi fr gl he hr hu ia it ja \ + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -61,15 +60,13 @@ all: + install: + for d in $(LANGUAGES); \ + do \ +- $(srcdir)/../mkinstalldirs $(DESTDIR)$(TEMPLATEDIR)/$$d; \ ++ $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(TEMPLATEDIR)/$$d; \ + for f in $(srcdir)/$$d/*.html $(srcdir)/$$d/*.txt; \ + do \ + $(INSTALL) -m $(FILEMODE) $$f $(DESTDIR)$(TEMPLATEDIR)/$$d; \ + done; \ + done + +-finish: +- + clean: + + distclean: +diff --git a/tests/Makefile.in b/tests/Makefile.in +index 26d6e31..ca92425 100644 +--- a/tests/Makefile.in ++++ b/tests/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -46,7 +45,7 @@ EXECS= $(srcdir)/onebounce.py $(srcdir)/fblast.py + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -71,8 +70,6 @@ install: + (cd $$d; $(MAKE) DESTDIR=$(DESTDIR) install); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/tests/bounces/Makefile.in b/tests/bounces/Makefile.in +index 5798097..f7014cb 100644 +--- a/tests/bounces/Makefile.in ++++ b/tests/bounces/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -46,7 +45,7 @@ BOUNCE_FILES= $(srcdir)/*.txt + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -60,8 +59,6 @@ install: + $(INSTALL) -m $(FILEMODE) $$f $(DESTDIR)$(BOUNCEDIR); \ + done + +-finish: +- + clean: + + distclean: +diff --git a/tests/msgs/Makefile.in b/tests/msgs/Makefile.in +index 736d721..edef5ae 100644 +--- a/tests/msgs/Makefile.in ++++ b/tests/msgs/Makefile.in +@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@ + DESTDIR= + + CC= @CC@ +-CHMOD= @CHMOD@ + INSTALL= @INSTALL@ + + DEFS= @DEFS@ +@@ -46,7 +45,7 @@ MSG_FILES= $(srcdir)/*.txt + # Modes for directories and executables created by the install + # process. Default to group-writable directories but + # user-only-writable for executables. +-DIRMODE= 775 ++DIRMODE= 2775 + EXEMODE= 755 + FILEMODE= 644 + INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE) +@@ -60,8 +59,6 @@ install: + $(INSTALL) -m $(FILEMODE) $$f $(DESTDIR)$(MSGSDIR); \ + done + +-finish: +- + clean: + + distclean: diff --git a/mailman-2.1-mailmanctl-status.patch b/mailman-2.1-mailmanctl-status.patch new file mode 100644 index 0000000..c2bfbf8 --- /dev/null +++ b/mailman-2.1-mailmanctl-status.patch @@ -0,0 +1,109 @@ +diff --git a/bin/mailmanctl b/bin/mailmanctl +index fa14a2c..e291df1 100644 +--- a/bin/mailmanctl ++++ b/bin/mailmanctl +@@ -36,7 +36,7 @@ in the file data/master-qrunner.pid but you normally don't need to use this + pid directly. The `start', `stop', `restart', and `reopen' commands handle + everything for you. + +-Usage: %(PROGRAM)s [options] [ start | stop | restart | reopen ] ++Usage: %(PROGRAM)s [options] [ start | stop | restart | reopen | status ] + + Options: + +@@ -90,6 +90,9 @@ Commands: + + reopen - This will close all log files, causing them to be re-opened the + next time a message is written to them ++ ++ status - This returns a string indicating the status of the master ++ qrunner + """ + + import sys +@@ -190,6 +193,52 @@ def qrunner_state(): + return 0 + return 1 + ++def mailman_status(): ++ # return status, pid ++ # ++ # These status values match the /etc/init.d status values ++ # (at least on Red Hat), try to return equivalent status if possible ++ # status is 0 if running, ++ # status is 1 if dead but pid file exists ++ # status is 2 if dead but subsys locked ++ # status is 3 if stopped (pid returned will be 0) ++ # ++ # ++ # We want any user to be able to query the status and this presents ++ # few interesting permission problems and is why we don't use ++ # qrunner_state(). The pidfile is only readable by the mailman owner ++ # and group, however the lockfile is world readable. So we will ++ # get the master pid from the lockfile. We try to determine if the ++ # master process exists by sending it a signal. If we don't have ++ # permission to signal the process, but the process exists we'll ++ # get a EPERM error, if the process does not exist then we'll get ++ # a ESRCH error. ++ ++ try: ++ hostname, pid, tempfile = get_lock_data() ++ except IOError, e: ++ if e.errno == errno.ENOENT: ++ # Lock file didn't exist, can't be running ++ return 3, 0 ++ else: ++ raise ++ if hostname <> socket.gethostname(): ++ # not running on this host ++ return 3, 0 ++ # Find out if the process exists by calling kill with a signal 0. ++ try: ++ os.kill(pid, 0) ++ except OSError, e: ++ if e.errno == errno.ESRCH: ++ # process does not exist ++ return 1, pid ++ elif e.errno == errno.EPERM: ++ # we don't have permission signal the process but it exists ++ return 0, pid ++ else: ++ raise ++ return 0, pid ++ + + def acquire_lock_1(force): + # Be sure we can acquire the master qrunner lock. If not, it means some +@@ -338,13 +387,15 @@ def main(): + command = COMMASPACE.join(args) + usage(1, C_('Bad command: %(command)s')) + ++ command = args[0].lower() ++ + if checkprivs: + check_privs() + else: +- print C_('Warning! You may encounter permission problems.') ++ if command != 'status': ++ print C_('Warning! You may encounter permission problems.') + + # Handle the commands +- command = args[0].lower() + if command == 'stop': + # Sent the master qrunner process a SIGINT, which is equivalent to + # giving cron/qrunner a ctrl-c or KeyboardInterrupt. This will +@@ -363,6 +414,14 @@ def main(): + if not quiet: + print C_('Re-opening all log files') + kill_watcher(signal.SIGHUP) ++ elif command == 'status': ++ status, pid = mailman_status() ++ if not quiet: ++ if status == 0: ++ print C_("mailman (pid %(pid)d) is running...") ++ else: ++ print C_("mailman is stopped") ++ sys.exit(status) + elif command == 'start': + # First, complain loudly if there's no site list. + check_for_site_list() diff --git a/mailman-2.1.11-cron.patch b/mailman-2.1.11-cron.patch new file mode 100644 index 0000000..5585a0e --- /dev/null +++ b/mailman-2.1.11-cron.patch @@ -0,0 +1,132 @@ +diff --git a/cron/bumpdigests b/cron/bumpdigests +index 57cc45e..4002731 100755 +--- a/cron/bumpdigests ++++ b/cron/bumpdigests +@@ -1,4 +1,4 @@ +-#! @PYTHON@ ++#! @PYTHON@ -S + # + # Copyright (C) 1998-2018 by the Free Software Foundation, Inc. + # +diff --git a/cron/checkdbs b/cron/checkdbs +index e776f15..c4d8179 100755 +--- a/cron/checkdbs ++++ b/cron/checkdbs +@@ -1,4 +1,4 @@ +-#! @PYTHON@ ++#! @PYTHON@ -S + # + # Copyright (C) 1998-2018 by the Free Software Foundation, Inc. + # +diff --git a/cron/crontab.in.in b/cron/crontab.in.in +index 540dfc1..45c5022 100644 +--- a/cron/crontab.in.in ++++ b/cron/crontab.in.in +@@ -1,27 +1,50 @@ ++# ++# -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- ++# ------------------ EDIT THE CORRECT FILE ------------------------- ++# ++# This file is copied to /etc/cron.d/mailman from ++# @prefix@/cron/crontab.in when the mailman service is started via its ++# init.d script and the file /etc/cron.d/mailman is removed when the ++# service is stopped. Therefore any edits made directly to ++# /etc/cron.d/mailman will be lost anytime the mailman service ++# restarts. ++# ++# To make changes edit the master copy @prefix@/cron/crontab.in and then ++# restart the service to pick up the changes (/sbin/service mailman restart). ++# ++# The reason this is done this way is because the mailman cron jobs ++# should only be invoked if the mailman service is enabled and not ++# just as a consequence of installing the rpm as was the case ++# previously. The file /etc/cron.d/mailman cannot simply be linked to ++# the master copy in @prefix@/cron because for security reasons cron ++# will not process crontab files that are links or writeable by ++# anybody else but root, thus the file must be copied into /etc/cron.d ++# with the right ownership and permissions. ++# + # At 8AM every day, mail reminders to admins as to pending requests. + # They are less likely to ignore these reminders if they're mailed + # early in the morning, but of course, this is local time... ;) +-0 8 * * * @PYTHON@ -S @prefix@/cron/checkdbs ++0 8 * * * @MAILMAN_USER@ @prefix@/cron/checkdbs + # + # At 9AM, send notifications to disabled members that are due to be + # reminded to re-enable their accounts. +-0 9 * * * @PYTHON@ -S @prefix@/cron/disabled ++0 9 * * * @MAILMAN_USER@ @prefix@/cron/disabled + # + # Noon, mail digests for lists that do periodic as well as threshhold delivery. +-0 12 * * * @PYTHON@ -S @prefix@/cron/senddigests ++0 12 * * * @MAILMAN_USER@ @prefix@/cron/senddigests + # + # 5 AM on the first of each month, mail out password reminders. +-0 5 1 * * @PYTHON@ -S @prefix@/cron/mailpasswds ++0 5 1 * * @MAILMAN_USER@ @prefix@/cron/mailpasswds + # + # Every 5 mins, try to gate news to mail. You can comment this one out + # if you don't want to allow gating, or don't have any going on right now, + # or want to exclusively use a callback strategy instead of polling. +-0,5,10,15,20,25,30,35,40,45,50,55 * * * * @PYTHON@ -S @prefix@/cron/gate_news ++0,5,10,15,20,25,30,35,40,45,50,55 * * * * @MAILMAN_USER@ @prefix@/cron/gate_news + # + # At 3:27am every night, regenerate the gzip'd archive file. Only + # turn this on if the internal archiver is used and + # GZIP_ARCHIVE_TXT_FILES is false in mm_cfg.py +-27 3 * * * @PYTHON@ -S @prefix@/cron/nightly_gzip ++27 3 * * * @MAILMAN_USER@ @prefix@/cron/nightly_gzip + # + # At 4:30AM daily, cull old entries from the 'bad' and 'shunt' queues. +-30 4 * * * @PYTHON@ -S @prefix@/cron/cull_bad_shunt ++30 4 * * * @MAILMAN_USER@ @prefix@/cron/cull_bad_shunt +diff --git a/cron/disabled b/cron/disabled +index ac62582..971563d 100755 +--- a/cron/disabled ++++ b/cron/disabled +@@ -1,4 +1,4 @@ +-#! @PYTHON@ ++#! @PYTHON@ -S + # + # Copyright (C) 2001-2018 by the Free Software Foundation, Inc. + # +diff --git a/cron/gate_news b/cron/gate_news +index c66c09e..247c834 100755 +--- a/cron/gate_news ++++ b/cron/gate_news +@@ -1,4 +1,4 @@ +-#! @PYTHON@ ++#! @PYTHON@ -S + # + # Copyright (C) 1998-2018 by the Free Software Foundation, Inc. + # +diff --git a/cron/mailpasswds b/cron/mailpasswds +index da64376..5d8d792 100755 +--- a/cron/mailpasswds ++++ b/cron/mailpasswds +@@ -1,4 +1,4 @@ +-#! @PYTHON@ ++#! @PYTHON@ -S + # + # Copyright (C) 1998-2018 by the Free Software Foundation, Inc. + # +diff --git a/cron/nightly_gzip b/cron/nightly_gzip +index de493d0..8af0351 100755 +--- a/cron/nightly_gzip ++++ b/cron/nightly_gzip +@@ -1,4 +1,4 @@ +-#! @PYTHON@ ++#! @PYTHON@ -S + # + # Copyright (C) 1998-2018 by the Free Software Foundation, Inc. + # +diff --git a/cron/senddigests b/cron/senddigests +index edf27a2..c64adc1 100755 +--- a/cron/senddigests ++++ b/cron/senddigests +@@ -1,4 +1,4 @@ +-#! @PYTHON@ ++#! @PYTHON@ -S + # + # Copyright (C) 1998-2018 by the Free Software Foundation, Inc. + # diff --git a/mailman-2.1.12-multimail.patch b/mailman-2.1.12-multimail.patch new file mode 100644 index 0000000..5264a77 --- /dev/null +++ b/mailman-2.1.12-multimail.patch @@ -0,0 +1,387 @@ +diff -ruN mailman-2.1.12-a/configure.in mailman-2.1.12-b/configure.in +--- mailman-2.1.12-a/configure.in 2009-02-23 22:23:35.000000000 +0100 ++++ mailman-2.1.12-b/configure.in 2009-07-28 12:19:47.000000000 +0200 +@@ -249,26 +249,101 @@ + fi + + # new macro for finding group names +-AC_DEFUN([MM_FIND_GROUP_NAME], [ ++# returns a comma separated list of quoted group names ++# the list is returned in the same order as specified with any duplicates removed ++# the filter flag must be "yes" or "no", e.g. this is permcheck ++# "no" ==> none existing groups are not filtered out ++# "yes" ==> only those groups that are in the group database are included ++# in the list ++AC_DEFUN(MM_FIND_GROUP_LIST, [ + # $1 == variable name +-# $2 == user id to check for ++# $2 == white space separated list of groups to check, ++# list may contain mix of id's and names ++# $3 == filter, if == 'yes' then remove any non-existing groups + AC_SUBST($1) + changequote(,) + if test -z "$$1" + then + cat > conftest.py < conftest.py < conftest.py <gr_name) == 0) break; ++ } ++ ++ if (i >= numgroups) { ++ char *groupset = NULL; ++ size_t size = 0; ++ ++ for (i = 0; i < numgroups; i++) { ++ size += strlen(parentgroups[i]) + 2; ++ } ++ ++ groupset = malloc(size); ++ ++ if (groupset) { ++ groupset[0] = 0; ++ for (i = 0; i < numgroups; i++) { ++ strcat(groupset, parentgroups[i]); ++ if (i < numgroups-1) strcat(groupset, ", "); ++ } ++ } + +- if (strcmp(parentgroup, mygroup->gr_name)) + fatal(ident, GROUP_MISMATCH, +- "Group mismatch error. Mailman expected the %s\n" +- "wrapper script to be executed as group \"%s\", but\n" +- "the system's %s server executed the %s script as\n" +- "group \"%s\". Try tweaking the %s server to run the\n" +- "script as group \"%s\", or re-run configure, \n" +- "providing the command line option `%s=%s'.", +- wrapper, parentgroup, server, wrapper, mygroup->gr_name, +- server, parentgroup, option, mygroup->gr_name); ++ "Group mismatch error. Mailman expected the %s wrapper script to be\n" ++ "executed as one of the following groups:\n" ++ "[%s],\n" ++ "but the system's %s server executed the %s script as group: \"%s\".\n" ++ "Try tweaking the %s server to run the script as one of these groups:\n" ++ "[%s],\n" ++ "or re-run configure providing the command line option:\n" ++ "'%s=%s'.", ++ wrapper, groupset, server, wrapper, mygroup->gr_name, ++ server, groupset, option, mygroup->gr_name); ++ } + } + + +diff -ruN mailman-2.1.12-a/src/common.h mailman-2.1.12-b/src/common.h +--- mailman-2.1.12-a/src/common.h 2009-02-23 22:23:35.000000000 +0100 ++++ mailman-2.1.12-b/src/common.h 2009-07-28 12:19:47.000000000 +0200 +@@ -33,7 +33,7 @@ + #define GID_T GETGROUPS_T + + extern void fatal(const char*, int, char*, ...); +-extern void check_caller(const char*, const char*); ++extern void check_caller(const char* ident, const char**, size_t); + extern int run_script(const char*, int, char**, char**); + + /* Global variable used as a flag. */ +@@ -51,7 +51,7 @@ + #define MAIL_USAGE_ERROR 5 + #define MAIL_ILLEGAL_COMMAND 6 + #define ADDALIAS_USAGE_ERROR 7 +-#define GROUP_NAME_NOT_FOUND 8 ++#define GROUP_ID_NOT_FOUND 8 + + + /* +diff -ruN mailman-2.1.12-a/src/mail-wrapper.c mailman-2.1.12-b/src/mail-wrapper.c +--- mailman-2.1.12-a/src/mail-wrapper.c 2009-02-23 22:23:35.000000000 +0100 ++++ mailman-2.1.12-b/src/mail-wrapper.c 2009-07-28 12:19:47.000000000 +0200 +@@ -23,9 +23,9 @@ + /* Group name that your mail programs run as. See your mail server's + * documentation for details. + */ +-#define LEGAL_PARENT_GROUP MAIL_GROUP ++#define LEGAL_PARENT_GROUPS MAIL_GROUP + +-const char* parentgroup = LEGAL_PARENT_GROUP; ++const char* parentgroups[] = {LEGAL_PARENT_GROUPS}; + const char* logident = "Mailman mail-wrapper"; + + +@@ -74,7 +74,7 @@ + fatal(logident, MAIL_ILLEGAL_COMMAND, + "Illegal command: %s", argv[1]); + +- check_caller(logident, parentgroup); ++ check_caller(logident, parentgroups, sizeof(parentgroups) / sizeof(parentgroups[0])); + + /* If we got here, everything must be OK */ + status = run_script(argv[1], argc, argv, env); +diff -ruN mailman-2.1.12-a/src/Makefile.in mailman-2.1.12-b/src/Makefile.in +--- mailman-2.1.12-a/src/Makefile.in 2009-02-23 22:23:35.000000000 +0100 ++++ mailman-2.1.12-b/src/Makefile.in 2009-07-28 12:19:47.000000000 +0200 +@@ -49,9 +49,9 @@ + + SHELL= /bin/sh + +-MAIL_FLAGS= -DMAIL_GROUP="\"$(MAIL_GROUP)\"" ++MAIL_FLAGS= -DMAIL_GROUP='$(MAIL_GROUP)' + +-CGI_FLAGS= -DCGI_GROUP="\"$(CGI_GROUP)\"" ++CGI_FLAGS= -DCGI_GROUP='$(CGI_GROUP)' + + HELPFUL= -DHELPFUL + diff --git a/mailman-2.1.13-FHS.patch b/mailman-2.1.13-FHS.patch new file mode 100644 index 0000000..bb05f9f --- /dev/null +++ b/mailman-2.1.13-FHS.patch @@ -0,0 +1,243 @@ +diff --git a/Mailman/Defaults.py.in b/Mailman/Defaults.py.in +index fb3f4f3..7dde965 100644 +--- a/Mailman/Defaults.py.in ++++ b/Mailman/Defaults.py.in +@@ -1431,20 +1431,22 @@ AuthListPoster = 6 # List poster (Approved: header in posts only) + + # Useful directories + LIST_DATA_DIR = os.path.join(VAR_PREFIX, 'lists') +-LOG_DIR = os.path.join(VAR_PREFIX, 'logs') +-LOCK_DIR = os.path.join(VAR_PREFIX, 'locks') ++LOG_DIR = '@LOG_DIR@' ++LOCK_DIR = '@LOCK_DIR@' ++CONFIG_DIR = '@CONFIG_DIR@' + DATA_DIR = os.path.join(VAR_PREFIX, 'data') ++PID_DIR = '@PID_DIR@' + SPAM_DIR = os.path.join(VAR_PREFIX, 'spam') + WRAPPER_DIR = os.path.join(EXEC_PREFIX, 'mail') + BIN_DIR = os.path.join(PREFIX, 'bin') + SCRIPTS_DIR = os.path.join(PREFIX, 'scripts') +-TEMPLATE_DIR = os.path.join(PREFIX, 'templates') ++TEMPLATE_DIR = '@TEMPLATE_DIR@' + MESSAGES_DIR = os.path.join(PREFIX, 'messages') + PUBLIC_ARCHIVE_FILE_DIR = os.path.join(VAR_PREFIX, 'archives', 'public') + PRIVATE_ARCHIVE_FILE_DIR = os.path.join(VAR_PREFIX, 'archives', 'private') + + # Directories used by the qrunner subsystem +-QUEUE_DIR = os.path.join(VAR_PREFIX, 'qfiles') ++QUEUE_DIR = '@QUEUE_DIR@' + INQUEUE_DIR = os.path.join(QUEUE_DIR, 'in') + OUTQUEUE_DIR = os.path.join(QUEUE_DIR, 'out') + CMDQUEUE_DIR = os.path.join(QUEUE_DIR, 'commands') +@@ -1458,9 +1460,9 @@ RETRYQUEUE_DIR = os.path.join(QUEUE_DIR, 'retry') + MAILDIR_DIR = os.path.join(QUEUE_DIR, 'maildir') + + # Other useful files +-PIDFILE = os.path.join(DATA_DIR, 'master-qrunner.pid') +-SITE_PW_FILE = os.path.join(DATA_DIR, 'adm.pw') +-LISTCREATOR_PW_FILE = os.path.join(DATA_DIR, 'creator.pw') ++PIDFILE = os.path.join(PID_DIR, 'master-qrunner.pid') ++SITE_PW_FILE = os.path.join(CONFIG_DIR, 'adm.pw') ++LISTCREATOR_PW_FILE = os.path.join(CONFIG_DIR, 'creator.pw') + + # Import a bunch of version numbers + from Version import * +diff --git a/Mailman/MTA/Postfix.py b/Mailman/MTA/Postfix.py +index 801ddc0..8506b9b 100644 +--- a/Mailman/MTA/Postfix.py ++++ b/Mailman/MTA/Postfix.py +@@ -32,8 +32,8 @@ from Mailman.MTA.Utils import makealiases + from Mailman.Logging.Syslog import syslog + + LOCKFILE = os.path.join(mm_cfg.LOCK_DIR, 'creator') +-ALIASFILE = os.path.join(mm_cfg.DATA_DIR, 'aliases') +-VIRTFILE = os.path.join(mm_cfg.DATA_DIR, 'virtual-mailman') ++ALIASFILE = os.path.join(mm_cfg.CONFIG_DIR, 'aliases') ++VIRTFILE = os.path.join(mm_cfg.CONFIG_DIR, 'virtual-mailman') + # Desired mode for aliases(.db) and virtual-mailman(.db) for both creation + # and check_perms. + targetmode = S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH +diff --git a/Makefile.in b/Makefile.in +index eb40844..289aeee 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -28,6 +28,12 @@ bindir= @bindir@ + prefix= @prefix@ + exec_prefix= @exec_prefix@ + var_prefix= @VAR_PREFIX@ ++configdir= @CONFIG_DIR@ ++lockdir= @LOCK_DIR@ ++logdir= @LOG_DIR@ ++piddir= @PID_DIR@ ++queuedir= @QUEUE_DIR@ ++templatedir= @TEMPLATE_DIR@ + DESTDIR= + + CC= @CC@ +@@ -41,8 +47,11 @@ DEFS= @DEFS@ + OPT= @OPT@ + CFLAGS= @CFLAGS@ $(OPT) $(DEFS) + ++FHS_DIRS= \ ++ ${configdir} ${lockdir} ${logdir} ${piddir} ${queuedir} ${templatedir} ++ + VAR_DIRS= \ +- logs archives lists locks data spam qfiles \ ++ archives lists data spam \ + archives/private archives/public + + ARCH_INDEP_DIRS= \ +@@ -105,6 +114,15 @@ doinstall: $(SUBDIRS) + else true; \ + fi; \ + done ++ @for d in $(FHS_DIRS); \ ++ do \ ++ dir=$(DESTDIR)/$$d; \ ++ if test ! -d $$dir; then \ ++ echo "Creating directory $$dir"; \ ++ $(INSTALL) -d -m $(DIRMODE) $$dir; \ ++ else true; \ ++ fi; \ ++ done + chmod o-r $(DESTDIR)$(var_prefix)/archives/private + @for d in $(ARCH_INDEP_DIRS); \ + do \ +diff --git a/bin/check_perms b/bin/check_perms +index 137ebfb..1f45f84 100755 +--- a/bin/check_perms ++++ b/bin/check_perms +@@ -183,7 +183,8 @@ def checkall(): + print C_('checking mode for %(prefix)s') + dirs = {} + for d in (mm_cfg.PREFIX, mm_cfg.EXEC_PREFIX, mm_cfg.VAR_PREFIX, +- mm_cfg.LOG_DIR): ++ mm_cfg.CONFIG_DIR, mm_cfg.DATA_DIR, mm_cfg.LOCK_DIR, ++ mm_cfg.LOG_DIR, mm_cfg.QUEUE_DIR, mm_cfg.PID_DIR): + dirs[d] = True + for d in dirs.keys(): + try: +diff --git a/configure.in b/configure.in +index f2eb1c0..c01129c 100644 +--- a/configure.in ++++ b/configure.in +@@ -305,6 +305,72 @@ else + prefixcheck=$VAR_PREFIX + fi + ++# Get the configuration file directory ++AC_SUBST(CONFIG_DIR) ++AC_MSG_CHECKING(for --with-config-dir) ++AC_ARG_WITH(config-dir, dnl ++[ --with-config-dir specify directory for configuration data other than [VAR_]PREFIX/data]) ++case "$with_config_dir" in ++ yes|no|"") CONFIG_DIR="$VAR_PREFIX/data";; ++ *) CONFIG_DIR=$with_config_dir;; ++esac ++AC_MSG_RESULT($CONFIG_DIR) ++ ++# Get the lock directory ++AC_SUBST(LOCK_DIR) ++AC_MSG_CHECKING(for --with-lock-dir) ++AC_ARG_WITH(lock-dir, dnl ++[ --with-lock-dir specify directory for lock files other than [VAR_]PREFIX/locks]) ++case "$with_lock_dir" in ++ yes|no|"") LOCK_DIR="$VAR_PREFIX/locks";; ++ *) LOCK_DIR=$with_lock_dir;; ++esac ++AC_MSG_RESULT($LOCK_DIR) ++ ++# Get the log directory ++AC_SUBST(LOG_DIR) ++AC_MSG_CHECKING(for --with-log-dir) ++AC_ARG_WITH(log-dir, dnl ++[ --with-log-dir specify directory for log files other than [VAR_]PREFIX/logs]) ++case "$with_log_dir" in ++ yes|no|"") LOG_DIR="$VAR_PREFIX/logs";; ++ *) LOG_DIR=$with_log_dir;; ++esac ++AC_MSG_RESULT($LOG_DIR) ++ ++# Get the pid directory ++AC_SUBST(PID_DIR) ++AC_MSG_CHECKING(for --with-pid-dir) ++AC_ARG_WITH(pid-dir, dnl ++[ --with-pid-dir specify directory for the pid file other than [VAR_]PREFIX/data]) ++case "$with_pid_dir" in ++ yes|no|"") PID_DIR="$VAR_PREFIX/data";; ++ *) PID_DIR=$with_pid_dir;; ++esac ++AC_MSG_RESULT($PID_DIR) ++ ++# Get the queue directory ++AC_SUBST(QUEUE_DIR) ++AC_MSG_CHECKING(for --with-queue-dir) ++AC_ARG_WITH(queue-dir, dnl ++[ --with-queue-dir specify directory for queue files other than [VAR_]PREFIX/qfiles]) ++case "$with_queue_dir" in ++ yes|no|"") QUEUE_DIR="$VAR_PREFIX/qfiles";; ++ *) QUEUE_DIR=$with_queue_dir;; ++esac ++AC_MSG_RESULT($QUEUE_DIR) ++ ++# Get the template directory ++AC_SUBST(TEMPLATE_DIR) ++AC_MSG_CHECKING(for --with-template-dir) ++AC_ARG_WITH(template-dir, dnl ++[ --with-template-dir specify directory for template files other than [VAR_]PREFIX/templates]) ++case "$with_template_dir" in ++ yes|no|"") TEMPLATE_DIR="$VAR_PREFIX/templates";; ++ *) TEMPLATE_DIR=$with_template_dir;; ++esac ++AC_MSG_RESULT($TEMPLATE_DIR) ++ + # new macro for finding group names + # returns a comma separated list of quoted group names + # the list is returned in the same order as specified with any duplicates removed +diff --git a/misc/Makefile.in b/misc/Makefile.in +index af99c04..df50a06 100644 +--- a/misc/Makefile.in ++++ b/misc/Makefile.in +@@ -27,6 +27,12 @@ bindir= @bindir@ + prefix= @prefix@ + exec_prefix= @exec_prefix@ + var_prefix= @VAR_PREFIX@ ++configdir= @CONFIG_DIR@ ++lockdir= @LOCK_DIR@ ++logdir= @LOG_DIR@ ++piddir= @PID_DIR@ ++queuedir= @QUEUE_DIR@ ++MAILMAN_GROUP= @MAILMAN_GROUP@ + DESTDIR= + + CC= @CC@ +@@ -87,7 +93,7 @@ install-other: + $(INSTALL) -m $(FILEMODE) paths.py $$dir; \ + done + $(INSTALL) -m $(EXEMODE) mailman $(DESTDIR)$(SCRIPTSDIR) +- $(INSTALL) -m $(FILEMODE) sitelist.cfg $(DESTDIR)$(DATADIR) ++ $(INSTALL) -m $(FILEMODE) sitelist.cfg $(DESTDIR)$(configdir) + + install-packages: + if [ -z "$(EMAILPKG)" -a -d $(DESTDIR)$(PYTHONLIBDIR)/email ] ; \ +diff --git a/templates/Makefile.in b/templates/Makefile.in +index b23d7c1..16930a2 100644 +--- a/templates/Makefile.in ++++ b/templates/Makefile.in +@@ -25,6 +25,7 @@ srcdir= @srcdir@ + bindir= @bindir@ + prefix= @prefix@ + exec_prefix= @exec_prefix@ ++template_dir= @TEMPLATE_DIR@ + DESTDIR= + + CC= @CC@ +@@ -37,7 +38,7 @@ DEFS= @DEFS@ + + OPT= @OPT@ + CFLAGS= $(OPT) $(DEFS) +-TEMPLATEDIR= $(prefix)/templates ++TEMPLATEDIR= $(template_dir) + + SHELL= /bin/sh + diff --git a/mailman-2.1.13-archive-reply.patch b/mailman-2.1.13-archive-reply.patch new file mode 100644 index 0000000..7e1779b --- /dev/null +++ b/mailman-2.1.13-archive-reply.patch @@ -0,0 +1,21 @@ +diff -up mailman-2.1.13/templates/en/article.html.archive-reply mailman-2.1.13/templates/en/article.html +--- mailman-2.1.13/templates/en/article.html.archive-reply 2009-12-22 19:00:43.000000000 +0100 ++++ mailman-2.1.13/templates/en/article.html 2010-03-25 13:50:02.000000000 +0100 +@@ -4,7 +4,7 @@ + %(title)s + + +- ++ + +