# HG changeset patch # User Marc Maurice # Date 1331467798 -39600 # Node ID 331115b58da4242a12d73b28470e943ee87bedb6 # Parent eb14ea6e4f21afac377954c0b9c9a7ebfd1104dd Add subscription functionality to php-admin and other minor improvements. diff -r eb14ea6e4f21 -r 331115b58da4 ChangeLog --- a/ChangeLog Thu Mar 01 03:42:50 2012 +1100 +++ b/ChangeLog Sun Mar 11 23:09:58 2012 +1100 @@ -1,3 +1,4 @@ + o Add subscription ability to php-admin o Add ability to except characters from width reckoning (and be zero-width) to facilitate wrapping even more languages well o Add different width-reckoning modes to facilitate wrapping many languages diff -r eb14ea6e4f21 -r 331115b58da4 contrib/web/php-admin/README --- a/contrib/web/php-admin/README Thu Mar 01 03:42:50 2012 +1100 +++ b/contrib/web/php-admin/README Sun Mar 11 23:09:58 2012 +1100 @@ -22,8 +22,19 @@ you need to create a group (eg. mlmmj) and add both users to it. The subscribers.d directory then needs to be writable by that group: + # addgroup mlmmj + # adduser wwwrun mlmmj + # adduser mailuser mlmmj # chgrp -R mlmmj /var/spool/mlmmj/mlmmj-test/subscribers.d/ # chmod -R g+w /var/spool/mlmmj/mlmmj-test/subscribers.d/ + # chmod g+s /var/spool/mlmmj/mlmmj-test/subscribers.d/ + + setgid flag is needed when the webserver calls mlmmj-sub and creates a file + under subscribers.d, to keep the mlmmj group. + + If using the Exim mailserver, you should add initgroups = true in your + mlmmj_transport, otherwise it won't be able to write files having write + permission to mlmmj group. 5) To enable access control on Apache you have to rename dot.htaccess to .htaccess and edit the path inside the file to point to a htpasswd file diff -r eb14ea6e4f21 -r 331115b58da4 contrib/web/php-admin/htdocs/index.php --- a/contrib/web/php-admin/htdocs/index.php Thu Mar 01 03:42:50 2012 +1100 +++ b/contrib/web/php-admin/htdocs/index.php Sun Mar 11 23:09:58 2012 +1100 @@ -35,15 +35,15 @@ $lists = ""; -$dir = opendir($topdir); -while ($file = readdir($dir)) { +# use scandir to have alphabetical order +foreach (scandir($topdir) as $file) { if (!ereg("^\.",$file)) { - $lists .= "". - htmlentities($file)."
\n"; + $lists .= "

".htmlentities($file)."
\n"; + $lists .= "Config - Subscribers\n"; + $lists .= "

\n"; } } -closedir($dir); $tpl->assign(array("LISTS" => $lists)); diff -r eb14ea6e4f21 -r 331115b58da4 contrib/web/php-admin/htdocs/subscribers.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/web/php-admin/htdocs/subscribers.php Sun Mar 11 23:09:58 2012 +1100 @@ -0,0 +1,114 @@ + + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +require(dirname(dirname(__FILE__))."/conf/config.php"); +require(dirname(__FILE__)."/class.rFastTemplate.php"); + +$tpl = new rFastTemplate($templatedir); + +# get the list parameter and check that list exists +$list = $_GET["list"]; + +if(!isset($list)) +die("no list specified"); + +if (dirname(realpath($topdir."/".$list)) != realpath($topdir)) +die("list outside topdir"); + +if(!is_dir($topdir."/".$list)) +die("non-existent list"); + +# this will be displayed on the top of the page +$message = ""; + +# subscribe some people if tosubscribe is set +if (isset($_POST["tosubscribe"])) { + + foreach (preg_split('/\r\n|\n|\r/', $_POST["tosubscribe"]) as $line) { + $email = trim($line); + if ($email != "") { + if (filter_var($email, FILTER_VALIDATE_EMAIL)) { + $cmd = "/usr/bin/mlmmj-sub -L ".escapeshellarg("$topdir/$list")." -a ".escapeshellarg($email)." 2>&1"; + unset($out); + exec($cmd, $out, $ret); + if ($ret !== 0) { + $message.= "* Subscribe error for $email\ncommand: $cmd\nreturn code: $ret\noutput: ".implode("\n", $out)."\n"; + } + } else { + $message.= "* Email address not valid: $email\n"; + } + } + + } + +# delete some people if delete is set +} else if (isset($_POST["delete"])) { + + $email = $_POST["email"]; + if (! filter_var($email, FILTER_VALIDATE_EMAIL)) die("Email address not valid"); + + $cmd = "/usr/bin/mlmmj-unsub -L ".escapeshellarg("$topdir/$list")." -a ".escapeshellarg($email)." 2>&1"; + unset($out); + exec($cmd, $out, $ret); + if ($ret !== 0) { + $message.= "* Unsubscribe error.\ncommand: $cmd\nreturn code: $ret\noutput: ".implode("\n", $out)."\n"; + } +} + +$subscribers=""; + +# get subscribers from mlmmj +$cmd = "/usr/bin/mlmmj-list -L ".escapeshellarg("$topdir/$list")." 2>&1"; +unset($out); +exec($cmd, $out, $ret); +if ($ret !== 0) { + $message.= "* Error: Could not get subscribers list.\n"; +} else { + + foreach ($out as $email) { + $email = trim($email); + + $form = "
"; + $form.= ""; + $form.= ""; + $form.= "
"; + + $subscribers.= "".htmlspecialchars($email)."$form\n"; + } + + if ($subscribers === "") { + $subscribers = "This list is empty.\n"; + } +} + +# set template vars +$tpl->define(array("main" => "subscribers.html")); + +$tpl->assign(array("LIST" => htmlspecialchars($list))); +$tpl->assign(array("MESSAGE" => "
".htmlspecialchars($message)."
")); +$tpl->assign(array("SUBS" => $subscribers)); + +$tpl->parse("MAIN","main"); +$tpl->FastPrint("MAIN"); + +?> diff -r eb14ea6e4f21 -r 331115b58da4 contrib/web/php-admin/templates/subscribers.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/web/php-admin/templates/subscribers.html Sun Mar 11 23:09:58 2012 +1100 @@ -0,0 +1,38 @@ + + +mlmmj - {LIST} subscribers + + + +

{LIST} subscribers

+ +{MESSAGE} + + +{SUBS} +
+ +
+Add subscribers:
+
+ +
+ +

+Index +

+ + diff -r eb14ea6e4f21 -r 331115b58da4 src/subscriberfuncs.c --- a/src/subscriberfuncs.c Thu Mar 01 03:42:50 2012 +1100 +++ b/src/subscriberfuncs.c Sun Mar 11 23:09:58 2012 +1100 @@ -132,6 +132,7 @@ subreadname = concatstr(2, subddirname, dp->d_name); subread = open(subreadname, O_RDONLY); if(subread < 0) { + log_error(LOG_ARGS, "Could not open %s", subreadname); myfree(subreadname); continue; }