Mercurial > hg > mlmmj
changeset 861:331115b58da4
Add subscription functionality to php-admin and other minor improvements.
author | Marc Maurice |
---|---|
date | Sun, 11 Mar 2012 23:09:58 +1100 |
parents | eb14ea6e4f21 |
children | e5b80f7085a1 |
files | ChangeLog contrib/web/php-admin/README contrib/web/php-admin/htdocs/index.php contrib/web/php-admin/htdocs/subscribers.php contrib/web/php-admin/templates/subscribers.html src/subscriberfuncs.c |
diffstat | 6 files changed, 170 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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
--- 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 .= "<a href=\"edit.php?list=".urlencode($file)."\">". - htmlentities($file)."</a><br />\n"; + $lists .= "<p>".htmlentities($file)."<br/>\n"; + $lists .= "<a href=\"edit.php?list=".urlencode($file)."\">Config</a> - <a href=\"subscribers.php?list=".urlencode($file)."\">Subscribers</a>\n"; + $lists .= "</p>\n"; } } -closedir($dir); $tpl->assign(array("LISTS" => $lists));
--- /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 @@ +<?php + +/* Copyright (C) 2012 Marc MAURICE <marc-mlmmj at pub dot positon dot org> + * + * 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 action=\"subscribers.php?list=".htmlspecialchars($list)."\" method=\"post\" style=\"margin: 0; margin-left: 1em\">"; + $form.= "<input type=\"hidden\" name=\"email\" value=\"".htmlspecialchars($email)."\" />"; + $form.= "<input type=\"submit\" name=\"delete\" value=\"Remove\" />"; + $form.= "</form>"; + + $subscribers.= "<tr><td>".htmlspecialchars($email)."</td><td>$form</td></tr>\n"; + } + + if ($subscribers === "") { + $subscribers = "<tr><td>This list is empty.</td></tr>\n"; + } +} + +# set template vars +$tpl->define(array("main" => "subscribers.html")); + +$tpl->assign(array("LIST" => htmlspecialchars($list))); +$tpl->assign(array("MESSAGE" => "<pre>".htmlspecialchars($message)."</pre>")); +$tpl->assign(array("SUBS" => $subscribers)); + +$tpl->parse("MAIN","main"); +$tpl->FastPrint("MAIN"); + +?>
--- /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 @@ +<html> +<head> +<title>mlmmj - {LIST} subscribers</title> +<style type="text/css"> +#subscribers { + float: left; +} + +#addsubscribers { + float: left; + margin-left: 2em; +} +#index { + clear: both; +} +</style> +</head> +<body> +<h1>{LIST} subscribers</h1> + +{MESSAGE} + +<table id="subscribers"> +{SUBS} +</table> + +<form method="post" action="subscribers.php?list={LIST}" id="addsubscribers"> +Add subscribers:<br/> +<textarea name="tosubscribe" rows="5" cols="30"> +</textarea><br/> +<input type="submit" name="submit" value="Add" /> +</form> + +<p id="index"> +<a href="index.php">Index</a> +</p> +</body> +</html>
--- 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; }