Commit Diff


commit - /dev/null
commit + 9e422ec7a8af767683c1a6fb87d6749ab7b436a1
blob - /dev/null
blob + 14e4dd49773cb28ef3e779d5ccaab5654d0e6c84 (mode 644)
--- /dev/null
+++ CHANGELOG.md
@@ -0,0 +1,31 @@
+# Minimalist Mailinglist Manager
+
+#### Version 0.6 -- 2011/03/06
+- Changed: eregi() to preg_match().
+- Changes: split() to preg_split().
+
+
+#### Version 0.5 -- 2007/11/14
+- Added: Charset iso-8859-1 header. (Suggested by Michael Baierl)
+- Fixed: Security issue! Check input for l/$get_list. (Found by Michael Baierl)
+
+
+### Version 0.4 -- 2005/10/22
+- Fixed: small list-writers bug.
+
+
+#### Version 0.3 -- 2005/10/10
+- Added: Toggle for list-writers (default disabled).
+- Added: "Back" button.
+- Changed: $CONF['list'] changed to $CONF['list_name'].
+- Changed: Moved most of $CONF to global config.inc.
+- Changed: Function that read lists.lst.
+- Fixed: Pesky variable error messages.
+
+
+#### Version 0.2 -- 2005/08/10
+- Added: Write only option for list-writers.
+
+
+#### Version 0.1 -- 2005/06/06
+- Initial release.
blob - /dev/null
blob + 158c429dfe2c33fd13beaa9ec7eb2118333c6635 (mode 644)
--- /dev/null
+++ README.md
@@ -0,0 +1,38 @@
+# Minimalist Mailinglist Manager
+
+
+#### REQUIRED!!
+- You are using Minimalist
+- You are using Apache/NGINX or any other webserver that understands PHP
+- You are using PHP 4.1 or higher.
+
+
+### 1. Unarchive Minimalist Manager
+
+Make sure that you are in your WWW directory and then unarchive the
+Minimalist Manager archive (whatever the filename is):
+
+`tar -zxvf minimalist-manager-0.6.tgz`
+
+
+### 2. Configure
+
+Check the `config.inc` file. There you can specify settings that are relevant to your setup.
+
+
+### 3. Create list configuration
+
+The list information is taken from the lists.lst file from Minimalist.
+
+In the directory `/lists` you find 2 files. One .css file in which you can modify the appearance of the subscribe/unsubscribe window. And one config file, in which relevant information which describes the mailinglist.
+
+You have to create at least the config file per list. If there is no css file it will use the toplevel stylesheet located in the root of Minimalist Manager.
+
+
+### 4. Done
+This is all that is needed. Fire up your browser and go to the site that you specified to host Minimalist Manager.
+
+
+### 5. More information
+For more information you can go to the Minimalist website.
+https://high5.nl/mirrors/minimalist/index.html
blob - /dev/null
blob + 44aab43a5e781bb1755e292d8ed65b60420215a0 (mode 644)
--- /dev/null
+++ config.inc
@@ -0,0 +1,31 @@
+<?php
+// Minimalist Admin global config file.
+//
+// Specify the location of your lists.lst file.
+// From this file the available Minimalists will be printed.
+$CONF['minimalist_lists'] = "lists.lst";
+//
+// Specify the email address of your minimalist.
+$CONF['minimalist_email'] = "minimalist@high5.net";
+//
+// Specify the title for the main page heading.
+$CONF['minimalist_title'] = "Minimalist Mailinglist Manager";
+//
+// Specify the title for the subscribe / unsuibscribe page heading.
+$CONF['minimalist_list_title'] = "Subscribe / Unsubscribe to ";
+//
+// The parameters below can also be used in a local config file.
+//
+$CONF['list_name'] = "";
+//
+// If you want to allow the use of list-writers set this to enable.
+$CONF['list_writers'] = "enable";
+//
+// Specify the subscribe / unsubscribe text.
+$CONF['list_subscribe'] = "Thank you for subscribing! An email has been sent to you for subscription approval.";
+$CONF['list_unsubscribe'] = "We hate to loose you, come again soon! An email has been sent to you for unsubscription approval.";
+//
+// Specify the error messages.
+$CONF['error_email_nomatch'] = "<span class=\"error\">ERROR: The two email addresses don't match!</span>\n";
+$CONF['error_email_notvalid'] = "<span class=\"error\">ERROR: You have not entered a correct email address!</span>\n";
+?>
blob - /dev/null
blob + 5bdbbfad088e72bab634fe415f2161227bc9c114 (mode 644)
--- /dev/null
+++ index.php
@@ -0,0 +1,206 @@
+<?php
+//
+//    Minimalist Admin is a very simple webinterface for Minimalist
+//    Copyright (c) 2005-2014 High5! (Mischa Peters <mischa at high5 dot nl>)
+//
+//    This program is free software; you can redistribute it and/or modify
+//    it under the terms of the GNU General Public License as published by
+//    the Free Software Foundation; either version 2 of the License, or
+//    (at your option) any later version.
+//
+//    This program is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//    GNU General Public License for more details.
+//
+//    You should have received a copy of the GNU General Public License
+//    along with this program; if not, write to the Free Software
+//    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+//    Minimalist Admin verion 0.6, Copyright (c) 2005-2014 High5! (Mischa Peters)
+//    Minimalist Admin comes with ABSOLUTELY NO WARRANTY.
+//    This is free software, and you are welcome to redistribute it
+//    under certain conditions.
+//
+//    High5!, hereby disclaims all copyright interest in the program
+//    `Minimalist Admin' (which makes passes at Minimalist) written
+//    by Vladimir Litovka.
+//
+//error_reporting(E_NOTICE | E_ERROR | E_WARNING | E_PARSE);
+
+// Read global config file
+include "config.inc";
+
+// Minimalist Admin version
+$version = "0.6";
+
+// Set some variables.
+$get_list = "";
+$email = "";
+$emailconfirm = "";
+$writeonly = "";
+$unsubscribe = "";
+
+// _GET list to process
+if (!empty($_GET['l']))
+{
+  $get_list = $_GET['l'];
+  if (!preg_match('/^([a-z0-9-])+$/i', trim($get_list)))
+  {
+    header("Location: index.php");
+    exit;
+  }
+  // Check if list config exists and include it
+  if (file_exists("lists/$get_list-config.inc")) include "lists/$get_list-config.inc";
+}
+
+// Set variables from config.inc and lists/$get_list-config.inc
+$minimalist_lists = $CONF['minimalist_lists'];
+$minimalist_email = $CONF['minimalist_email'];
+$minimalist_title = $CONF['minimalist_title'];
+$minimalist_list_title = $CONF['minimalist_list_title'];
+$list_name = $CONF['list_name'];
+$list_writers = $CONF['list_writers'];
+$list_subscribe = $CONF['list_subscribe'];
+$list_unsubscribe = $CONF['list_unsubscribe'];
+$error_email_nomatch = $CONF['error_email_nomatch'];
+$error_email_notvalid = $CONF['error_email_notvalid'];
+
+// Print the html header
+print_header();
+
+// Test if REQUEST_METHOD is a GET request
+if ($_SERVER['REQUEST_METHOD'] == "GET")
+{
+  // If $get_list is not empty print list form
+  if (!empty($get_list))
+  {
+    print_form();
+    print_footer();
+  }
+  // If $get_list is empty process the $minimalist_lists file.
+  else
+  {
+    if (file_exists("$minimalist_lists"))
+    {
+      $fh = file("$minimalist_lists");
+      print "<table border=\"0\" class=\"list\">\n";
+      for ($i = 0; $i < sizeof($fh); $i++)
+      {
+        list($list, $desc) = preg_split("/\t/", $fh[$i], 2);
+        if (!empty($list)) print "<tr><td><a href=\"index.php?l=$list\">$list</a></td><td>$desc</td></tr>\n";
+      }
+      print "</table>\n";
+    }
+    else
+    {
+      print "Unable to find minimalists file at: $minimalist_lists\n";
+    }
+    print_footer();
+  }
+}
+
+// Test if REQUEST_METHOD is a GET request
+if ($_SERVER['REQUEST_METHOD'] == "POST")
+{
+  if (!empty($_POST['email'])) $email = $_POST['email'];
+  if (!empty($_POST['emailconfirm'])) $emailconfirm = $_POST['emailconfirm'];
+  if (!empty($_POST['writeonly'])) $writeonly = $_POST['writeonly'];
+  if (!empty($_POST['unsubscribe'])) $unsubscribe = $_POST['unsubscribe'];
+
+  if ($email != $emailconfirm)
+  {
+    print "$error_email_nomatch\n";
+    print_form();
+    print_footer();
+    exit;
+  }
+
+  if (!preg_match('/^[-!#$%&\'*+\\.\/0-9=?A-Z^_{|}~]+' . '@' . '([-0-9A-Z]+\.)+' . '([0-9A-Z]){2,4}$/i', trim($email)))
+  {
+    print "$error_email_notvalid\n";
+    print_form();
+    print_footer();
+    exit;
+  }
+
+  if (!empty($writeonly))
+  {
+    $get_list = $get_list . "-writers";
+  }
+
+  if ($unsubscribe)
+  {
+    mail($minimalist_email, "unsubscribe $get_list $email", "", "From: $email");
+    print "$list_unsubscribe\n";
+    print_footer();
+    exit;
+  }
+  else
+  {
+    mail($minimalist_email, "subscribe $get_list $email", "", "From: $email");
+    print "$list_subscribe\n";
+    print_footer();
+    exit;
+  }
+}
+
+function print_header()
+{
+  global $get_list;
+  global $minimalist_title;
+  global $minimalist_list_title;
+  global $list_name;
+  global $list_writers;
+
+  // Set the title_list_name to $list_name if $get_list is empty.
+  $title_list_name = (empty($list_name)) ? $get_list : $list_name;
+  // Set the title to $minimalist_title if $get_list is empty.
+  $title = (empty($get_list)) ? $minimalist_title : "$minimalist_list_title $title_list_name";
+
+  print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
+  print "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
+  print "<head>\n";
+  print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n";
+  if (file_exists(realpath("lists/$get_list-stylesheet.css")))
+  {
+    print "<link rel=\"stylesheet\" href=\"lists/$get_list-stylesheet.css\">\n";
+  }
+  else
+  {
+    print "<link rel=\"stylesheet\" href=\"stylesheet.css\">\n";
+  }
+  print "<title>$title</title>\n";
+  print "</head>\n";
+  print "<body>\n";
+  print "<h2>$title</h2>\n";
+}
+
+function print_form()
+{
+  global $list_writers;
+  print "<form method=\"post\">\n";
+  print "<table border=\"0\">\n";
+  print "<tr><td>Email:</td><td><input type=\"textbox\" name=\"email\"></td></tr>\n";
+  print "<tr><td>Email (verification):</td><td><input type=\"textbox\" name=\"emailconfirm\"></td></tr>\n";
+  if (preg_match("/enable/", $list_writers)) {
+    print "<tr><td>Post Only (don't receive):</td><td><input type=\"checkbox\" name=\"writeonly\"></td></tr>\n";
+  }
+  print "<tr><td>Unsubscribe:</td><td><input type=\"checkbox\" name=\"unsubscribe\"></td></tr>\n";
+  print "<tr><td align=\"center\" colspan=\"2\"><input type=\"submit\" name=\"submit\" value=\"Submit\"></tr>\n";
+  print "</table>\n";
+  print "</form>\n";
+  print "<br />\n";
+  print "<a href=\"index.php\">Back</a>\n";
+}
+
+function print_footer()
+{
+  global $version;
+  print "<div id=\"footer\">\n";
+  print "Copyright (c) 2005-2011 by <a target=\"blank\" href=\"http://high5.net/\">High5!</a> -- Minimalist Admin v$version</a>\n";
+  print "</div>\n";
+  print "</body>\n";
+  print "</html>\n";
+}
+?>
blob - /dev/null
blob + 2d85810bce37e6165ccc8a4f2fc435228927da88 (mode 644)
--- /dev/null
+++ lists/example-config.inc
@@ -0,0 +1,17 @@
+<?php
+// Minimalist Admin local config file.
+//
+// Specify a list_name if you don't want to use the list name from lists.lst.
+//$CONF['list_name'] = "Example List";
+//
+// If you want to allow the use of list-writers uncomment below 
+//$CONF['list_writers'] = "enable";
+//
+// Specify the subscribe / unsubscribe text.
+//$CONF['list_subscribe'] = "Thank you for subscribing! An email has been sent to you for subscription approval.";
+//$CONF['list_unsubscribe'] = "We hate to loose you, come again soon! An email has been sent to you for unsubscription approval.";
+//
+// Specify the error messages.
+//$CONF['error_email_nomatch'] = "<span class=\"error\">ERROR: The two email addresses don't match!</span>\n";
+//$CONF['error_email_notvalid'] = "<span class=\"error\">ERROR: You have not entered a correct email address!</span>\n";
+?>
blob - /dev/null
blob + 6a2de364b6b403e5e73c32f5bb22b29e60ce7620 (mode 644)
--- /dev/null
+++ lists/example-stylesheet.css
@@ -0,0 +1,73 @@
+body {
+        background: #ffffff;
+        color: #000000;
+        font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+        text-align: center;
+	margin-right: auto;
+	margin-left: auto;
+	width: 750px;
+}
+
+h2 {
+	background: #efefef;
+	color: #000000;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 20px;
+	font-weight: bold;
+	text-align: center;
+}
+
+table {
+	background: #efefef;
+	color: #000000;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+        text-align: left;
+	margin-top: 10px;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+table.list {
+	background: #ffffff;
+	color: #000000;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+        text-align: left;
+	margin-top: 10px;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+.error {
+	background: #ffffff;
+	color: #d01313;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+}
+
+#footer {
+    background: #efefef;
+    border-top: 1px solid #bbbbbb;
+    color: #999999;
+    font-size: 9px;
+    line-height: 20px;
+    margin: 20px auto;
+    text-align: left;
+    width: 750px;
+}
+
+#footer a {
+    color: #999999;
+    text-decoration: none;
+}
+
+#footer a:hover {
+    color: #777777;
+    text-decoration: underline;
+}
blob - /dev/null
blob + 168ce0c97177fb0a5430978d7af89ae76bc147de (mode 644)
--- /dev/null
+++ lists/index.php
@@ -0,0 +1,3 @@
+<?php
+header ("Location: ../");
+?>
blob - /dev/null
blob + 6a2de364b6b403e5e73c32f5bb22b29e60ce7620 (mode 644)
--- /dev/null
+++ stylesheet.css
@@ -0,0 +1,73 @@
+body {
+        background: #ffffff;
+        color: #000000;
+        font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+        text-align: center;
+	margin-right: auto;
+	margin-left: auto;
+	width: 750px;
+}
+
+h2 {
+	background: #efefef;
+	color: #000000;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 20px;
+	font-weight: bold;
+	text-align: center;
+}
+
+table {
+	background: #efefef;
+	color: #000000;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+        text-align: left;
+	margin-top: 10px;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+table.list {
+	background: #ffffff;
+	color: #000000;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+        text-align: left;
+	margin-top: 10px;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+.error {
+	background: #ffffff;
+	color: #d01313;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+        font-size: 13px;
+        font-weight: normal;
+}
+
+#footer {
+    background: #efefef;
+    border-top: 1px solid #bbbbbb;
+    color: #999999;
+    font-size: 9px;
+    line-height: 20px;
+    margin: 20px auto;
+    text-align: left;
+    width: 750px;
+}
+
+#footer a {
+    color: #999999;
+    text-decoration: none;
+}
+
+#footer a:hover {
+    color: #777777;
+    text-decoration: underline;
+}