On Wed 2016.03.23 at 13:27 +0000, Stuart Henderson wrote: > On 2016/03/23 08:48, Okan Demirmen wrote: > > I believe the cgi/mail wrapper check could actually look at the defined > > group membership instead. > > Oh this is a much better approach. I was considering rewriting the check > to allow any one of a hardcoded list, but that's a much better idea. > > I'm not using mailman myself but think this is a good way to do it.
dlg's comment to was use another group, _mailmanq; with that, here's an updated diff to go in the cgi/mail wrapper rewrite direction with a new group (of course mail/Makefile to be updated as well). Summary: - update to 2.1.21 - remove configure patch: hasn't been required since introducing --without-permcheck in configure - some of Defaults.py are now upstream defaults. - rewrite cgi/mail wrapper (check_caller()) to check calling uid against --with-cgi-gid/--with-mail-gid defined group. - no longer requires a FLAVOR for each mail/web server. Thanks, Okan Index: user.list =================================================================== RCS file: /cvs/ports/infrastructure/db/user.list,v retrieving revision 1.264 diff -u -p -r1.264 user.list --- user.list 4 Apr 2016 12:05:37 -0000 1.264 +++ user.list 4 Apr 2016 19:07:36 -0000 @@ -276,3 +276,4 @@ id user group port options 765 _hedgewars _hedgewars games/hedgewars 766 _kibana _kibana www/kibana 767 _squeezelite _squeezelite audio/squeezelite +768 _mailmanq mail/mailman Index: Makefile =================================================================== RCS file: /cvs/ports/mail/mailman/Makefile,v retrieving revision 1.83 diff -u -p -r1.83 Makefile --- Makefile 19 Mar 2016 10:31:44 -0000 1.83 +++ Makefile 4 Apr 2016 19:07:25 -0000 @@ -2,8 +2,7 @@ COMMENT= mailing list manager with web interface -DISTNAME= mailman-2.1.20 -REVISION= 0 +DISTNAME= mailman-2.1.21 CATEGORIES= mail www HOMEPAGE= https://www.gnu.org/software/mailman/ @@ -32,8 +31,6 @@ FAKE_FLAGS= DIRSETGID=":" # gnu still breaks the paths as prefix is actually mailman's home CONFIGURE_STYLE= simple -# do not use --without-permcheck as this requires the mailman user and group -# to exist, otherwise there will be problems running mailman CONFIGURE_ARGS+= --prefix='${MMHOME}' \ --with-mailhost=localhost.my.domain \ --with-python=${MODPY_BIN} \ @@ -41,19 +38,9 @@ CONFIGURE_ARGS+= --prefix='${MMHOME}' \ --with-var-prefix='${MMSPOOL}' \ --without-permcheck \ --with-username=_mailman \ - --with-groupname=_mailman - -FLAVORS= smtpd postfix sendmail -FLAVOR?= smtpd -.if ${FLAVOR:Mpostfix} -CONFIGURE_ARGS+=--with-mail-gid=_mailman -.elif ${FLAVOR:Msendmail} -CONFIGURE_ARGS+=--with-mail-gid=daemon -.elif ${FLAVOR:Msmtpd} -CONFIGURE_ARGS+=--with-mail-gid=_smtpd -.else -ERRORS+="Fatal: a flavor (smtpd, postfix, sendmail) must be specified" -.endif + --with-groupname=_mailman \ + --with-cgi-gid=_mailmanq \ + --with-mail-gid=_mailmanq SCRIPTS= Mailman/Archiver/pipermail.py \ Mailman/Post.py \ Index: distinfo =================================================================== RCS file: /cvs/ports/mail/mailman/distinfo,v retrieving revision 1.23 diff -u -p -r1.23 distinfo --- distinfo 9 Apr 2015 15:37:08 -0000 1.23 +++ distinfo 4 Apr 2016 19:07:25 -0000 @@ -1,2 +1,2 @@ -SHA256 (mailman-2.1.20.tgz) = UiwrXFq5E5j9+UmolhFiwxT2MjzRv+uQfg+y2IJ3cR8= -SIZE (mailman-2.1.20.tgz) = 9204867 +SHA256 (mailman-2.1.21.tgz) = /tM6GBVN6qToGiB5jIFEhe1LLl2LQs9tPVWGf/T3CEM= +SIZE (mailman-2.1.21.tgz) = 9266286 Index: patches/patch-Mailman_Defaults_py_in =================================================================== RCS file: /cvs/ports/mail/mailman/patches/patch-Mailman_Defaults_py_in,v retrieving revision 1.13 diff -u -p -r1.13 patch-Mailman_Defaults_py_in --- patches/patch-Mailman_Defaults_py_in 9 Apr 2015 15:37:08 -0000 1.13 +++ patches/patch-Mailman_Defaults_py_in 4 Apr 2016 19:07:25 -0000 @@ -1,27 +1,12 @@ $OpenBSD: patch-Mailman_Defaults_py_in,v 1.13 2015/04/09 15:37:08 okan Exp $ ---- Mailman/Defaults.py.in.orig Sat Feb 28 11:41:04 2015 -+++ Mailman/Defaults.py.in Sun Mar 22 11:55:07 2015 -@@ -539,7 +539,22 @@ SMTPPORT = 0 # de +--- Mailman/Defaults.py.in.orig Sun Feb 28 15:47:44 2016 ++++ Mailman/Defaults.py.in Sun Mar 20 11:21:13 2016 +@@ -554,7 +554,7 @@ SMTPPORT = 0 # de # Command for direct command pipe delivery to sendmail compatible program, # when DELIVERY_MODULE is 'Sendmail'. -SENDMAIL_CMD = '/usr/lib/sendmail' +SENDMAIL_CMD = '/usr/sbin/sendmail' -+ -+# Specify the type of passwords to use, when Mailman generates the passwords -+# itself, as would be the case for membership requests where the user did not -+# fill in a password, or during list creation, when auto-generation of admin -+# passwords was selected. -+# -+# Set this value to Yes for classic Mailman user-friendly(er) passwords. -+# These generate semi-pronounceable passwords which are easier to remember. -+# Set this value to No to use more cryptographically secure, but harder to -+# remember, passwords -- if your operating system and Python version support -+# the necessary feature (specifically that /dev/urandom be available). -+USER_FRIENDLY_PASSWORDS = Yes -+ -+# This value specifies the default lengths of member passwords -+MEMBER_PASSWORD_LENGTH = 8 # Set these variables if you need to authenticate to your NNTP server for # Usenet posting or reading. If no authentication is necessary, specify None Index: patches/patch-configure =================================================================== RCS file: patches/patch-configure diff -N patches/patch-configure --- patches/patch-configure 9 Apr 2015 15:37:08 -0000 1.11 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,115 +0,0 @@ -$OpenBSD: patch-configure,v 1.11 2015/04/09 15:37:08 okan Exp $ ---- configure.orig Tue May 6 12:43:56 2014 -+++ configure Sun Jan 11 10:37:11 2015 -@@ -3543,54 +3543,8 @@ USERNAME=$with_username - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USERNAME" >&5 - $as_echo "$USERNAME" >&6; } - --# User `mailman' must exist -+MAILMAN_USER=$with_username - --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for user name \"$USERNAME\"" >&5 --$as_echo_n "checking for user name \"$USERNAME\"... " >&6; } -- --# MAILMAN_USER == variable name --# $USERNAME == user id to check for -- -- --if test -z "$MAILMAN_USER" --then -- cat > conftest.py <<EOF --import pwd --uid = '' --for user in "$USERNAME".split(): -- try: -- try: -- uname = pwd.getpwuid(int(user))[0] -- break -- except ValueError: -- uname = pwd.getpwnam(user)[0] -- break -- except KeyError: -- uname = '' --fp = open("conftest.out", "w") --fp.write("%s\n" % uname) --fp.close() --EOF -- $PYTHON conftest.py -- MAILMAN_USER=`cat conftest.out` --fi -- --rm -f conftest.out conftest.py --if test -z "$MAILMAN_USER" --then -- if test "$with_permcheck" = "yes" -- then -- as_fn_error $? " --***** No \"$USERNAME\" user found! --***** Your system must have a \"$USERNAME\" user defined --***** (usually in your /etc/passwd file). Please see the INSTALL --***** file for details." "$LINENO" 5 -- fi --fi --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5 --$as_echo "okay" >&6; } -- -- - # Check for some other gid to use than `mailman' - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-groupname" >&5 - $as_echo_n "checking for --with-groupname... " >&6; } -@@ -3609,54 +3563,7 @@ GROUPNAME=$with_groupname - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROUPNAME" >&5 - $as_echo "$GROUPNAME" >&6; } - -- --# Target group must exist -- --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for group name \"$GROUPNAME\"" >&5 --$as_echo_n "checking for group name \"$GROUPNAME\"... " >&6; } -- --# MAILMAN_GROUP == variable name --# $GROUPNAME == user id to check for -- -- --if test -z "$MAILMAN_GROUP" --then -- cat > conftest.py <<EOF --import grp --gid = '' --for group in "$GROUPNAME".split(): -- try: -- try: -- gname = grp.getgrgid(int(group))[0] -- break -- except ValueError: -- gname = grp.getgrnam(group)[0] -- break -- except KeyError: -- gname = '' --fp = open("conftest.out", "w") --fp.write("%s\n" % gname) --fp.close() --EOF -- $PYTHON conftest.py -- MAILMAN_GROUP=`cat conftest.out` --fi -- --rm -f conftest.out conftest.py --if test -z "$MAILMAN_GROUP" --then -- if test "$with_permcheck" = "yes" -- then -- as_fn_error $? " --***** No \"$GROUPNAME\" group found! --***** Your system must have a \"$GROUPNAME\" group defined --***** (usually in your /etc/group file). Please see the INSTALL --***** file for details." "$LINENO" 5 -- fi --fi --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5 --$as_echo "okay" >&6; } -- -+MAILMAN_GROUP=$with_groupname - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking permissions on $prefixcheck" >&5 - $as_echo_n "checking permissions on $prefixcheck... " >&6; } Index: patches/patch-src_common_c =================================================================== RCS file: patches/patch-src_common_c diff -N patches/patch-src_common_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_common_c 4 Apr 2016 19:07:25 -0000 @@ -0,0 +1,78 @@ +$OpenBSD$ +--- src/common.c.orig Sun Feb 28 15:47:44 2016 ++++ src/common.c Sun Mar 20 16:22:35 2016 +@@ -119,45 +119,39 @@ fatal(const char* ident, int exitcode, char* format, . + void + check_caller(const char* ident, const char* parentgroup) + { +- GID_T mygid = getgid(); +- struct group *mygroup = getgrgid(mygid); +- char* option; +- char* server; ++ struct passwd *pw; ++ struct group *gr; ++ char **g; ++ int ok = 0; + char* wrapper; + +- if (running_as_cgi) { +- option = "--with-cgi-gid"; +- server = "web"; +- wrapper = "CGI"; +- } +- else { +- option = "--with-mail-gid"; +- server = "mail"; +- wrapper = "mail"; +- } ++ pw = getpwuid(getuid()); ++ if (pw == NULL) ++ fatal(ident, USER_NAME_NOT_FOUND, ++ "Failure to find username"); + +- if (!mygroup) +- fatal(ident, GROUP_NAME_NOT_FOUND, +- "Failure to find group name for GID %d. Mailman\n" +- "expected the %s wrapper to be executed as group\n" +- "\"%s\", but the system's %s server executed the\n" +- "wrapper as GID %d for which the name could not be\n" +- "found. Try adding GID %d to your system as \"%s\",\n" +- "or tweak your %s server to run the wrapper as group\n" +- "\"%s\".", +- mygid, wrapper, parentgroup, server, mygid, mygid, +- parentgroup, server, parentgroup); ++ gr = getgrnam(parentgroup); ++ if (gr == NULL) ++ fatal(ident, GROUP_NAME_NOT_FOUND, ++ "Failure to find \"%s\" group", parentgroup); + +- 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); ++ for (g = gr->gr_mem; *g; g++) { ++ if (strcmp(pw->pw_name, *g) == 0) { ++ ok = 1; ++ break; ++ } ++ } ++ ++ if (running_as_cgi) ++ wrapper = "CGI"; ++ else ++ wrapper = "mail"; ++ ++ if (ok == 0) ++ fatal(ident, GROUP_MISMATCH, ++ "Group mismatch error. Mailman expected the %s\n" ++ "wrapper script to be executed by a member of\n" ++ "\"%s\" group.", wrapper, parentgroup); + } + + Index: patches/patch-src_common_h =================================================================== RCS file: patches/patch-src_common_h diff -N patches/patch-src_common_h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_common_h 4 Apr 2016 19:07:25 -0000 @@ -0,0 +1,19 @@ +$OpenBSD$ +--- src/common.h.orig Sun Mar 20 13:48:18 2016 ++++ src/common.h Sun Mar 20 13:53:00 2016 +@@ -27,6 +27,7 @@ + #include <errno.h> + #include <sys/types.h> + #include <grp.h> ++#include <pwd.h> + #include <unistd.h> + + /* GETGROUPS_T gets set in the makefile by configure */ +@@ -52,6 +53,7 @@ extern const char* logident; + #define MAIL_ILLEGAL_COMMAND 6 + #define ADDALIAS_USAGE_ERROR 7 + #define GROUP_NAME_NOT_FOUND 8 ++#define USER_NAME_NOT_FOUND 9 + + + /* Index: pkg/DESCR =================================================================== RCS file: /cvs/ports/mail/mailman/pkg/DESCR,v retrieving revision 1.3 diff -u -p -r1.3 DESCR --- pkg/DESCR 22 Nov 2014 22:56:42 -0000 1.3 +++ pkg/DESCR 4 Apr 2016 19:07:25 -0000 @@ -30,8 +30,3 @@ mailing list manager, and more: - An extensible mail delivery pipeline. - Support for virtual domains. - -Flavors: - The default flavor makes the mailwrapper run in group _smtpd, for smtpd - postfix - makes the mailwrapper run in group _mailman, for postfix - sendmail - makes the mailwrapper run in group daemon, for sendmail Index: pkg/PLIST =================================================================== RCS file: /cvs/ports/mail/mailman/pkg/PLIST,v retrieving revision 1.25 diff -u -p -r1.25 PLIST --- pkg/PLIST 9 Apr 2015 15:37:08 -0000 1.25 +++ pkg/PLIST 4 Apr 2016 19:07:25 -0000 @@ -1,6 +1,10 @@ @comment $OpenBSD: PLIST,v 1.25 2015/04/09 15:37:08 okan Exp $ +@pkgpath mail/mailman,postfix +@pkgpath mail/mailman,sendmail +@pkgpath mail/mailman,smtpd @newgroup _mailman:504 @newuser _mailman:504:_mailman:daemon:Mailing List Manager:${PREFIX}/lib/mailman:/sbin/nologin +@newgroup _mailmanq:768 @extraunexec rm -fr /var/spool/mailman/* @owner _mailman @group _mailman @@ -902,6 +906,7 @@ lib/mailman/templates/da/verify.txt @mode 775 lib/mailman/templates/de/ @mode +lib/mailman/templates/de/adminaddrchgack.txt lib/mailman/templates/de/admindbdetails.html lib/mailman/templates/de/admindbpreamble.html lib/mailman/templates/de/admindbsummary.html @@ -1794,9 +1799,6 @@ lib/mailman/templates/no/verify.txt @mode 775 lib/mailman/templates/pl/ @mode -lib/mailman/templates/pl/admindbdetails.html -lib/mailman/templates/pl/admindbpreamble.html -lib/mailman/templates/pl/admindbsummary.html lib/mailman/templates/pl/adminsubscribeack.txt lib/mailman/templates/pl/adminunsubscribeack.txt lib/mailman/templates/pl/admlogin.html @@ -1812,11 +1814,9 @@ lib/mailman/templates/pl/archtocnombox.h lib/mailman/templates/pl/article.html lib/mailman/templates/pl/bounce.txt lib/mailman/templates/pl/checkdbs.txt -lib/mailman/templates/pl/convert.txt lib/mailman/templates/pl/cronpass.txt lib/mailman/templates/pl/disabled.txt lib/mailman/templates/pl/emptyarchive.html -lib/mailman/templates/pl/headfoot.html lib/mailman/templates/pl/help.txt lib/mailman/templates/pl/invite.txt lib/mailman/templates/pl/listinfo.html Index: pkg/README =================================================================== RCS file: /cvs/ports/mail/mailman/pkg/README,v retrieving revision 1.4 diff -u -p -r1.4 README --- pkg/README 19 Mar 2016 10:29:03 -0000 1.4 +++ pkg/README 4 Apr 2016 19:07:25 -0000 @@ -11,6 +11,8 @@ OpenBSD specific comments added. It's a 1) Final Steps for Installation +- Add your MTA and web server user to the _mailmanq group. + - Configure your web server to give $mailmandir/cgi-bin permission to run CGI scripts by adding @@ -175,13 +177,10 @@ system and version of Python. more information. - Problem: The mail wrapper programs are logging complaints about the - wrong GID. + Problem: The cgi and mail wrapper programs are logging complaints + about group mismatch. - Solution: The mail wrappers have a compiled-in GID check. Packages are - available for postfix/smtpd/sendmail, pkg_add will ask you which - to use. If you change MTA, uninstall the mailman package and - pkg_add a new one. + Solution: Add your MTA and web server user to the _mailmanq group. Problem: I send mail to the list, and get back mail saying,