diff --git a/build.bat b/build.bat index e092e4c..ae13ab5 100644 --- a/build.bat +++ b/build.bat @@ -1,2 +1,2 @@ del index.php -php build.old.php +php build.php diff --git a/build.php b/build.php index f0b1bf1..ca8054a 100644 --- a/build.php +++ b/build.php @@ -1,3 +1,66 @@ id; +} + +if(isset($_GET["modules"])) +{ + $module_list = explode(",", $_GET["modules"]); +} + +if(php_sapi_name() != "cli") +{ + header("content-type: text/php"); +} + +$core = file_get_contents("core.php"); +$settings = file_get_contents("settings.fragment.php"); +$settings = str_replace([ "" ], "", $settings); +$core = str_replace("{settings}", $settings, $core); + +$result = $core; + +foreach($module_list as $module_id) +{ + if($module_id == "") continue; + + $module_filepath = "modules/" . preg_replace("[^a-zA-Z0-9\-]", "", $module_id) . ".php"; + + //echo("id: $module_id | filepath: $module_filepath\n"); + + if(!file_exists($module_filepath)) + { + http_response_code(400); + exit("Failed to load module with name: $module_filepath"); + } + + $modulecode = file_get_contents($module_filepath); + $modulecode = str_replace([ "" ], "", $modulecode); + $result = str_replace( + "// %next_module% //", + "$modulecode\n// %next_module% //", + $result); +} + +if(php_sapi_name() == "cli") +{ + if(file_exists("index.php")) + { + echo("index.php already exists, exiting"); + exit(1); + } + else + { + file_put_contents("index.php", $result); + } +} +else +{ + exit($result); +} + ?> diff --git a/download.php b/download.php index cddc00f..acc8b70 100644 --- a/download.php +++ b/download.php @@ -79,7 +79,7 @@ checkboxes = document.querySelectorAll("input[type=checkbox]"); for(var i = 0; i < checkboxes.length; i++) { - url += encodeURIComponent(checkboxes[i].id); + url += encodeURIComponent(checkboxes[i].id) + ","; } location.href = url; } diff --git a/index.php b/index.php old mode 100755 new mode 100644 index fe003bb..ab75997 --- a/index.php +++ b/index.php @@ -1,6 +1,6 @@ -anonedits = false; // the name of the page that will act as the home page for the wiki. This page will be served if the user didn't specify a page. $settings->defaultpage = "Main Page"; +// the default action. This action will be performed if no other action is specified. +$settings->defaultaction = "view"; + // usernames and passwords - passwords should be hashed with sha256 $settings->users = [ "admin" => "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8", //password @@ -125,898 +128,1024 @@ Actions: page - page name delete=yes - actually do the deletion (otherwise we display a prompt) */ - - -/////////////////////////////////////////////////////////////////////////////////////////////// -/////////////// Do not edit below this line unless you know what you are doing! /////////////// -/////////////////////////////////////////////////////////////////////////////////////////////// -$version = "0.4"; -session_start(); -///////// Login System ///////// -//clear expired sessions -if(isset($_SESSION["$settings->sessionprefix-expiretime"]) and - $_SESSION["$settings->sessionprefix-expiretime"] < time()) -{ - //clear the session variables - $_SESSION = []; - session_destroy(); -} - -if(!isset($_SESSION[$settings->sessionprefix . "-user"]) and - !isset($_SESSION[$settings->sessionprefix . "-pass"])) -{ - //the user is not logged in - $isloggedin = false; -} -else -{ - $user = $_SESSION[$settings->sessionprefix . "-user"]; - $pass = $_SESSION[$settings->sessionprefix . "-pass"]; - if($settings->users[$user] == $pass) - { - //the user is logged in - $isloggedin = true; - } - else - { - //the user's login details are invalid (what is going on here?) - //unset the session variables, treat them as an anonymous user, and get out of here - $isloggedin = false; - unset($user); - unset($pass); - //clear the session data - $_SESSION = []; //delete al lthe variables - session_destroy(); //destroy the session - } -} -//check to see if the currently logged in user is an admin -$isadmin = false; -if($isloggedin) -{ - foreach($settings->admins as $admin_username) - { - if($admin_username == $user) - { - $isadmin = true; - break; - } - } -} -/////// Login System End /////// - -/////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Security and Consistency Measures //////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// -if(!file_exists("./pageindex.json")) -{ - $existingpages = glob("*.md"); - $pageindex = new stdClass(); - foreach($existingpages as $pagefilename) - { - $newentry = new stdClass(); - $newentry->filename = utf8_encode($pagefilename); - $newentry->size = filesize($pagefilename); - $newentry->lastmodified = filemtime($pagefilename); - $newentry->lasteditor = utf8_encode("unknown"); - $pagekey = utf8_encode(substr($pagefilename, 0, -3)); - $pageindex->$pagekey = $newentry; - } - file_put_contents("./pageindex.json", json_encode($pageindex, JSON_PRETTY_PRINT)); - unset($existingpages); -} -else -{ - $pageindex = json_decode(file_get_contents("./pageindex.json")); -} -/* - * @summary makes a path safe - * - * @details paths may only contain alphanumeric characters, spaces, underscores, and dashes - */ -function makepathsafe($string) { return preg_replace("/[^0-9a-zA-Z\_\-\ ]/i", "", $string); } - -/* - * @summary Hides an email address from bots by adding random html entities. - * - * @returns The mangled email address. - */ -function hide_email($str) -{ - $hidden_email = ""; - for($i = 0; $i < strlen($str); $i++) - { - if($str[$i] == "@") - { - $hidden_email .= "&#" . ord("@") . ";"; - continue; - } - if(rand(0, 1) == 0) - $hidden_email .= $str[$i]; - else - $hidden_email .= "&#" . ord($str[$i]) . ";"; - } - - return $hidden_email; -} - -//Work around an Opera + Syntastic bug where there is no margin at the left hand side if there isn't a query string when accessing a .php file -if(!isset($_GET["action"]) and !isset($_GET["page"])) -{ - http_response_code(302); - header("location: index.php?action=view&page=$defaultpage"); - exit(); -} - -//make sure that the action is set -if(!isset($_GET["action"])) - $_GET["action"] = "view"; - -if(!isset($_GET["page"]) or strlen($_GET["page"]) === 0) - $_GET["page"] = $settings->defaultpage; - -//redirect the user to the safe version of the path if they entered an unsafe character -if(makepathsafe($_GET["page"]) !== $_GET["page"]) -{ - http_response_code(301); - header("location: index.php?action=" . rawurlencode($_GET["action"]) . "&page=" . makepathsafe($_GET["page"])); - header("x-requested-page: " . $_GET["page"]); - header("x-actual-page: " . makepathsafe($_GET["page"])); - exit(); -} -$page = $_GET["page"]; - -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////// HTML fragments ////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////// -function renderpage($title, $content, $minimal = false) -{ - global $settings, $page, $user, $isloggedin, $isadmin, $start_time, $pageindex; - - $html = " - - - $title - - "; - if(preg_match("/^[^\/]*\/\/|^\//", $settings->css)) - { - $html .= "\n\t\t\n"; - } - else - { - $html .= "\n\t\t\n"; - } - $html .= "\n"; - - ////////// - - if($minimal) - { - $html .= "$content -
-

From $settings->sitename, which is managed by " . $settings->admindetails["name"] . ".

-

Timed at " . date("l jS \of F Y \a\\t h:ia T") . ".

-

Powered by Pepperminty Wiki

"; - } - else - { - $html .= " -

$settings->sitename

- $content -
- - \n"; - - foreach($pageindex as $pagename => $pagedetails) - { - $html .= "\t\t"; - } - - ////////// - $gentime = microtime(true) - $start_time; - $html .= "\n\t -"; - - return $html; -} - -//////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////// Slimdown ///////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// %slimdown% // -//////////////////////////////////////////////////////////////////////////////////////////// -/** - * Slimdown - A very basic regex-based Markdown parser. Supports the - * following elements (and can be extended via Slimdown::add_rule()): - * - * - Headers - * - Links - * - Bold - * - Emphasis - * - Deletions - * - Quotes - * - Inline code - * - Blockquotes - * - Ordered/unordered lists - * - Horizontal rules - * - * Author: Johnny Broadway - * Website: https://gist.github.com/jbroadway/2836900 - * License: MIT - */ - -/** - * Modified by Starbeamrainbowlabs (starbeamrainbowlabs) - * - * Changed bold to use single asterisks - * Changed italics to use single underscores - * Added one to add the heading levels (no

tags allowed) - * Added wiki style internal link parsing - * Added wiki style internal link parsing with display text - */ -class Slimdown { - public static $rules = array ( - '/\r\n/' => "\n", // new line normalisation - '/(#+)(.*)/' => 'self::header', // headers - '/(\*)(.*?)\1/' => '\2', // bold - '/(_)(.*?)\1/' => '\2', // emphasis - '/\[\[([a-zA-Z0-9\_\- ]+)\|([a-zA-Z0-9\_\- ]+)\]\]/' => '\2', //internal links with display text - '/\[\[([a-zA-Z0-9\_\- ]+)\]\]/' => '\1', //internal links - '/\[([^\[]+)\]\(([^\)]+)\)/' => '\1', // links - '/\~\~(.*?)\~\~/' => '\1', // del - '/\:\"(.*?)\"\:/' => '\1', // quote - '/`(.*?)`/' => '\1', // inline code - '/\n\s*(\*|-)(.*)/' => 'self::ul_list', // ul lists - '/\n[0-9]+\.(.*)/' => 'self::ol_list', // ol lists - '/\n(>|\>)(.*)/' => 'self::blockquote', // blockquotes - '/\n-{3,}/' => "\n
", // horizontal rule - '/\n([^\n]+)\n\n/' => 'self::para', // add paragraphs - '/<\/ul>\s?