diff options
author | Mischa Peters <mpeters@high5.nl> | 2014-08-03 10:44:22 +0200 |
---|---|---|
committer | Mischa Peters <mpeters@high5.nl> | 2014-08-03 10:44:22 +0200 |
commit | 9e422ec7a8af767683c1a6fb87d6749ab7b436a1 (patch) | |
tree | 8cc2deb536d76fd00c93e7d0b94271a153a8583d |
Initial Commit
-rw-r--r-- | CHANGELOG.md | 31 | ||||
-rw-r--r-- | README.md | 38 | ||||
-rw-r--r-- | config.inc | 31 | ||||
-rw-r--r-- | index.php | 206 | ||||
-rw-r--r-- | lists/example-config.inc | 17 | ||||
-rw-r--r-- | lists/example-stylesheet.css | 73 | ||||
-rw-r--r-- | lists/index.php | 3 | ||||
-rw-r--r-- | stylesheet.css | 73 |
8 files changed, 472 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..14e4dd4 --- /dev/null +++ b/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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..158c429 --- /dev/null +++ b/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 diff --git a/config.inc b/config.inc new file mode 100644 index 0000000..44aab43 --- /dev/null +++ b/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"; +?> diff --git a/index.php b/index.php new file mode 100644 index 0000000..5bdbbfa --- /dev/null +++ b/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"; +} +?> diff --git a/lists/example-config.inc b/lists/example-config.inc new file mode 100644 index 0000000..2d85810 --- /dev/null +++ b/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"; +?> diff --git a/lists/example-stylesheet.css b/lists/example-stylesheet.css new file mode 100644 index 0000000..6a2de36 --- /dev/null +++ b/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; +} diff --git a/lists/index.php b/lists/index.php new file mode 100644 index 0000000..168ce0c --- /dev/null +++ b/lists/index.php @@ -0,0 +1,3 @@ +<?php +header ("Location: ../"); +?> diff --git a/stylesheet.css b/stylesheet.css new file mode 100644 index 0000000..6a2de36 --- /dev/null +++ b/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; +} |