/[smecontribs]/rpms/mailman/contribs10/mailman-2.1.12-multimail.patch
ViewVC logotype

Contents of /rpms/mailman/contribs10/mailman-2.1.12-multimail.patch

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Mon Feb 22 15:33:51 2021 UTC (3 years, 9 months ago) by brianr
Branch: MAIN
CVS Tags: HEAD
Initial import

1 diff -ruN mailman-2.1.12-a/configure.in mailman-2.1.12-b/configure.in
2 --- mailman-2.1.12-a/configure.in 2009-02-23 22:23:35.000000000 +0100
3 +++ mailman-2.1.12-b/configure.in 2009-07-28 12:19:47.000000000 +0200
4 @@ -249,26 +249,101 @@
5 fi
6
7 # new macro for finding group names
8 -AC_DEFUN([MM_FIND_GROUP_NAME], [
9 +# returns a comma separated list of quoted group names
10 +# the list is returned in the same order as specified with any duplicates removed
11 +# the filter flag must be "yes" or "no", e.g. this is permcheck
12 +# "no" ==> none existing groups are not filtered out
13 +# "yes" ==> only those groups that are in the group database are included
14 +# in the list
15 +AC_DEFUN(MM_FIND_GROUP_LIST, [
16 # $1 == variable name
17 -# $2 == user id to check for
18 +# $2 == white space separated list of groups to check,
19 +# list may contain mix of id's and names
20 +# $3 == filter, if == 'yes' then remove any non-existing groups
21 AC_SUBST($1)
22 changequote(,)
23 if test -z "$$1"
24 then
25 cat > conftest.py <<EOF
26 import grp
27 -gid = ''
28 +group_names = []
29 +seen = {}
30 +filter = "$3"
31 +
32 for group in "$2".split():
33 try:
34 + gid = int(group)
35 + try:
36 + gname = grp.getgrgid(gid)[0]
37 + except KeyError:
38 + gname = ''
39 + except ValueError:
40 try:
41 - gname = grp.getgrgid(int(group))[0]
42 - break
43 - except ValueError:
44 gname = grp.getgrnam(group)[0]
45 + except KeyError:
46 + if filter == "yes":
47 + gname = ''
48 + else:
49 + gname = group
50 + if gname:
51 + if gname not in seen:
52 + seen[gname] = 1
53 + group_names.append(gname)
54 +
55 +if group_names:
56 + val = '"' + '", "'.join(group_names) + '"'
57 + #val = "'"+val+"'"
58 +else:
59 + val = ''
60 +
61 +fp = open("conftest.out", "w")
62 +fp.write("%s\n" % val)
63 +fp.close()
64 +EOF
65 + $PYTHON conftest.py
66 + $1=`cat conftest.out`
67 +fi
68 +changequote([, ])
69 +rm -f conftest.out conftest.py])
70 +
71 +
72 +# new macro for finding group names
73 +AC_DEFUN(MM_FIND_GROUP_NAME, [
74 +# Given a list of tokens, either a name or a number (gid)
75 +# return the first one in the list that is found in the
76 +# group database. The return value is always a name, possibly
77 +# translated from a gid. If permcheck is "no" then the group
78 +# database is not checked, instead the first token in the list
79 +# which is a name is returned (e.g. the default value). If permcheck
80 +# is no and only gid's are in the list then the null string is returned.
81 +# $1 == variable name
82 +# $2 == group id to check for
83 +# $3 == permcheck, either "yes" or "no"
84 +AC_SUBST($1)
85 +changequote(,)
86 +if test -z "$$1"
87 +then
88 + cat > conftest.py <<EOF
89 +import grp
90 +gname=''
91 +if "$3" == "yes":
92 + for group in "$2".split():
93 + try:
94 + try:
95 + gname = grp.getgrgid(int(group))[0]
96 + break
97 + except ValueError:
98 + gname = grp.getgrnam(group)[0]
99 + break
100 + except KeyError:
101 + gname = ''
102 +else:
103 + for group in "$2".split():
104 + try:
105 + int(group)
106 + except ValueError:
107 + gname = group
108 break
109 - except KeyError:
110 - gname = ''
111 fp = open("conftest.out", "w")
112 fp.write("%s\n" % gname)
113 fp.close()
114 @@ -282,25 +357,41 @@
115
116 # new macro for finding UIDs
117 AC_DEFUN([MM_FIND_USER_NAME], [
118 +# Given a list of tokens, either a name or a number (uid)
119 +# return the first one in the list that is found in the
120 +# password database. The return value is always a name, possibly
121 +# translated from a uid. If permcheck is "no" then the password
122 +# database is not checked, instead the first token in the list
123 +# which is a name is returned (e.g. the default value). If permcheck
124 +# is no and only uid's are in the list then the null string is returned.
125 # $1 == variable name
126 # $2 == user id to check for
127 +# $3 == permcheck, either "yes" or "no"
128 AC_SUBST($1)
129 changequote(,)
130 if test -z "$$1"
131 then
132 cat > conftest.py <<EOF
133 import pwd
134 -uid = ''
135 -for user in "$2".split():
136 - try:
137 +uname=''
138 +if "$3" == "yes":
139 + for user in "$2".split():
140 try:
141 - uname = pwd.getpwuid(int(user))[0]
142 - break
143 + try:
144 + uname = pwd.getpwuid(int(user))[0]
145 + break
146 + except ValueError:
147 + uname = pwd.getpwnam(user)[0]
148 + break
149 + except KeyError:
150 + uname = ''
151 +else:
152 + for user in "$2".split():
153 + try:
154 + int(user)
155 except ValueError:
156 - uname = pwd.getpwnam(user)[0]
157 + uname = user
158 break
159 - except KeyError:
160 - uname = ''
161 fp = open("conftest.out", "w")
162 fp.write("%s\n" % uname)
163 fp.close()
164 @@ -326,7 +417,7 @@
165 # User `mailman' must exist
166 AC_SUBST(MAILMAN_USER)
167 AC_MSG_CHECKING(for user name \"$USERNAME\")
168 -MM_FIND_USER_NAME(MAILMAN_USER, $USERNAME)
169 +MM_FIND_USER_NAME(MAILMAN_USER, $USERNAME, $with_permcheck)
170 if test -z "$MAILMAN_USER"
171 then
172 if test "$with_permcheck" = "yes"
173 @@ -357,7 +448,7 @@
174 # Target group must exist
175 AC_SUBST(MAILMAN_GROUP)
176 AC_MSG_CHECKING(for group name \"$GROUPNAME\")
177 -MM_FIND_GROUP_NAME(MAILMAN_GROUP, $GROUPNAME)
178 +MM_FIND_GROUP_NAME(MAILMAN_GROUP, $GROUPNAME, $with_permcheck)
179 if test -z "$MAILMAN_GROUP"
180 then
181 if test "$with_permcheck" = "yes"
182 @@ -380,11 +471,11 @@
183 prefix = "$prefixcheck"
184 groupname = "$GROUPNAME"
185 mailmangroup = "$MAILMAN_GROUP"
186 -try:
187 - mailmangid = grp.getgrnam(mailmangroup)[2]
188 -except KeyError:
189 - mailmangid = -1
190 problems = []
191 +try: mailmangid = grp.getgrnam(mailmangroup)[2]
192 +except KeyError:
193 + problems.append("group doesn't exist: " + mailmangroup)
194 + mailmangid = 41
195 try: statdata = os.stat(prefix)
196 except OSError:
197 problems.append("Directory doesn't exist: " + prefix)
198 @@ -434,7 +525,7 @@
199 then
200 with_mail_gid="mailman other mail daemon"
201 fi
202 -MM_FIND_GROUP_NAME(MAIL_GROUP, $with_mail_gid)
203 +MM_FIND_GROUP_LIST(MAIL_GROUP, $with_mail_gid, $with_permcheck)
204 if test -z "$MAIL_GROUP"
205 then
206 if test "$with_permcheck" = "yes"
207 @@ -461,7 +552,7 @@
208 with_cgi_gid="www www-data nobody"
209 fi
210
211 -MM_FIND_GROUP_NAME(CGI_GROUP, $with_cgi_gid)
212 +MM_FIND_GROUP_LIST(CGI_GROUP, $with_cgi_gid, $with_permcheck)
213 if test -z "$CGI_GROUP"
214 then
215 if test "$with_permcheck" = "yes"
216 diff -ruN mailman-2.1.12-a/src/cgi-wrapper.c mailman-2.1.12-b/src/cgi-wrapper.c
217 --- mailman-2.1.12-a/src/cgi-wrapper.c 2009-02-23 22:23:35.000000000 +0100
218 +++ mailman-2.1.12-b/src/cgi-wrapper.c 2009-07-28 12:19:47.000000000 +0200
219 @@ -28,11 +28,11 @@
220 /* Group name that CGI scripts run as. See your web server's documentation
221 * for details.
222 */
223 -#define LEGAL_PARENT_GROUP CGI_GROUP
224 +#define LEGAL_PARENT_GROUPS CGI_GROUP
225
226 const char* logident = LOG_IDENT;
227 char* script = SCRIPTNAME;
228 -const char* parentgroup = LEGAL_PARENT_GROUP;
229 +const char* parentgroups[] = {LEGAL_PARENT_GROUPS};
230
231
232 int
233 @@ -42,7 +42,7 @@
234 char* fake_argv[3];
235
236 running_as_cgi = 1;
237 - check_caller(logident, parentgroup);
238 + check_caller(logident, parentgroups, sizeof(parentgroups) / sizeof(parentgroups[0]));
239
240 /* For these CGI programs, we can ignore argc and argv since they
241 * don't contain anything useful. `script' will always be the driver
242 diff -ruN mailman-2.1.12-a/src/common.c mailman-2.1.12-b/src/common.c
243 --- mailman-2.1.12-a/src/common.c 2009-02-23 22:23:35.000000000 +0100
244 +++ mailman-2.1.12-b/src/common.c 2009-07-28 12:19:47.000000000 +0200
245 @@ -117,13 +117,14 @@
246 /* Is the parent process allowed to call us?
247 */
248 void
249 -check_caller(const char* ident, const char* parentgroup)
250 +check_caller(const char* ident, const char** parentgroups, size_t numgroups)
251 {
252 GID_T mygid = getgid();
253 struct group *mygroup = getgrgid(mygid);
254 char* option;
255 char* server;
256 char* wrapper;
257 + int i;
258
259 if (running_as_cgi) {
260 option = "--with-cgi-gid";
261 @@ -136,28 +137,46 @@
262 wrapper = "mail";
263 }
264
265 - if (!mygroup)
266 - fatal(ident, GROUP_NAME_NOT_FOUND,
267 - "Failure to find group name for GID %d. Mailman\n"
268 - "expected the %s wrapper to be executed as group\n"
269 - "\"%s\", but the system's %s server executed the\n"
270 - "wrapper as GID %d for which the name could not be\n"
271 - "found. Try adding GID %d to your system as \"%s\",\n"
272 - "or tweak your %s server to run the wrapper as group\n"
273 - "\"%s\".",
274 - mygid, wrapper, parentgroup, server, mygid, mygid,
275 - parentgroup, server, parentgroup);
276 + if (!mygroup)
277 + fatal(ident, GROUP_ID_NOT_FOUND,
278 + "Failure to lookup via getgrgid() the group info for group id %d that this Mailman %s wrapper is executing under.\n"
279 + "This is probably due to an incorrectly configured system and is not a Mailman problem",
280 + mygid, wrapper);
281 +
282 + for (i = 0; i < numgroups; i++) {
283 + if (strcmp(parentgroups[i], mygroup->gr_name) == 0) break;
284 + }
285 +
286 + if (i >= numgroups) {
287 + char *groupset = NULL;
288 + size_t size = 0;
289 +
290 + for (i = 0; i < numgroups; i++) {
291 + size += strlen(parentgroups[i]) + 2;
292 + }
293 +
294 + groupset = malloc(size);
295 +
296 + if (groupset) {
297 + groupset[0] = 0;
298 + for (i = 0; i < numgroups; i++) {
299 + strcat(groupset, parentgroups[i]);
300 + if (i < numgroups-1) strcat(groupset, ", ");
301 + }
302 + }
303
304 - if (strcmp(parentgroup, mygroup->gr_name))
305 fatal(ident, GROUP_MISMATCH,
306 - "Group mismatch error. Mailman expected the %s\n"
307 - "wrapper script to be executed as group \"%s\", but\n"
308 - "the system's %s server executed the %s script as\n"
309 - "group \"%s\". Try tweaking the %s server to run the\n"
310 - "script as group \"%s\", or re-run configure, \n"
311 - "providing the command line option `%s=%s'.",
312 - wrapper, parentgroup, server, wrapper, mygroup->gr_name,
313 - server, parentgroup, option, mygroup->gr_name);
314 + "Group mismatch error. Mailman expected the %s wrapper script to be\n"
315 + "executed as one of the following groups:\n"
316 + "[%s],\n"
317 + "but the system's %s server executed the %s script as group: \"%s\".\n"
318 + "Try tweaking the %s server to run the script as one of these groups:\n"
319 + "[%s],\n"
320 + "or re-run configure providing the command line option:\n"
321 + "'%s=%s'.",
322 + wrapper, groupset, server, wrapper, mygroup->gr_name,
323 + server, groupset, option, mygroup->gr_name);
324 + }
325 }
326
327
328 diff -ruN mailman-2.1.12-a/src/common.h mailman-2.1.12-b/src/common.h
329 --- mailman-2.1.12-a/src/common.h 2009-02-23 22:23:35.000000000 +0100
330 +++ mailman-2.1.12-b/src/common.h 2009-07-28 12:19:47.000000000 +0200
331 @@ -33,7 +33,7 @@
332 #define GID_T GETGROUPS_T
333
334 extern void fatal(const char*, int, char*, ...);
335 -extern void check_caller(const char*, const char*);
336 +extern void check_caller(const char* ident, const char**, size_t);
337 extern int run_script(const char*, int, char**, char**);
338
339 /* Global variable used as a flag. */
340 @@ -51,7 +51,7 @@
341 #define MAIL_USAGE_ERROR 5
342 #define MAIL_ILLEGAL_COMMAND 6
343 #define ADDALIAS_USAGE_ERROR 7
344 -#define GROUP_NAME_NOT_FOUND 8
345 +#define GROUP_ID_NOT_FOUND 8
346
347
348 /*
349 diff -ruN mailman-2.1.12-a/src/mail-wrapper.c mailman-2.1.12-b/src/mail-wrapper.c
350 --- mailman-2.1.12-a/src/mail-wrapper.c 2009-02-23 22:23:35.000000000 +0100
351 +++ mailman-2.1.12-b/src/mail-wrapper.c 2009-07-28 12:19:47.000000000 +0200
352 @@ -23,9 +23,9 @@
353 /* Group name that your mail programs run as. See your mail server's
354 * documentation for details.
355 */
356 -#define LEGAL_PARENT_GROUP MAIL_GROUP
357 +#define LEGAL_PARENT_GROUPS MAIL_GROUP
358
359 -const char* parentgroup = LEGAL_PARENT_GROUP;
360 +const char* parentgroups[] = {LEGAL_PARENT_GROUPS};
361 const char* logident = "Mailman mail-wrapper";
362
363
364 @@ -74,7 +74,7 @@
365 fatal(logident, MAIL_ILLEGAL_COMMAND,
366 "Illegal command: %s", argv[1]);
367
368 - check_caller(logident, parentgroup);
369 + check_caller(logident, parentgroups, sizeof(parentgroups) / sizeof(parentgroups[0]));
370
371 /* If we got here, everything must be OK */
372 status = run_script(argv[1], argc, argv, env);
373 diff -ruN mailman-2.1.12-a/src/Makefile.in mailman-2.1.12-b/src/Makefile.in
374 --- mailman-2.1.12-a/src/Makefile.in 2009-02-23 22:23:35.000000000 +0100
375 +++ mailman-2.1.12-b/src/Makefile.in 2009-07-28 12:19:47.000000000 +0200
376 @@ -49,9 +49,9 @@
377
378 SHELL= /bin/sh
379
380 -MAIL_FLAGS= -DMAIL_GROUP="\"$(MAIL_GROUP)\""
381 +MAIL_FLAGS= -DMAIL_GROUP='$(MAIL_GROUP)'
382
383 -CGI_FLAGS= -DCGI_GROUP="\"$(CGI_GROUP)\""
384 +CGI_FLAGS= -DCGI_GROUP='$(CGI_GROUP)'
385
386 HELPFUL= -DHELPFUL
387

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed