commit - /dev/null
commit + 9e422ec7a8af767683c1a6fb87d6749ab7b436a1
blob - /dev/null
blob + 14e4dd49773cb28ef3e779d5ccaab5654d0e6c84 (mode 644)
--- /dev/null
+++ CHANGELOG.md
+# 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
+# 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
+<?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
+<?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
+<?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
+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
+<?php
+header ("Location: ../");
+?>
blob - /dev/null
blob + 6a2de364b6b403e5e73c32f5bb22b29e60ce7620 (mode 644)
--- /dev/null
+++ stylesheet.css
+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;
+}