]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
Add subscription functionality to php-admin and other minor improvements.
authorMarc Maurice <none@none>
Sun, 11 Mar 2012 12:09:58 +0000 (23:09 +1100)
committerMarc Maurice <none@none>
Sun, 11 Mar 2012 12:09:58 +0000 (23:09 +1100)
ChangeLog
contrib/web/php-admin/README
contrib/web/php-admin/htdocs/index.php
contrib/web/php-admin/htdocs/subscribers.php [new file with mode: 0644]
contrib/web/php-admin/templates/subscribers.html [new file with mode: 0644]
src/subscriberfuncs.c

index 031ff154680eca4bb6a643a6867d289da1239638..718090f7b53af9476f6123f211e37816f0ad93aa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index ade2b6f56850445549c2c593f5dafff724611f89..36f57b7389435b65035212fad46bb2cda476adfe 100644 (file)
@@ -22,8 +22,19 @@ To use this web-interface you have to:
    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
index 8970bb4beed3ce82f8fd14a8ee4d6e73b3388c56..2aa91fff0655cc84e1ab50ce764b698a60c693e0 100644 (file)
@@ -35,15 +35,15 @@ $tpl->define(array("main" => "index.html"));
 
 $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));
 
diff --git a/contrib/web/php-admin/htdocs/subscribers.php b/contrib/web/php-admin/htdocs/subscribers.php
new file mode 100644 (file)
index 0000000..4c5444a
--- /dev/null
@@ -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");
+
+?>
diff --git a/contrib/web/php-admin/templates/subscribers.html b/contrib/web/php-admin/templates/subscribers.html
new file mode 100644 (file)
index 0000000..1333999
--- /dev/null
@@ -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>
index 88766fec7ac9aea0b678f0e7750bf4719b7fe309..8e201c5bd8ee12561a1c52e0bf46dc5766b0cf51 100644 (file)
@@ -132,6 +132,7 @@ int is_subbed_in(const char *subddirname, const char *address)
                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;
                }