This commit is contained in:
io 2005-01-22 03:52:04 +00:00
parent 3bda5229b3
commit c44dcd1a9a
9 changed files with 2525 additions and 0 deletions

View file

@ -0,0 +1,19 @@
Source:
http://rucus.ru.ac.za/~guy/ezmlm/contrib/
all ezmlm-pm-patchs refer to Mail::Ezmlm -> ignored
1) ezmlm-web-andrew-pam-20030520.txt
- tooltip texts -> this is already fixed
- xhtml-tags in lowercase -> fixed in rev 26
2) ezmlm-web-andrew-pam-20040526.txt
- untaint mail-adresses -> better suited for Mail::Ezmlm -> ignored
3) ezmlm-web-gordon-rowell-20011024.txt
- delete only allowd, if user may create lists -> ignored
4) ezmlm-web-jose-celestino-20020208.txt
- support for newsletters -> ignored (for now)
- domain-based acl -> ignored
- filtered subscribers list for huge lists -> ignored (for now)

View file

@ -0,0 +1,79 @@
From ledjon@ledjon.com Fri Mar 12 00:03:27 2004
Return-Path: <ledjon@ledjon.com>
Delivered-To: guy-ezmlm@rucus.ru.ac.za
Received: (qmail 56152 invoked by uid 1025); 11 Mar 2004 22:03:27 -0000
Received: (qmail-scanner-1.20rc3 56151 invoked by uid 82); 11 Mar 2004 22:03:27 -0000
Received: from 69-56-199-178.theplanet.com (HELO wylde.ledhosting.com) (69.56.199.178)
by server.rucus.ru.ac.za with SMTP; 11 Mar 2004 22:03:24 -0000
Received: (qmail 25788 invoked from network); 11 Mar 2004 17:03:18 -0500
Received: from atlnga1-ar3-4-64-009-109.atlnga1.dsl-verizon.net (HELO page) (4.64.9.109)
by 69-56-199-178.theplanet.com with SMTP; 11 Mar 2004 17:03:18 -0500
From: "Jon Coulter" <ledjon@ledjon.com>
To: <guy-ezmlm@rucus.ru.ac.za>
Subject: Mail::Ezmlm Patch
Date: Thu, 11 Mar 2004 17:03:24 -0500
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_NextPart_000_0000_01C4078A.C44C42F0"
X-Mailer: Microsoft Office Outlook, Build 11.0.5510
Thread-Index: AcQHtKkecjFWE5llQ6aIAIPcXCJAog==
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
X-Qmail-Scanner-Message-ID: <107904260763856141@server.rucus.ru.ac.za>
Status: RO
Content-Length: 1642
This is a multi-part message in MIME format.
------=_NextPart_000_0000_01C4078A.C44C42F0
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
Your (quite wonderful) Mail::Ezmlm perl module has a bug in that I patched
some time ago for my own use, so I figured I'd go ahead and send it along to
you.
Basically it does something to the effect of 'return @array || undef' which
forces a scalar return (making it return @array as the number of items in
the array, rather then the items themselves)
This just replaces it with a trinary operator.
Feel free to use or ignore it at your own will. Thanks.
Jon Coulter
ledjon@ledjon.com
------=_NextPart_000_0000_01C4078A.C44C42F0
Content-Type: application/octet-stream;
name="Ezmlm.pm.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="Ezmlm.pm.patch"
*** /usr/lib/perl5/site_perl/5.8.0/Mail/Ezmlm.pm~ Wed Jul 16 00:44:01 =
2003=0A=
--- /usr/lib/perl5/site_perl/5.8.0/Mail/Ezmlm.pm Wed Jul 16 00:54:22 2003=0A=
***************=0A=
*** 245,251 ****=0A=
=0A=
if($?) {=0A=
$self->_seterror($?, 'error during ezmlm-list in =
subscribers()'); =0A=
! return @subscribers || undef;=0A=
} else {=0A=
$self->_seterror(undef);=0A=
return @subscribers; =0A=
--- 245,251 ----=0A=
=0A=
if($?) {=0A=
$self->_seterror($?, 'error during ezmlm-list in =
subscribers()'); =0A=
! return (scalar @subscribers ? @subscribers : undef);=0A=
} else {=0A=
$self->_seterror(undef);=0A=
return @subscribers; =0A=
------=_NextPart_000_0000_01C4078A.C44C42F0--

View file

@ -0,0 +1,52 @@
From lbraeuer@mpex.net Fri Mar 5 17:03:07 2004
Return-Path: <lbraeuer@mpex.net>
Delivered-To: guy-ezmlm@rucus.net
Received: (qmail 49433 invoked by uid 1025); 5 Mar 2004 15:03:07 -0000
Received: (qmail-scanner-1.20rc3 49432 invoked by uid 82); 05 Mar 2004 15:03:07 -0000
Received: from endo.mpex.net (80.190.108.11)
by server.rucus.ru.ac.za with SMTP; 5 Mar 2004 15:03:04 -0000
Received: (qmail 21499 invoked by uid 509); 5 Mar 2004 15:02:59 -0000
Received: from unknown (HELO mpex.net) (217.225.11.124)
by 0 with SMTP; 5 Mar 2004 15:02:59 -0000
Message-ID: <404896A9.8030606@mpex.net>
Date: Fri, 05 Mar 2004 16:03:05 +0100
From: Lars Braeuer <lbraeuer@mpex.net>
Organization: MPeX.net GmbH
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040113
X-Accept-Language: de, en-us, en
MIME-Version: 1.0
To: guy-ezmlm@rucus.net
Subject: Bug + fix in ezmlm.pm 0.04
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Status: RO
Content-Length: 1010
Addition: Just found out, that there's the same bug on line 138!
---------------
Hi Guy!
I just posted this on cpan, but I also wanted to let you know:
----------------
http://rt.cpan.org/NoAuth/Bug.html?id=5571
----------------
Subject: Problem with dash in owner or sender address
In Ezmlm.pm 0.04 on line 85 the options are split at every dash ("-\w+"). So when trying to supply
an owner or sender address containing a dash i.e. someone@some-domain.com this domain is splitted in
two parts ("someone@some" and "-domain.com") causing this error: "ezmlm-make: fatal: dir and dot
must start with slash". This occurs because "-domain.com" is interpreted as an option which is of
course wrong.
This problem can be solved by adding a \s right in front of the -\w+ on line 85 of the module:
--- foreach (split(/["'](.+?)["']|(-\w+)/, $commandline)) {
+++ foreach (split(/["'](.+?)["']|(\s-\w+)/, $commandline)) {
This assures, that an option is split and not every occurence of a dash, even in a domain.

View file

@ -0,0 +1,54 @@
From sbeck@gossamer-threads.com Sat Oct 9 00:36:20 2004
Return-Path: <sbeck@gossamer-threads.com>
Delivered-To: guy-ezmlm@rucus.net
Received: (qmail 94672 invoked by uid 1025); 8 Oct 2004 22:36:20 -0000
Received: from sbeck@gossamer-threads.com by server.rucus.ru.ac.za by uid 82 with qmail-scanner-1.22
(clamdscan: 0.75.1. Clear:RC:0(64.69.64.21):.
Processed in 3.991777 secs); 08 Oct 2004 22:36:20 -0000
Received: from gossamer.nmsrv.com (HELO gossamer-threads.com) (64.69.64.21)
by server.rucus.ru.ac.za with SMTP; 8 Oct 2004 22:36:16 -0000
Received: (qmail 17647 invoked from network); 8 Oct 2004 22:36:00 -0000
X-AntiVirus: Clean
Received: from unknown (HELO sbeck) (sbeck@64.180.111.209)
by gossamer.nmsrv.com with (RC4-MD5 encrypted) SMTP; 8 Oct 2004 22:36:00 -0000
Subject: Mail::Ezmlm tainting
From: Scott Beck <sbeck@gossamer-threads.com>
To: Guy Antony Halse <guy-ezmlm@rucus.net>
Content-Type: text/plain
Organization: Gossamer Threads
Message-Id: <1097274969.15328.32.camel@sbeck.office.gossamer-threads.com>
Mime-Version: 1.0
X-Mailer: Ximian Evolution 1.4.6
Date: Fri, 08 Oct 2004 15:36:09 -0700
Content-Transfer-Encoding: 7bit
Status: RO
Content-Length: 810
Hi,
I just ran into a taint problem with Mail::Ezmlm on one of our servers.
In Mail/Ezmlm.pm you have a sub _checkaddress which validates an email
address that is passed off to system, however to just verify the address
is not enough for perl's -T tests. You must reassign it to a capture
from a regex. Here is a version of the function that fixes this (a
little hacky).
sub _checkaddress {
my($self, $address) = @_;
return 1 unless defined($address);
return 0 unless($address =~ /^(\S+\@\S+\.\S+)$/);
$_[1] = $1;
return 1;
}
Cheers,
Scott
--
-------------------- Gossamer Threads Inc. ----------------------
Scott Beck Email: scott@gossamer-threads.com
Lead Software Developer Phone: (604) 687-5804
http://www.gossamer-threads.com Fax: (604) 687-5806

View file

@ -0,0 +1,193 @@
From matt@tnpi.biz Mon Nov 15 21:21:15 2004
Return-Path: <matt@tnpi.biz>
Delivered-To: guy@rucus.ru.ac.za
Received: (qmail 48783 invoked by uid 1025); 15 Nov 2004 19:21:15 -0000
Received: from matt@tnpi.biz by server.rucus.ru.ac.za by uid 82 with qmail-scanner-1.22
(clamdscan: 0.75.1. Clear:RC:0(207.89.154.94):.
Processed in 2.727858 secs); 15 Nov 2004 19:21:15 -0000
Received: from matt-serv2.cdlc.mi.core.com (HELO mail.cadillac.net) (207.89.154.94)
by server.rucus.ru.ac.za with SMTP; 15 Nov 2004 19:21:12 -0000
Received: (qmail 5634 invoked by uid 89); 15 Nov 2004 19:21:06 -0000
Received: from unknown (HELO ?10.0.1.218?) (matt@cadillac.net@10.0.1.218)
by matt-serv2.cdlc.mi.core.com with (RC4-SHA encrypted) SMTP; 15 Nov 2004 19:21:06 -0000
Mime-Version: 1.0 (Apple Message framework v619)
To: guy@rucus.ru.ac.za
Message-Id: <7D5CC579-373B-11D9-A43C-000A95A797A8@tnpi.biz>
Content-Type: multipart/mixed; boundary=Apple-Mail-5--167304881
From: Matt Simerson <matt@tnpi.biz>
Subject: Mail::Ezmlm patch submission
Date: Mon, 15 Nov 2004 14:21:02 -0500
X-Mailer: Apple Mail (2.619)
Status: RO
Content-Length: 6582
--Apple-Mail-5--167304881
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
format=flowed
Hey Guy,
First, thanks a bunch for writing Mail::Ezmlm, it's quite useful. :-)
I've used it to write a CGI interface to Ezmlm for a client. It's not a
very complex thing, it just creates a web page where the client logs in
and then has the choice to list the subscribers for a list, batch add a
list of subscribers, or mass delete a list.
It's posted here if you're interested in seeing it:
https://mail.cadillac.net/ezmlm.cgi
You can log in using the domain "example.com" and the password
"guyrucus".
Anyhow, the only problem I've had with Mail::Ezmlm is that when I run
my script suid as the user that owns the mailing list, mod_perl whines
about the data because it's tainted. So, I've made a few minor
alterations to untaint the data. My approach is rather basic and could
be improved upon but it works quite well and is slightly more secure
than what's being used at present. I'd appreciate if you'd review the
patch and apply it or something similar which achieves the same result.
The patch is against v 1.9 of Mail::Ezmlm.
--Apple-Mail-5--167304881
Content-Type: multipart/appledouble;
boundary=Apple-Mail-6--167304881
Content-Disposition: attachment
--Apple-Mail-6--167304881
Content-Transfer-Encoding: base64
Content-Type: application/applefile;
name="Ezmlm.pm.patch"
Content-Disposition: attachment;
filename=Ezmlm.pm.patch
AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJAAAAPgAAAAoAAAADAAAASAAAAA4AAAACAAAA
VgAABq5URVhUUipjaAAARXptbG0ucG0ucGF0Y2gAAAEAAAAGaAAABWgAAABGAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAASAAJTW9uYWNvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAEAEIACgR0AooAQgAKBHQC
ir2+Z3QAAAFTAAABUwAAAAABAAAABRhSKmNoAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQdDb3VyaWVyAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAACgAAAAQJSGVsdmV0aWNhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADENvbmZpZGVudGlhbAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAQAAAQAAAQAAAIAAAACAAAAAgAAAAIAAAAAAAAABAQABAAEAAAAAAwBQ
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACW1hY2ludG9zaAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAZoAAAFaAAAAEYAZdCMAlUAAAAcAEYAAU1QU1IAAAASQkJT
VAAAAB4D7f//AAAAAAB/K8AAgP//AAAATAB/K9A=
--Apple-Mail-6--167304881
Content-Transfer-Encoding: 7bit
Content-Type: application/text;
x-mac-type=54455854;
x-unix-mode=0644;
x-mac-creator=522A6368;
name="Ezmlm.pm.patch"
Content-Disposition: attachment;
filename=Ezmlm.pm.patch
--- Ezmlm.pm.orig Sat Nov 13 13:38:59 2004
+++ Ezmlm.pm Mon Nov 15 13:44:35 2004
@@ -236,6 +236,16 @@
my($self, $part) = @_;
my(@subscribers);
($self->_seterror(-1, 'must setlist() before returning subscribers()') && return undef) unless(defined($self->{'LIST_NAME'}));
+
+ # additions by matt simerson (matt@tnpi.biz) to pass mod_perl security (taint) checks
+ $ENV{"PATH"} = "";
+ if ( $self->{'LIST_NAME'} =~ /([\w\-\/.]*)/ ) {
+ $self->{'LIST_NAME'} = $1;
+ } else {
+ warn "TAINTED DATA IN LIST_NAME: $self->{'LIST_NAME'}\n";
+ };
+ # end additions
+
if(defined($part) && $part) {
($self->_seterror(-1, "$part part of $self->{'LIST_NAME'} does not appear to exist in subscribers()") && return undef) unless(-e "$self->{'LIST_NAME'}/$part");
@subscribers = map { s/[\r\n]// && $_ } sort `$EZMLM_BASE/ezmlm-list $self->{'LIST_NAME'}/$part`;
@@ -270,6 +280,19 @@
} else {
foreach $address (@addresses) {
next unless $self->_checkaddress($address);
+
+ # matt adds
+ $ENV{"PATH"} = ""; # taint checks
+
+ if ( $self->{'LIST_NAME'} =~ /([\w\-\/.]*)/ ) {
+ $self->{'LIST_NAME'} = $1;
+ } else {
+ warn "TAINTED DATA IN LIST_NAME: $self->{'LIST_NAME'}\n";
+ };
+
+ if ( $address =~ /(.*)/ ) { $address = $1 };
+ # end matt adds
+
system("$EZMLM_BASE/ezmlm-sub", $self->{'LIST_NAME'}, $address) == 0 ||
($self->_seterror($?) && return undef);
}
@@ -322,6 +345,16 @@
} else {
foreach $address (@addresses) {
$ENV{'SENDER'} = $address;
+
+ # matt adds
+ $ENV{"PATH"} = ""; # taint checks
+ if ( $self->{'LIST_NAME'} =~ /([\w\-\/.]*)/ ) {
+ $self->{'LIST_NAME'} = $1;
+ } else {
+ warn "TAINTED DATA IN LIST_NAME: $self->{'LIST_NAME'}\n";
+ };
+ # end matt adds
+
undef($issub) if ((system("$EZMLM_BASE/ezmlm-issubn", $self->{'LIST_NAME'}) / 256) != 0)
}
}
--Apple-Mail-6--167304881--
--Apple-Mail-5--167304881
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
format=flowed
Matt
``````````````````````````````````````````````````````````````````
Matt Simerson http://matt.simerson.net
The Network People Inc. http://www.tnpi.biz
The chief danger in life is that you may take too many precautions.
- Alfred Adler
``````````````````````````````````````````````````````````````````
--Apple-Mail-5--167304881--

View file

@ -0,0 +1,422 @@
From xanni@kira.glasswings.com.au Tue May 20 16:09:12 2003
Return-Path: <xanni@kira.glasswings.com.au>
Delivered-To: guy-ezmlm@rucus.ru.ac.za
Received: (qmail 98840 invoked from network); 20 May 2003 14:09:12 -0000
Received: from mail011.syd.optusnet.com.au (210.49.20.139)
by server.rucus.ru.ac.za with SMTP; 20 May 2003 14:09:12 -0000
Received: from kira.glasswings.com.au (c16443.eburwd3.vic.optusnet.com.au [210.49.192.62])
by mail011.syd.optusnet.com.au (8.11.6p2/8.11.6) with ESMTP id h4KE93X08963
for <guy-ezmlm@rucus.ru.ac.za>; Wed, 21 May 2003 00:09:03 +1000
Received: (from xanni@localhost)
by kira.glasswings.com.au (8.9.3/8.9.3) id AAA18521
for guy-ezmlm@rucus.ru.ac.za; Wed, 21 May 2003 00:18:02 +1000
Date: Wed, 21 May 2003 00:18:01 +1000
From: Andrew Pam <xanni@glasswings.com.au>
To: guy-ezmlm@rucus.ru.ac.za
Subject: Bug fixes for ezmlm-web
Message-ID: <20030520141801.GM599@kira.glasswings.com.au>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.4i
Status: RO
Content-Length: 24092
I found the following problems when installing ezmlm-web v2.1:
* Many browsers do not provide any visible display of alt tags, so the
help icons are not usable without some JavaScript
* There were several HTML errors in the output of the script, such as
mismatched tags, misspelled attributes and missing quotes around attributes
* The CGI module now outputs XHTML, which requires that all tags be lowercase
Here is a patch which addresses all these issues:
--- ezmlm-web.cgi Tue Sep 26 06:58:08 2000
+++ /usr/local/bin/ezmlm-web.cgi Wed May 21 00:07:32 2003
@@ -1,6 +1,9 @@
-#!/usr/bin/perl -T
+#!/usr/bin/perl -Tw
#===========================================================================
# ezmlm-web.cgi - version 2.1 - 25/09/2000
+# 20/05/2003 Andrew Pam <xanni@sericyb.com.au>
+# Fixed HTML errors, changed all HTML to lowercase for XHTML
+# Added sub help_icon and sub help_option for non-tooltip browsers
# $Id: ezmlm-web.cgi,v 1.3 2000/09/25 19:58:07 guy Exp $
#
# Copyright (C) 1999/2000, Guy Antony Halse, All Rights Reserved.
@@ -239,7 +242,7 @@
&list_text;
} else {
- print "<H1 ALIGN=CENTER>$Q::action</H1><H2 ALIGN=CENTER>$LANGUAGE{'nop'}</H2><HR ALIGN=center WIDTH=25%>";
+ print "<h1 align=\"center\">$Q::action</h1><h2 align=\"center\">$LANGUAGE{'nop'}</h2><hr align=\"center\" width=\"25%\">";
}
# Print HTML footer and exit :) ...
@@ -280,15 +283,15 @@
$q->delete_all;
print $q->startform;
print $q->hidden(-name=>'state', -default=>'select');
- print '<CENTER><TABLE BORDER="0" CELLPADDING="10"><TR><TD ALIGN="center" VALIGN="top" ROWSPAN="2">';
+ print '<center><table border="0" cellpadding="10"><tr><td align="center" valign="top" rowspan="2">';
print $q->scrolling_list(-name=>'list', -size=>$scrollsize, -values=>\@lists) if defined(@lists);
- print '</TD><TD ALIGN="left" VALIGN="top">', $LANGUAGE{'chooselistinfo'};
+ print '</td><td align="left" valign="top">', $LANGUAGE{'chooselistinfo'};
print $q->submit(-name=>'action', -value=>"[$BUTTON{'create'}]"), ' ' if (!defined($opt_c));
print $q->submit(-name=>'action', -value=>"[$BUTTON{'edit'}]"), ' ' if(defined(@lists));
print $q->submit(-name=>'action', -value=>"[$BUTTON{'delete'}]") if(defined(@lists));
- print '</TD></TR><TR><TD> </TD></TR></TABLE></CENTER>';
+ print '</td></tr><tr><td> </td></tr></table></center>';
print $q->endform;
}
@@ -302,9 +305,9 @@
print $q->startform;
print $q->hidden(-name=>'state', -default=>'confirm_delete');
print $q->hidden(-name=>'list', -default=>$q->param('list'));
- print '<H2 ALIGN="center">', $LANGUAGE{'confirmdelete'}, ' ', $q->param('list'), '</H3><BR><CENTER>';
+ print '<h2 align="center">', $LANGUAGE{'confirmdelete'}, ' ', $q->param('list'), '</h2><br><center>';
print $q->submit(-name=>'confirm', -value=>"[$BUTTON{'no'}]"), ' ';
- print $q->submit(-name=>'confirm', -value=>"[$BUTTON{'yes'}]"), '</CENTER>';
+ print $q->submit(-name=>'confirm', -value=>"[$BUTTON{'yes'}]"), '</center>';
}
# ------------------------------------------------------------------------
@@ -327,28 +330,28 @@
# Print out a form of options ...
$q->delete('state');
- print "<H2 ALIGN=center>$LANGUAGE{'subscribersto'} $Q::list ($listaddress)</H2><HR ALIGN=center WIDTH=25%>";
+ print "<h2 align=\"center\">$LANGUAGE{'subscribersto'} $Q::list ($listaddress)</h2><hr align=\"center\" width=\"25%\">";
print $q->start_multipart_form;
- print '<CENTER><TABLE ALIGN="center" CELLPADDING="10"><TR><TD ROWSPAN="2" VALIGN="top" ALIGN="center">';
+ print '<center><table align="center" cellpadding="10"><tr><td rowspan="2" valign="top" align="center">';
print $q->hidden(-name=>'state', -default=>'edit');
print $q->hidden(-name=>'list', -default=>$Q::list);
print $q->scrolling_list(-name=>'delsubscriber', -size=>$scrollsize, -values=>\@subscribers, -labels=>&pretty_names, -multiple=>'true') if defined(@subscribers);
- print '</TD><TD VALIGN="top" ALIGN="left">';
- print ' ', ($#subscribers + 1), ' ', $LANGUAGE{'subscribers'}, '<BR>' if defined(@subscribers);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'deleteaddress'}]"), '<P>' if defined(@subscribers);
- print $q->textfield(-name=>'addsubscriber', -size=>'40'), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'addaddress'}, '"><BR>';
- print $q->filefield(-name=>'addfile', -size=>20, -maxlength=>100), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'addaddressfile'}, '"><br>' if ($FILE_UPLOAD);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'addaddress'}]"), '<P>';
- print '<STRONG>', $LANGUAGE{'additionalparts'}, ':</STRONG><BR>' if($list->ismodpost || $list->ismodsub || $list->isremote || $list->isdeny || $list->isallow || $list->isdigest);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'moderators'}]"), '<IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'moderator'}, '"> ' if ($list->ismodpost || $list->ismodsub || $list->isremote);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'denylist'}]"), '<IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'deny'}, '"> ' if ($list->isdeny);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'allowlist'}]"), '<IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'allow'}, '"> ' if ($list->isallow);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'digestsubscribers'}]"), '<IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'digest'}, '"> ' if ($list->isdigest);
- print '<P>';
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'webarchive'}]"), '<IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'webarch'}, '"> ' if(&ezmlmcgirc);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'configuration'}]"), '<IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'config'}, '">&nbsp;&nbsp;&nbsp;';
+ print '</td><td valign="top" align="left">';
+ print ' ', ($#subscribers + 1), ' ', $LANGUAGE{'subscribers'}, '<br>' if defined(@subscribers);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'deleteaddress'}]"), '<p>' if defined(@subscribers);
+ print $q->textfield(-name=>'addsubscriber', -size=>'40'), help_icon('addaddress'), '<br>';
+ print $q->filefield(-name=>'addfile', -size=>20, -maxlength=>100), help_icon('addaddressfile'), '<br>' if ($FILE_UPLOAD);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'addaddress'}]"), '<p>';
+ print '<strong>', $LANGUAGE{'additionalparts'}, ':</strong><br>' if($list->ismodpost || $list->ismodsub || $list->isremote || $list->isdeny || $list->isallow || $list->isdigest);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'moderators'}]"), help_icon('moderator'), ' ' if ($list->ismodpost || $list->ismodsub || $list->isremote);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'denylist'}]"), help_icon('deny'), ' ' if ($list->isdeny);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'allowlist'}]"), help_icon('allow'), ' ' if ($list->isallow);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'digestsubscribers'}]"), help_icon('digest'), ' ' if ($list->isdigest);
+ print '<p>';
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'webarchive'}]"), help_icon('webarch'), ' ' if(&ezmlmcgirc);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'configuration'}]"), help_icon('config'), '&nbsp;&nbsp;&nbsp;';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'selectlist'}]");
- print '</TD></TR><TR><TD> </TD></TR></TABLE></CENTER>';
+ print '</td></tr><tr><td> </td></tr></table></center>';
print $q->endform;
}
@@ -534,15 +537,15 @@
my($subpath) = $config =~ m{8\s*'([^']+)'};
my($remotepath) = $config =~ m{9\s*'([^']+)'};
- $moderated = '<BLINK><FONT COLOR=#ff0000>' if ($postpath);
+ $moderated = '<blink><font color="#ff0000">' if ($postpath);
$moderated .= "[$LANGUAGE{'posting'}]" if ($list->ismodpost);
- $moderated .= '</FONT><IMG SRC="' . $HELP_ICON_URL . '" ALT="Posting Moderators are stored in a non-standard location (' . $postpath . '). You will have to edit them manually."></BLINK>' if ($postpath);
- $moderated .= '<BLINK><FONT COLOR=#ff0000>' if ($subpath);
+ $moderated .= '</font><img src="' . $HELP_ICON_URL . '" alt="Posting Moderators are stored in a non-standard location (' . $postpath . '). You will have to edit them manually."></blink>' if ($postpath);
+ $moderated .= '<blink><font color="#ff0000">' if ($subpath);
$moderated .= " [$LANGUAGE{'subscription'}]" if($list->ismodsub);
- $moderated .= '</FONT><IMG SRC="' . $HELP_ICON_URL . '" ALT="Subscriber Moderators are stored in a non-standard location (' . $subpath . '). You will have to edit them manually"></BLINK>' if ($subpath);
- $moderated .= '<BLINK><FONT COLOR=#ff0000>' if ($remotepath);
+ $moderated .= '</font><img src="' . $HELP_ICON_URL . '" alt="Subscriber Moderators are stored in a non-standard location (' . $subpath . '). You will have to edit them manually"></blink>' if ($subpath);
+ $moderated .= '<blink><font color="#ff0000">' if ($remotepath);
$moderated .= " [$LANGUAGE{'remoteadmin'}]" if($list->isremote);
- $moderated .= '</FONT><IMG SRC="' . $HELP_ICON_URL . '" ALT="Remote Administrators are stored in a non-standard location (' . $remotepath . '). You will have to edit them manually"></BLINK>' if ($remotepath);
+ $moderated .= '</font><img src="' . $HELP_ICON_URL . '" alt="Remote Administrators are stored in a non-standard location (' . $remotepath . '). You will have to edit them manually"></blink>' if ($remotepath);
}
@@ -557,20 +560,20 @@
# Print out a form of options ...
$q->delete('state');
- print "<H2 ALIGN=center>$type $LANGUAGE{'for'} $listaddress</H2><HR ALIGN=center WIDTH=25%>";
- print "<CENTER>$moderated</CENTER><P>" if(defined($moderated));
+ print "<h2 align=\"center\">$type $LANGUAGE{'for'} $listaddress</h2><hr align=\"center\" width=\"25%\">";
+ print "<center>$moderated</center><p>" if(defined($moderated));
print $q->start_multipart_form;
- print '<CENTER><TABLE ALIGN="center" CELLPADDING="10"><TR><TD ROWSPAN="2" VALIGN="top" ALIGN="center">';
+ print '<center><table align="center" cellpadding="10"><tr><td rowspan="2" valign="top" align="center">';
print $q->hidden(-name=>'state', -default=>$part);
print $q->hidden(-name=>'list', -default=>$Q::list), "\n";
print $q->scrolling_list(-name=>'delsubscriber', -size=>$scrollsize, -values=>\@subscribers, -multiple=>'true', -labels=>&pretty_names) if defined(@subscribers);
- print '</TD></TR><TR><TD VALIGN="top" ALIGN="left">';
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'deleteaddress'}]"), '<P>' if defined(@subscribers);
- print $q->textfield(-name=>'addsubscriber', -size=>'40'), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'addaddress'}, '"><BR>';
- print $q->filefield(-name=>'addfile', -size=>20, -maxlength=>100), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'addaddressfile'}, '"><br>' if ($FILE_UPLOAD);
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'addaddress'}]"), '<P>';
+ print '</td></tr><tr><td valign="top" align="left">';
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'deleteaddress'}]"), '<p>' if defined(@subscribers);
+ print $q->textfield(-name=>'addsubscriber', -size=>'40'), help_icon('addaddreess'), '<br>';
+ print $q->filefield(-name=>'addfile', -size=>20, -maxlength=>100), help_icon('addaddressfile'), '<br>' if ($FILE_UPLOAD);
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'addaddress'}]"), '<p>';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'subscribers'}]");
- print '</TD></TR><TR><TD> </TD></TR></TABLE></CENTER>';
+ print '</td></tr><tr><td> </td></tr></table></center>';
print $q->endform;
}
@@ -598,27 +601,26 @@
# Print a form of options ...
$q->delete_all;
- print '<H2 ALIGN=CENTER>', $LANGUAGE{'createnew'}, '</H2><HR ALIGN=center WIDTH=25%>';
+ print '<h2 align="center">', $LANGUAGE{'createnew'}, '</h2><hr align="center" width="25%">';
print $q->startform;
print $q->hidden(-name=>'state', -value=>'create');
- print '<BIG><STRONG>', $LANGUAGE{'listname'}, ': </STRONG></BIG>', $q->textfield(-name=>'list', -size=>'20'), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'listname'}, '"><P>';
- print '<BIG><STRONG>', $LANGUAGE{'listaddress'}, ': </STRONG></BIG>';
+ print '<big><strong>', $LANGUAGE{'listname'}, ': </strong></big>', $q->textfield(-name=>'list', -size=>'20'), help_icon('listname'), '<p>';
+ print '<big><strong>', $LANGUAGE{'listaddress'}, ': </strong></big>';
print $q->textfield(-name=>'inlocal', -default=>$username, -size=>'10');
- print ' <BIG><STRONG>@</STRONG></BIG> ', $q->textfield(-name=>'inhost', -default=>$hostname, -size=>'30'), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'listadd'}, '"><P>';
+ print ' <big><strong>@</strong></big> ', $q->textfield(-name=>'inhost', -default=>$hostname, -size=>'30'), help_icon('listadd'), '<p>';
- print '<P><BIG><STRONG>', $LANGUAGE{'listoptions'}, ':</STRONG></BIG>';
+ print '<p><big><strong>', $LANGUAGE{'listoptions'}, ':</strong></big>';
&display_options($DEFAULT_OPTIONS);
# Allow creation of mysql table if the module allows it
if($Mail::Ezmlm::MYSQL_BASE) {
- print '<P> ', $q->checkbox(-name=>'sql', -label=>$LANGUAGE{'mysqlcreate'}, -on=>1);
- print ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'mysqlcreate'}, '">';
+ print '<p> ', $q->checkbox(-name=>'sql', -label=>$LANGUAGE{'mysqlcreate'}, -on=>1), help_icon('mysqlcreate');
}
- print '<P><BIG><STRONG>', $LANGUAGE{'allowedtoedit'}, ': </STRONG></BIG>',
- $q->textfield(-name=>'webusers', -value=>$ENV{'REMOTE_USER'}||'ALL', -size=>'30'), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'webusers'}, '">',
- '<BR><FONT SIZE="-1">', $HELPER{'allowedit'}, '</FONT>'
+ print '<p><big><strong>', $LANGUAGE{'allowedtoedit'}, ': </strong></big>',
+ $q->textfield(-name=>'webusers', -value=>$ENV{'REMOTE_USER'}||'ALL', -size=>'30'), help_icon('webusers'),
+ '<br><font size="-1">', $HELPER{'allowedit'}, '</font>'
if(-e "$LIST_DIR/webusers");
print '<P>', $q->submit(-name=>'action', -value=>"[$BUTTON{'createlist'}]"), ' ';
@@ -647,7 +649,7 @@
# Sanity Checks ...
return 1 if ($listname eq '' || $qmail eq '');
if(-e ("$LIST_DIR/$listname/lock") || -e ("$HOME_DIR/.qmail-$qmail")) {
- print "<H1 ALIGN=CENTER>List '$listname' already exists :(</H1>";
+ print "<h1 align=\"center\">List '$listname' already exists :(</h1>";
return 1;
}
@@ -710,13 +712,13 @@
# Print a form of options ...
$q->delete_all;
- print '<H2 ALIGN="center">', $LANGUAGE{'editconfiguration'}, '</H2><HR ALIGN=center WIDTH=25%>';
+ print '<h2 align="center">', $LANGUAGE{'editconfiguration'}, '</h2><hr align="center" width="25%">';
print $q->startform;
print $q->hidden(-name=>'state', -value=>'configuration');
print $q->hidden(-name=>'list', -value=>$listname);
- print '<BIG><STRONG>', $LANGUAGE{'listname'}, ": <EM>$listname</EM><BR>";
- print "$LANGUAGE{'listaddress'}: <EM>$listaddress</EM></STRONG></BIG><P>";
- print '<BIG><STRONG>', $LANGUAGE{'listoptions'}, ':</BIG></STRONG><BR>';
+ print '<big><strong>', $LANGUAGE{'listname'}, ": <em>$listname</em><br>";
+ print "$LANGUAGE{'listaddress'}: <em>$listaddress</em></strong></big><p>";
+ print '<big><strong>', $LANGUAGE{'listoptions'}, ':</big></strong><br>';
# Print a list of options, selecting the ones that apply to this list ...
&display_options($list->getconfig);
@@ -727,10 +729,10 @@
$mimeremove = $list->getpart('mimeremove');
$prefix = $list->getpart('prefix');
- print '<P><BIG><STRONG>', $LANGUAGE{'prefix'}, ': </STRONG></BIG>', $q->textfield(-name=>'prefix', -default=>$prefix, -size=>12), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'prefix'}, '">' if defined($prefix);
- print '<P><BIG><STRONG>', $LANGUAGE{'headerremove'}, ':</BIG></STRONG> <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'headerremove'}, '"><BR>', $q->textarea(-name=>'headerremove', -default=>$headerremove, -rows=>5, -columns=>70);
- print '<P><BIG><STRONG>', $LANGUAGE{'headeradd'}, ':</BIG></STRONG> <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'headeradd'}, '"><BR>', $q->textarea(-name=>'headeradd', -default=>$headeradd, -rows=>5, -columns=>70);
- print '<P><BIG><STRONG>', $LANGUAGE{'mimeremove'}, ':</BIG></STRONG> <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'mimeremove'}, '"><BR>', $q->textarea(-name=>'mimeremove', -default=>$mimeremove, -rows=>5, -columns=>70) if defined($mimeremove);
+ print '<p><big><strong>', $LANGUAGE{'prefix'}, ': </strong></big>', $q->textfield(-name=>'prefix', -default=>$prefix, -size=>12), help_icon('prefix') if defined($prefix);
+ print '<p><big><strong>', $LANGUAGE{'headerremove'}, ':</big></strong> ', help_icon('headerremove'), '<br>', $q->textarea(-name=>'headerremove', -default=>$headerremove, -rows=>5, -columns=>70);
+ print '<p><big><strong>', $LANGUAGE{'headeradd'}, ':</big></strong> ', help_icon('headeradd'), '<br>', $q->textarea(-name=>'headeradd', -default=>$headeradd, -rows=>5, -columns=>70);
+ print '<p><big><strong>', $LANGUAGE{'mimeremove'}, ':</big></strong> ', help_icon('mimeremove'), '<br>', $q->textarea(-name=>'mimeremove', -default=>$mimeremove, -rows=>5, -columns=>70) if defined($mimeremove);
if(open(WEBUSER, "<$LIST_DIR/webusers")) {
my($webusers);
@@ -740,13 +742,13 @@
close WEBUSER;
$webusers ||= $ENV{'REMOTE_USER'} || 'ALL';
- print '<P><BIG><STRONG>', $LANGUAGE{'allowedtoedit'}, ': </STRONG></BIG>',
- $q->textfield(-name=>'webusers', -value=>$webusers, -size=>'30'), ' <IMG SRC="', $HELP_ICON_URL, '" ALT="', $HELPER{'webusers'}, '">',
- '<BR><FONT SIZE="-1">', $HELPER{'allowedit'}, '</FONT>';
+ print '<p><big><strong>', $LANGUAGE{'allowedtoedit'}, ': </strong></big>',
+ $q->textfield(-name=>'webusers', -value=>$webusers, -size=>'30'), help_icon('webusers'),
+ '<br><font size="-1">', $HELPER{'allowedit'}, '</font>';
}
- print '<P>', $q->submit(-name=>'action', -value=>"[$BUTTON{'updateconfiguration'}]"), ' ';
+ print '<p>', $q->submit(-name=>'action', -value=>"[$BUTTON{'updateconfiguration'}]"), ' ';
print $q->reset(-value=>"[$BUTTON{'resetform'}]"), ' ';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'cancel'}]"), ' ';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'edittexts'}]");
@@ -841,12 +843,12 @@
print $q->startform;
print $q->hidden(-name=>'state', -default=>'list_text');
print $q->hidden(-name=>'list', -default=>$q->param('list'));
- print '<CENTER><TABLE BORDER="0" CELLPADDING="10" ALIGN="center"><TR><TD ALIGN="center" VALIGN="top" ROWSPAN="2">';
+ print '<center><table border="0" cellpadding="10" align="center"><tr><td align="center" valign="top" rowspan="2">';
print $q->scrolling_list(-name=>'file', -values=>\@files);
- print '</TD><TD ALIGN="center" VALIGN="top">';
+ print '</td><td align="center" valign="top">';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'editfile'}]"), ' ';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'cancel'}]");
- print '<P>', $LANGUAGE{'edittextinfo'}, '</TD></TR><TR><TD> </TD></TR></TABLE></CENTER>';
+ print '<p>', $LANGUAGE{'edittextinfo'}, '</td></tr><tr><td> </td></tr></table></center>';
print $q->endform;
}
@@ -862,20 +864,20 @@
# Print a form ...
$q->delete('state');
- print '<H2 ALIGN="CENTER">', $LANGUAGE{'editingfile'}, ': ', $Q::file, '</H2>';
- print '<CENTER><TABLE ALIGN="center" CELLPADDING="5"><TR><TD VALIGN="top" ROWSPAN="2">';
+ print '<h2 align="center">', $LANGUAGE{'editingfile'}, ': ', $Q::file, '</h2>';
+ print '<center><table align="center" cellpadding="5"><tr><td valign="top" rowspan="2">';
print $q->startform;
print $q->hidden(-name=>'state', -default=>'edit_text');
print $q->hidden(-name=>'list', -default=>$q->param('list'));
print $q->hidden(-name=>'file', -default=>$q->param('file'));
print $q->textarea(-name=>'content', -default=>$content, -rows=>'25', -columns=>'72');
- print '</TD><TD VALIGN="top" ALIGN="left">';
+ print '</td><td valign="top" align="left">';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'savefile'}]"), ' ';
print $q->reset(-value=>"[$BUTTON{'resetform'}]"), ' ';
print $q->submit(-name=>'action', -value=>"[$BUTTON{'cancel'}]");
- print '<P>', $LANGUAGE{'editfileinfo'};
+ print '<p>', $LANGUAGE{'editfileinfo'};
print $q->endform;
- print '</TD></TR><TR><TD> <TD></TR></TABLE><CENTER>'
+ print '</td></tr><tr><td> <td></tr></table><center>'
}
@@ -915,37 +917,35 @@
my($i, $j);
print "<!-- $opts -->";
- print '<TABLE BORDER="0" CELLPADDING="3"><TR><TD>';
+ print '<table border="0" cellpadding="3"><tr><td>';
foreach $i (grep {/\D/} keys %EZMLM_LABELS) {
if ($opts =~ /^\w*$i\w*\s*/) {
print $q->checkbox(-name=>$i, -value=>$i, -label=>$EZMLM_LABELS{$i}[0], -on=>'1');
} else {
print $q->checkbox(-name=>$i, -value=>$i, -label=>$EZMLM_LABELS{$i}[0]);
}
- print '<IMG SRC="', $HELP_ICON_URL, '" BORDER="0" ALT="', $EZMLM_LABELS{$i}[1] , '">';
- print '</TD>'; $j++;
+ print help_option($i), '</td>'; $j++;
if ($j >= 3) {
- $j = 0; print '</TR><TR>';
+ $j = 0; print '</tr><tr>';
}
- print '<TD>';
+ print '<td>';
}
- print '</TD></TR></TABLE>';
+ print '</td></tr></table>';
- print '<TABLE BORDER="0" CELPADDING="3">';
+ print '<table border="0" cellpadding="3">';
foreach $i (grep {/\d/} keys %EZMLM_LABELS) {
- print '<TR><TD>';
+ print '<tr><td>';
if ($opts =~ /$i (?:'(.+?)')/) {
print $q->checkbox(-name=>$i, -value=>$i, -label=>$EZMLM_LABELS{$i}[0], -on=>'1');
} else {
print $q->checkbox(-name=>$i, -value=>$i, -label=>$EZMLM_LABELS{$i}[0]);
}
- print '<IMG SRC="', $HELP_ICON_URL, '" BORDER="0" ALT="', $EZMLM_LABELS{$i}[1] , '">';
- print '</TD><TD>';
+ print help_option($i), '</td><td>';
print $q->textfield(-name=>"$i-value", -value=>$1||$EZMLM_LABELS{$i}[2], -size=>30);
- print '</TD></TR>';
+ print '</td></tr>';
}
- print '</TABLE>';
+ print '</table>';
}
@@ -976,6 +976,7 @@
}
# -------------------------------------------------------------------------
+
sub rmtree {
# A subroutine to recursively delete a directory (like rm -f).
# Based on the one in the perl cookbook :)
@@ -995,6 +996,28 @@
}
# ------------------------------------------------------------------------
+
+sub help_icon($) {
+ # Generate HTML for help icons
+ # Written 20 May 2003 by Andrew Pam <xanni@sericyb.com.au>
+
+ my $msg = $HELPER{$_[0]};
+ return '<img src="' . $HELP_ICON_URL . '" alt="' . $msg .
+ '" onClick="alert(\'' . $msg . '\');">';
+}
+
+# ------------------------------------------------------------------------
+
+sub help_option($) {
+ # Generate HTML for option help icons
+ # Written 20 May 2003 by Andrew Pam <xanni@sericyb.com.au>
+
+ my $msg = $EZMLM_LABELS{$_[0]}[1];
+ return '<img src="' . $HELP_ICON_URL . '" border="0" alt="' . $msg .
+ '" onClick="alert(\'' . $msg . '\');">';
+}
+
+# ------------------------------------------------------------------------
BEGIN {
sub handle_errors {
Hope that helps,
Andrew Pam
--
mailto:xanni@xanadu.net Andrew Pam
http://www.xanadu.com.au/ Chief Scientist, Xanadu
http://www.glasswings.com.au/ Technology Manager, Glass Wings
http://www.sericyb.com.au/ Manager, Serious Cybernetics

View file

@ -0,0 +1,67 @@
From xanni@urYod.glasswings.com.au Wed May 26 10:27:04 2004
Return-Path: <xanni@urYod.glasswings.com.au>
Delivered-To: guy-ezmlm@rucus.ru.ac.za
Received: (qmail 95684 invoked by uid 1025); 26 May 2004 08:27:04 -0000
Received: (qmail-scanner-1.22 95683 invoked by uid 82); 26 May 2004 08:27:04 -0000
Received: from mail018.syd.optusnet.com.au (211.29.132.72)
by server.rucus.ru.ac.za with SMTP; 26 May 2004 08:26:58 -0000
Received: from urYod.glasswings.com.au (c211-28-208-136.eburwd1.vic.optusnet.com.au [211.28.208.136])
by mail018.syd.optusnet.com.au (8.11.6p2/8.11.6) with ESMTP id i4Q8QmD27299
for <guy-ezmlm@rucus.ru.ac.za>; Wed, 26 May 2004 18:26:49 +1000
Received: from urYod.glasswings.com.au (localhost.localdomain [127.0.0.1])
by urYod.glasswings.com.au (8.12.10/8.12.10) with ESMTP id i4Q8QlgD004619
for <guy-ezmlm@rucus.ru.ac.za>; Wed, 26 May 2004 18:26:47 +1000
Received: (from xanni@localhost)
by urYod.glasswings.com.au (8.12.10/8.12.10/Submit) id i4Q8Qljs004617
for guy-ezmlm@rucus.ru.ac.za; Wed, 26 May 2004 18:26:47 +1000
Date: Wed, 26 May 2004 18:26:47 +1000
From: Andrew Pam <xanni@glasswings.com.au>
To: guy-ezmlm@rucus.ru.ac.za
Subject: Another ezmlm-web patch
Message-ID: <20040526082647.GN1975@urYod.glasswings.com.au>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.4.1i
X-Face: ="NXL=B\E?60DRs]*]Mp-[@,"/\ESi&5s~&qMPLKzyWqo*<)SiE$IykXoakjYA62"oQT_.0I-i:nay>Pg]I{>J&dN(D<]F}+eaMSI=Kv]<L%q>fr7.e;3u(e1ZlP^C>pRxW*sJEgdAevnn^/D{Eg[f
Status: RO
Content-Length: 1682
Hello! I recently upgraded my system from Red Hat Linux 7.3 to
Fedora Core 1 which in turn resulted in upgrading my perl to 5.8.3.
This revealed a nasty security bug in Mail::Ezmlm which of course affects
ezmlm-web.cgi and is detected by perl when running SUID. Mail::Ezmlm
passes email addresses to the ezmlm tools on the command line using the
"system" perl function, but doesn't check that the email addresses are
free of dangerous characters. Here's a patch to ezmlm-web.cgi to make
it check for valid characters before calling Mail::Ezmlm:
--- ezmlm-web.cgi.orig 2000-09-26 06:58:08.000000000 +1100
+++ ezmlm-web.cgi 2004-05-26 17:54:30.000000000 +1000
@@ -477,7 +477,14 @@
untie %pretty;
}
- if ($list->sub($add->address(), $part) != 1) {
+# Modified 2004-05-26 by Andrew Pam <xanni@sericyb.com.au>
+# Untaint the address because $list->sub will pass it to ezmlm-sub
+# on the command line!
+# Note this may not handle some less common email address formats
+ my($addr) = $add->address() =~ /([\w\.\=]+\@[\w\.\=]+)/
+ or die "Illegal character in address '" . $add->address() ."'";
+# if ($list->sub($add->address(), $part) != 1) {
+ if ($list->sub($addr, $part) != 1) {
die "Unable to subscribe to list: $!";
}
$count++;
Of course arguably Mail::Ezmlm should really be doing this.
Cheers,
Andrew
--
mailto:xanni@xanadu.net Andrew Pam
http://www.xanadu.com.au/ Chief Scientist, Xanadu
http://www.glasswings.com.au/ Technology Manager, Glass Wings
http://www.sericyb.com.au/ Manager, Serious Cybernetics

View file

@ -0,0 +1,67 @@
From gordonr@e-smith.com Wed Oct 24 08:10:56 2001
Return-Path: <gordonr@e-smith.com>
Delivered-To: guy-ezmlm@rucus.ru.ac.za
Received: (qmail 18972 invoked from network); 24 Oct 2001 06:10:56 -0000
Received: from terrapin.ru.ac.za (146.231.128.6)
by rucus.ru.ac.za with SMTP; 24 Oct 2001 06:10:56 -0000
Received: from cpe-144-132-208-16.nsw.bigpond.net.au ([144.132.208.16] helo=icedvovo.sydney.e-smith.com)
by terrapin.ru.ac.za with smtp (Exim 3.32 #1)
id 15wHFE-000C6Z-00
for guy-ezmlm@rucus.ru.ac.za; Wed, 24 Oct 2001 08:10:29 +0200
Received: (qmail 19833 invoked by uid 500); 24 Oct 2001 06:10:53 -0000
MBOX-Line: From gordonr@e-smith.com Wed Oct 24 16:10:53 2001
Date: Wed, 24 Oct 2001 16:10:53 +1000
From: Gordon Rowell <gordonr@e-smith.com>
To: Guy Antony Halse <guy-ezmlm@rucus.ru.ac.za>
Subject: ezmlm-web 2.1 patch - if you can't create lists, you can't delete them
Message-ID: <20011024161053.U8219@e-smith.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.2.5i
Organization: Mitel Networks Corporation
Status: RO
Content-Length: 1758
Lines: 40
Hi Guy,
I'm in process of integrating ezmlm-web with our SME Server V5 product - see
www.e-smith.{com,org}. I did a quick and dirty proof of concept contrib to
integrate ezmlm, and am now revising it around ezmlm-web - great stuff.
It fits in very well with our manager. I have a small shim to create
and delete lists which ensures that the list is known to our account
namespace. I wanted to ensure that people couldn't delete lists without
our manager knowing about it. The patch below also disables list deletion
if you have disabled list creation. You may want another switch, but
overloading opt_c seemed right to me.
BTW: I am also making use of Mail::Ezmlm, which is great, so you're not the
only one who thinks it's a good idea :-)
Also, I'll be building an RPM out of ezmlm-web which I'll make available
once I've done it.
Gordon
--
Gordon Rowell gordonr@e-smith.com
VP Engineering
Network Server Solutions Group http://www.e-smith.com
Mitel Networks Corporation http://www.mitel.com
---CUT HERE------CUT HERE------CUT HERE------CUT HERE---
[gordonr@sao]$ diff -u ezmlm-web.cgi.orig ezmlm-web.cgi
--- ezmlm-web.cgi.orig Tue Sep 26 06:58:08 2000
+++ ezmlm-web.cgi Wed Oct 24 16:05:08 2001
@@ -287,7 +287,7 @@
print $q->submit(-name=>'action', -value=>"[$BUTTON{'create'}]"), ' ' if (!defined($opt_c));
print $q->submit(-name=>'action', -value=>"[$BUTTON{'edit'}]"), ' ' if(defined(@lists));
- print $q->submit(-name=>'action', -value=>"[$BUTTON{'delete'}]") if(defined(@lists));
+ print $q->submit(-name=>'action', -value=>"[$BUTTON{'delete'}]") if ((!defined($opt_c)) && (defined(@lists)));
print '</TD></TR><TR><TD> </TD></TR></TABLE></CENTER>';
print $q->endform;
}

File diff suppressed because it is too large Load diff