From 5ca2a644e860a073093706a14b3f7f49f4e3dea4 Mon Sep 17 00:00:00 2001
From: Starbeamrainbowlabs <sbrl@starbeamrainbowlabs.com>
Date: Mon, 5 Jan 2015 18:44:11 +0000
Subject: [PATCH] Fixed issue #1 and corrected 'built by' url

---
 core.php  |  18 +-
 index.php | 520 ++++++++++++++++++++++++++++--------------------------
 2 files changed, 285 insertions(+), 253 deletions(-)

diff --git a/core.php b/core.php
index 1ee38ea..0056710 100644
--- a/core.php
+++ b/core.php
@@ -208,7 +208,7 @@ function renderpage($title, $content, $minimal = false)
 	$content
 	<hr class='footerdivider' />
 	<footer>
-		<p>Powered by Pepperminty Wiki, which was built by <a href='//starbeamrainbowlabs'>Starbeamrainbowlabs</a>. Send bugs to 'bugs at starbeamrainbowlabs dot com' or open an issue <a href='//github.com/sbrl/Pepperminty-Wiki'>on github</a>.</p>
+		<p>Powered by Pepperminty Wiki, which was built by <a href='//starbeamrainbowlabs.com/'>Starbeamrainbowlabs</a>. Send bugs to 'bugs at starbeamrainbowlabs dot com' or open an issue <a href='//github.com/sbrl/Pepperminty-Wiki'>on github</a>.</p>
 		<p>Your local friendly administrators are " . implode(", ", $admins) . ".
 		<p>This wiki is managed by <a href='mailto:" . hide_email($admindetails["email"]) . "'>" . $admindetails["name"] . "</a>.</p>
 	</footer>
@@ -526,6 +526,13 @@ switch($_GET["action"])
 	 *                    %delete%
 	 */
 	case "delete":
+		if(!$editing)
+		{
+			exit(renderpage("Deleting $page - error", "<p>You tried to delete $page, but editing is disabled on this wiki.</p>
+			<p>If you wish to delete this page, please re-enable editing on this wiki first.</p>
+			<p><a href='index.php?page=$page'>Go back to $page</a>.</p>
+			<p>Nothing has been changed.</p>"));
+		}
 		if(!$isadmin)
 		{
 			exit(renderpage("Deleting $page - error", "<p>You tried to delete $page, but you are not an admin so you don't have permission to do that.</p>
@@ -553,9 +560,18 @@ switch($_GET["action"])
 	 *                  %move%
 	 */
 	case "move":
+		if(!$editing)
+		{
+			exit(renderpage("Moving $page - error", "<p>You tried to move $page, but editing is disabled on this wiki.</p>
+			<p>If you wish to move this page, please re-enable editing on this wiki first.</p>
+			<p><a href='index.php?page=$page'>Go back to $page</a>.</p>
+			<p>Nothing has been changed.</p>"));
+		}
 		if(!$isadmin)
+		{
 			exit(renderpage("Moving $page - Error", "<p>You tried to move $page, but you do not have permission to do that.</p>
 			<p>You should try <a href='index.php?action=login'>logging in</a> as an admin.</p>"));
+		}
 
 		if(!isset($_GET["new_name"]) or strlen($_GET["new_name"]) == 0)
 			exit(renderpage("Moving $page", "<h2>Moving $page</h2>
diff --git a/index.php b/index.php
index 47605ba..63d8c9b 100755
--- a/index.php
+++ b/index.php
@@ -1,5 +1,5 @@
 <?php
-$start_time = time(true);
+$start_time = time(true);
 
 
 /*
@@ -116,7 +116,7 @@ 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! ///////////////
@@ -149,19 +149,19 @@ else
 		setcookie($cookieprefix . "-pass", null, -1, "/");
 	}
 }
-//check to see if the currently logged in user is an admin
-$isadmin = false;
-if($isloggedin)
-{
-	foreach($admins as $admin_username)
-	{
-		if($admin_username == $user)
-		{
-			$isadmin = true;
-			break;
-		}
-	}
-}
+//check to see if the currently logged in user is an admin
+$isadmin = false;
+if($isloggedin)
+{
+	foreach($admins as $admin_username)
+	{
+		if($admin_username == $user)
+		{
+			$isadmin = true;
+			break;
+		}
+	}
+}
 /////// Login System End ///////
 
 ///////////////////////////////////////////////////////////////////////////////////////////
@@ -242,7 +242,7 @@ if(makepathsafe($_GET["page"]) !== $_GET["page"])
 	header("x-actual-page: " . makepathsafe($_GET["page"]));
 	exit();
 }
-$page = $_GET["page"];
+$page = $_GET["page"];
 
 ///////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////
@@ -252,22 +252,22 @@ $page = $_GET["page"];
 ////////////////////////////////////////////////////////////////////////////////////////////
 function renderpage($title, $content, $minimal = false)
 {
-	global $sitename, $page, $css, $favicon, $user, $isloggedin, $isadmin, $admins, $admindisplaychar, $navlinks, $admindetails, $start_time, $pageindex;
+	global $sitename, $page, $css, $favicon, $user, $isloggedin, $isadmin, $admins, $admindisplaychar, $navlinks, $admindetails, $start_time, $pageindex;
 	
 	$html = "<!DOCTYPE HTML>
 <html><head>
 	<meta charset='utf-8' />
 	<title>$title</title>
-	<link rel='shortcut icon' href='$favicon' />";
-	if(preg_match("/^[^\/]*\/\/|^\//", $css))
-	{
-		$html .= "\n\t\t<link rel='stylesheet' href='$css' />\n";
-	}
-	else
-	{
-		$html .= "\n\t\t<style>$css</style>\n";
-	}
-	$html .= "</head><body>\n";
+	<link rel='shortcut icon' href='$favicon' />";
+	if(preg_match("/^[^\/]*\/\/|^\//", $css))
+	{
+		$html .= "\n\t\t<link rel='stylesheet' href='$css' />\n";
+	}
+	else
+	{
+		$html .= "\n\t\t<style>$css</style>\n";
+	}
+	$html .= "</head><body>\n";
 	
 	//////////
 	
@@ -284,47 +284,47 @@ function renderpage($title, $content, $minimal = false)
 		$html .= "<nav>\n";
 	
 		if($isloggedin)
-		{
-			$html .= "\t\tLogged in as ";
-			if($isadmin)
-				$html .= $admindisplaychar;
-			$html .= "$user. <a href='index.php?action=logout'>Logout</a>. | \n";
-
-		}
+		{
+			$html .= "\t\tLogged in as ";
+			if($isadmin)
+				$html .= $admindisplaychar;
+			$html .= "$user. <a href='index.php?action=logout'>Logout</a>. | \n";
+
+		}
 		else
 			$html .= "\t\tBrowsing as Anonymous. <a href='index.php?action=login'>Login</a>. | \n";
 
-		foreach($navlinks as $item)
+		foreach($navlinks as $item)
 		{
-			if(is_string($item))
+			if(is_string($item))
 			{
-				//the item is a string
-				switch($item)
-				{
-					//keywords
-					case "search": //displays a search bar
-						$html .= "<form method='get' action='index.php' style='display: inline;'><input type='search' name='page' list='allpages' placeholder='Type a page name here and hit enter' /></form>";
-						break;
-
-					//it isn't a keyword, so just output it directly
-					default:
-						$html .= $item;
-				}
+				//the item is a string
+				switch($item)
+				{
+					//keywords
+					case "search": //displays a search bar
+						$html .= "<form method='get' action='index.php' style='display: inline;'><input type='search' name='page' list='allpages' placeholder='Type a page name here and hit enter' /></form>";
+						break;
+
+					//it isn't a keyword, so just output it directly
+					default:
+						$html .= $item;
+				}
 			}
 			else
 			{
 				//output the display as a link to the url
-				$html .= "\t\t<a href='" . str_replace("{page}", $page, $item[1]) . "'>$item[0]</a>\n";
+				$html .= "\t\t<a href='" . str_replace("{page}", $page, $item[1]) . "'>$item[0]</a>\n";
 			}
 		}
-
+
 		$html .= "	</nav>
 	<h1 class='sitename'>$sitename</h1>
 	$content
 	<hr class='footerdivider' />
 	<footer>
-		<p>Powered by Pepperminty Wiki, which was built by <a href='//starbeamrainbowlabs'>Starbeamrainbowlabs</a>. Send bugs to 'bugs at starbeamrainbowlabs dot com' or open an issue <a href='//github.com/sbrl/Pepperminty-Wiki'>on github</a>.</p>
-		<p>Your local friendly administrators are " . implode(", ", $admins) . ".
+		<p>Powered by Pepperminty Wiki, which was built by <a href='//starbeamrainbowlabs.com/'>Starbeamrainbowlabs</a>. Send bugs to 'bugs at starbeamrainbowlabs dot com' or open an issue <a href='//github.com/sbrl/Pepperminty-Wiki'>on github</a>.</p>
+		<p>Your local friendly administrators are " . implode(", ", $admins) . ".
 		<p>This wiki is managed by <a href='mailto:" . hide_email($admindetails["email"]) . "'>" . $admindetails["name"] . "</a>.</p>
 	</footer>
 	<datalist id='allpages'>\n";
@@ -347,7 +347,7 @@ function renderpage($title, $content, $minimal = false)
 ////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////// Slimdown /////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////// %slimdown% //
+////////////////////////////////////////////////////////////////////////////// %slimdown% //
 ////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Slimdown - A very basic regex-based Markdown parser. Supports the
@@ -390,7 +390,7 @@ class Slimdown {
 		'/\~\~(.*?)\~\~/' => '<del>\1</del>',						// del
 		'/\:\"(.*?)\"\:/' => '<q>\1</q>',							// quote
 		'/`(.*?)`/' => '<code>\1</code>',							// inline code
-		'/\n\s*(\*|-)(.*)/' => 'self::ul_list',							// ul lists
+		'/\n\s*(\*|-)(.*)/' => 'self::ul_list',							// ul lists
 		'/\n[0-9]+\.(.*)/' => 'self::ol_list',						// ol lists
 		'/\n(&gt;|\>)(.*)/' => 'self::blockquote',					// blockquotes
 		'/\n-{3,}/' => "\n<hr />",									// horizontal rule
@@ -408,7 +408,7 @@ class Slimdown {
 		return sprintf ("\n<p>%s</p>\n", $trimmed);
 	}
 	private static function ul_list ($regs) {
-		$item = $regs[2];
+		$item = $regs[2];
 		return sprintf ("\n<ul>\n\t<li>%s</li>\n</ul>", trim($item));
 	}
 	private static function ol_list ($regs) {
@@ -482,104 +482,104 @@ function human_time_since($time)
 
 switch($_GET["action"])
 {
-	/*
-	 *           _ _ _
-	 *   ___  __| (_) |_
-	 *  / _ \/ _` | | __|
-	 * |  __/ (_| | | |_
-	 *  \___|\__,_|_|\__|
-	 *             %edit%
-	 */
+	/*
+	 *           _ _ _
+	 *   ___  __| (_) |_
+	 *  / _ \/ _` | | __|
+	 * |  __/ (_| | | |_
+	 *  \___|\__,_|_|\__|
+	 *             %edit%
+	 */
 	case "edit":
 		if(!$editing)
 		{
 			http_response_code(203);
-			header("location: index.php?page=$page");
+			header("location: index.php?page=$page");
 		}
-
-		$filename = "$page.md";
-		$creatingpage = !isset($pageindex->$page);
+
+		$filename = "$page.md";
+		$creatingpage = !isset($pageindex->$page);
 		if((isset($_GET["newpage"]) and $_GET["newpage"] == "true") or $creatingpage)
 		{
-			$title = "Creating $page";
+			$title = "Creating $page";
 		}
 		else
 		{
-			$title = "Editing $page";
+			$title = "Editing $page";
 		}
-
+
 		$pagetext = "";
-		if(isset($pageindex->$page))
+		if(isset($pageindex->$page))
 		{
 			$pagetext = file_get_contents($filename);
 		}
 		
-		if((!$isloggedin and !$anonedits) or !$editing)
-		{
-			if(!$creatingpage)
-			{
-				//the page already exists - let the user view the page source
-				exit(renderpage("Viewing source for $page", "<textarea readonly>$pagetext</textarea>"));
-			}
-			else
-			{
-				http_response_code(404);
-				exit(renderpage("404 - $page", "<p>The page <code>$page</code> does not exist, but you do not have permission to create it.</p><p>If you haven't already, perhaps you should try <a href='index.php?action=login'>logging in</a>.</p>"));
-			}
-		}
-
+		if((!$isloggedin and !$anonedits) or !$editing)
+		{
+			if(!$creatingpage)
+			{
+				//the page already exists - let the user view the page source
+				exit(renderpage("Viewing source for $page", "<textarea readonly>$pagetext</textarea>"));
+			}
+			else
+			{
+				http_response_code(404);
+				exit(renderpage("404 - $page", "<p>The page <code>$page</code> does not exist, but you do not have permission to create it.</p><p>If you haven't already, perhaps you should try <a href='index.php?action=login'>logging in</a>.</p>"));
+			}
+		}
+
 		$content = "<h1>$title</h1>";
 		if(!$isloggedin and $anonedits)
 		{
 			$content .= "<p><strong>Warning: You are not logged in! Your IP address <em>may</em> be recorded.</strong></p>";
 		}
-		$content .= "<form method='post' action='index.php?action=save&page=" . rawurlencode($page) . "&action=save'>
+		$content .= "<form method='post' action='index.php?action=save&page=" . rawurlencode($page) . "&action=save'>
 		<textarea name='content'>$pagetext</textarea>
 		<input type='submit' value='Save Page' />
 	</form>";
 		exit(renderpage("$title - $sitename", $content));
 		break;
 	
-	/*
-	 *
-	 *  ___  __ ___   _____
-	 * / __|/ _` \ \ / / _ \
-	 * \__ \ (_| |\ V /  __/
-	 * |___/\__,_| \_/ \___|
-	 *                %save%
-	 */
+	/*
+	 *
+	 *  ___  __ ___   _____
+	 * / __|/ _` \ \ / / _ \
+	 * \__ \ (_| |\ V /  __/
+	 * |___/\__,_| \_/ \___|
+	 *                %save%
+	 */
 	case "save":
 		if(!$editing)
 		{
-			header("location: index.php?page=$page");
+			header("location: index.php?page=$page");
 			exit(renderpage("Error saving edit", "<p>Editing is currently disabled on this wiki.</p>"));
 		}
 		if(!$isloggedin and !$anonedits)
 		{
 			http_response_code(403);
-			header("refresh: 5; url=index.php?page=$page");
+			header("refresh: 5; url=index.php?page=$page");
 			exit("You are not logged in, so you are not allowed to save pages on $sitename. Redirecting in 5 seconds....");
 		}
 		if(!isset($_POST["content"]))
 		{
 			http_response_code(400);
-			header("refresh: 5; url=index.php?page=$page");
+			header("refresh: 5; url=index.php?page=$page");
 			exit("Bad request: No content specified.");
 		}
-		if(file_put_contents("$page.md", htmlentities($_POST["content"]), ENT_QUOTES) !== false)
+		if(file_put_contents("$page.md", htmlentities($_POST["content"]), ENT_QUOTES) !== false)
 		{
 			//update the page index
-			if(!isset($pageindex->$page))
+			if(!isset($pageindex->$page))
 			{
-				$pageindex->$page = new stdClass();
-				$pageindex->$page->filename = "$page.md";
+				$pageindex->$page = new stdClass();
+				$pageindex->$page->filename = "$page.md";
 			}
-			$pageindex->$page->size = strlen($_POST["content"]);
-			$pageindex->$page->lastmodified = time();
+			$pageindex->$page->size = strlen($_POST["content"]);
+			$pageindex->$page->lastmodified = time();
 			if($isloggedin)
-				$pageindex->$page->lasteditor = utf8_encode($user);
+				$pageindex->$page->lasteditor = utf8_encode($user);
 			else
-				$pageindex->$page->lasteditor = utf8_encode("anonymous");
+				$pageindex->$page->lasteditor = utf8_encode("anonymous");
 			
 			file_put_contents("./pageindex.json", json_encode($pageindex, JSON_PRETTY_PRINT));
 			
@@ -588,7 +588,7 @@ switch($_GET["action"])
 			else
 				http_response_code(200);
 			
-			header("location: index.php?page=$page");
+			header("location: index.php?page=$page");
 			exit();
 		}
 		else
@@ -599,14 +599,14 @@ switch($_GET["action"])
 		}
 		break;
 	
-	/*
-	 *  _ _     _
-	 * | (_)___| |_
-	 * | | / __| __|
-	 * | | \__ \ |_
-	 * |_|_|___/\__|
-	 *        %list%
-	 */
+	/*
+	 *  _ _     _
+	 * | (_)___| |_
+	 * | | / __| __|
+	 * | | \__ \ |_
+	 * |_|_|___/\__|
+	 *        %list%
+	 */
 	case "list":
 		$title = "All Pages";
 		$content = "	<h1>$title on $sitename</h1>
@@ -632,93 +632,109 @@ switch($_GET["action"])
 		exit(renderpage("$title - $sitename", $content));
 		break;
 	
-	/*
-	 *      _      _      _
-	 *   __| | ___| | ___| |_ ___
-	 *  / _` |/ _ \ |/ _ \ __/ _ \
-	 * | (_| |  __/ |  __/ ||  __/
-	 *  \__,_|\___|_|\___|\__\___|
-	 *                    %delete%
-	 */
+	/*
+	 *      _      _      _
+	 *   __| | ___| | ___| |_ ___
+	 *  / _` |/ _ \ |/ _ \ __/ _ \
+	 * | (_| |  __/ |  __/ ||  __/
+	 *  \__,_|\___|_|\___|\__\___|
+	 *                    %delete%
+	 */
 	case "delete":
-		if(!$isadmin)
-		{
-			exit(renderpage("Deleting $page - error", "<p>You tried to delete $page, but you are not an admin so you don't have permission to do that.</p>
-			<p>You should try <a href='index.php?action=login'>logging in</a> as an admin.</p>"));
-		}
-		if(!isset($_GET["delete"]) or $_GET["delete"] !== "yes")
-		{
-			exit(renderpage("Deleting $page", "<p>You are about to <strong>delete</strong> $page. You can't undo this!</p>
-			<p><a href='index.php?action=delete&page=$page&delete=yes'>Click here to delete $page.</a></p>
-			<p><a href='index.php?action=view&page=$page'>Click here to go back.</a>"));
-		}
-		unset($pageindex->$page); //delete the page from the page index
-		file_put_contents("./pageindex.json", json_encode($pageindex, JSON_PRETTY_PRINT)); //save the new page index
-		unlink("./$page.md"); //delete the page from the disk
-
-		exit(renderpage("Deleting $page - $sitename", "<p>$page has been deleted. <a href='index.php'>Go back to the main page</a>.</p>"));
+		if(!$editing)
+		{
+			exit(renderpage("Deleting $page - error", "<p>You tried to delete $page, but editing is disabled on this wiki.</p>
+			<p>If you wish to delete this page, please re-enable editing on this wiki first.</p>
+			<p><a href='index.php?page=$page'>Go back to $page</a>.</p>
+			<p>Nothing has been changed.</p>"));
+		}
+		if(!$isadmin)
+		{
+			exit(renderpage("Deleting $page - error", "<p>You tried to delete $page, but you are not an admin so you don't have permission to do that.</p>
+			<p>You should try <a href='index.php?action=login'>logging in</a> as an admin.</p>"));
+		}
+		if(!isset($_GET["delete"]) or $_GET["delete"] !== "yes")
+		{
+			exit(renderpage("Deleting $page", "<p>You are about to <strong>delete</strong> $page. You can't undo this!</p>
+			<p><a href='index.php?action=delete&page=$page&delete=yes'>Click here to delete $page.</a></p>
+			<p><a href='index.php?action=view&page=$page'>Click here to go back.</a>"));
+		}
+		unset($pageindex->$page); //delete the page from the page index
+		file_put_contents("./pageindex.json", json_encode($pageindex, JSON_PRETTY_PRINT)); //save the new page index
+		unlink("./$page.md"); //delete the page from the disk
+
+		exit(renderpage("Deleting $page - $sitename", "<p>$page has been deleted. <a href='index.php'>Go back to the main page</a>.</p>"));
 		break;
 	
-	/*
-	 *  __  __
-	 * |  \/  | _____   _____
-	 * | |\/| |/ _ \ \ / / _ \
-	 * | |  | | (_) \ V /  __/
-	 * |_|  |_|\___/ \_/ \___|
-	 *                  %move%
-	 */
-	case "move":
-		if(!$isadmin)
-			exit(renderpage("Moving $page - Error", "<p>You tried to move $page, but you do not have permission to do that.</p>
-			<p>You should try <a href='index.php?action=login'>logging in</a> as an admin.</p>"));
-
-		if(!isset($_GET["new_name"]) or strlen($_GET["new_name"]) == 0)
-			exit(renderpage("Moving $page", "<h2>Moving $page</h2>
-			<form method='get' action='index.php'>
-				<input type='hidden' name='action' value='move' />
-				<label for='old_name'>Old Name:</label>
-				<input type='text' name='page' value='$page' readonly />
-				<br />
-				<label for='new_name'>New Name:</label>
-				<input type='text' name='new_name' />
-				<br />
-				<input type='submit' value='Move Page' />
-			</form>"));
-
-		$new_name = makepathsafe($_GET["new_name"]);
-
-		if(!isset($pageindex->$page))
-			exit(renderpage("Moving $page - Error", "<p>You tried to move $page to $new_name, but the page with the name $page does not exist in the first place.</p>
-			<p>Nothing has been changed.</p>"));
-
-		if($page == $new_name)
-			exit(renderpage("Moving $page - Error", "<p>You tried to move $page, but the new name you gave is the same as it's current name.</p>
-			<p>It is possible that you tried to use some characters in the new name that are not allowed and were removed.</p>
-			<p>Page names may only contain alphanumeric characters, dashes, and underscores.</p>"));
-
-		//move the page in the page index
-		$pageindex->$new_name = new stdClass();
-		foreach($pageindex->$page as $key => $value)
-		{
-			$pageindex->$new_name->$key = $value;
-		}
-		unset($pageindex->$page);
-		file_put_contents("./pageindex.json", json_encode($pageindex, JSON_PRETTY_PRINT));
-
-		//move the page on the disk
-		rename("$page.md", "$new_name.md");
-
-		exit(renderpage("Moving $page", "<p><a href='index.php?page=$page'>$page</a> has been moved to <a href='index.php?page=$new_name'>$new_name</a> successfully.</p>"));
-		break;
-
-	/*
-	 *  _          _
-	 * | |__   ___| |_ __
-	 * | '_ \ / _ \ | '_ \
-	 * | | | |  __/ | |_) |
-	 * |_| |_|\___|_| .__/
-	 *   %help%     |_|
-	 */
+	/*
+	 *  __  __
+	 * |  \/  | _____   _____
+	 * | |\/| |/ _ \ \ / / _ \
+	 * | |  | | (_) \ V /  __/
+	 * |_|  |_|\___/ \_/ \___|
+	 *                  %move%
+	 */
+	case "move":
+		if(!$editing)
+		{
+			exit(renderpage("Moving $page - error", "<p>You tried to move $page, but editing is disabled on this wiki.</p>
+			<p>If you wish to move this page, please re-enable editing on this wiki first.</p>
+			<p><a href='index.php?page=$page'>Go back to $page</a>.</p>
+			<p>Nothing has been changed.</p>"));
+		}
+		if(!$isadmin)
+		{
+			exit(renderpage("Moving $page - Error", "<p>You tried to move $page, but you do not have permission to do that.</p>
+			<p>You should try <a href='index.php?action=login'>logging in</a> as an admin.</p>"));
+		}
+
+		if(!isset($_GET["new_name"]) or strlen($_GET["new_name"]) == 0)
+			exit(renderpage("Moving $page", "<h2>Moving $page</h2>
+			<form method='get' action='index.php'>
+				<input type='hidden' name='action' value='move' />
+				<label for='old_name'>Old Name:</label>
+				<input type='text' name='page' value='$page' readonly />
+				<br />
+				<label for='new_name'>New Name:</label>
+				<input type='text' name='new_name' />
+				<br />
+				<input type='submit' value='Move Page' />
+			</form>"));
+
+		$new_name = makepathsafe($_GET["new_name"]);
+
+		if(!isset($pageindex->$page))
+			exit(renderpage("Moving $page - Error", "<p>You tried to move $page to $new_name, but the page with the name $page does not exist in the first place.</p>
+			<p>Nothing has been changed.</p>"));
+
+		if($page == $new_name)
+			exit(renderpage("Moving $page - Error", "<p>You tried to move $page, but the new name you gave is the same as it's current name.</p>
+			<p>It is possible that you tried to use some characters in the new name that are not allowed and were removed.</p>
+			<p>Page names may only contain alphanumeric characters, dashes, and underscores.</p>"));
+
+		//move the page in the page index
+		$pageindex->$new_name = new stdClass();
+		foreach($pageindex->$page as $key => $value)
+		{
+			$pageindex->$new_name->$key = $value;
+		}
+		unset($pageindex->$page);
+		file_put_contents("./pageindex.json", json_encode($pageindex, JSON_PRETTY_PRINT));
+
+		//move the page on the disk
+		rename("$page.md", "$new_name.md");
+
+		exit(renderpage("Moving $page", "<p><a href='index.php?page=$page'>$page</a> has been moved to <a href='index.php?page=$new_name'>$new_name</a> successfully.</p>"));
+		break;
+
+	/*
+	 *  _          _
+	 * | |__   ___| |_ __
+	 * | '_ \ / _ \ | '_ \
+	 * | | | |  __/ | |_) |
+	 * |_| |_|\___|_| .__/
+	 *   %help%     |_|
+	 */
 	case "help":
 		$title = "Help - $sitename";
 		$content = "	<h1>$sitename Help</h1>
@@ -747,14 +763,14 @@ switch($_GET["action"])
 		exit(renderpage($title, $content));
 		break;
 	
-	/*
-	 *  _             _
-	 * | | ___   __ _(_)_ __
-	 * | |/ _ \ / _` | | '_ \
-	 * | | (_) | (_| | | | | |
-	 * |_|\___/ \__, |_|_| |_|
-	 *          |___/  %login%
-	 */
+	/*
+	 *  _             _
+	 * | | ___   __ _(_)_ __
+	 * | |/ _ \ / _` | | '_ \
+	 * | | (_) | (_| | | | | |
+	 * |_|\___/ \__, |_|_| |_|
+	 *          |___/  %login%
+	 */
 	case "login":
 		$title = "Login to $sitename";
 		$content = "<h1>Login to $sitename</h1>\n";
@@ -770,14 +786,14 @@ switch($_GET["action"])
 		exit(renderpage($title, $content));
 		break;
 	
-	/*
-	 *       _               _    _             _
-	 *   ___| |__   ___  ___| | _| | ___   __ _(_)_ __
-	 *  / __| '_ \ / _ \/ __| |/ / |/ _ \ / _` | | '_ \
-	 * | (__| | | |  __/ (__|   <| | (_) | (_| | | | | |
-	 *  \___|_| |_|\___|\___|_|\_\_|\___/ \__, |_|_| |_|
-	 *     %checklogin%                   |___/
-	 */
+	/*
+	 *       _               _    _             _
+	 *   ___| |__   ___  ___| | _| | ___   __ _(_)_ __
+	 *  / __| '_ \ / _ \/ __| |/ / |/ _ \ / _` | | '_ \
+	 * | (__| | | |  __/ (__|   <| | (_) | (_| | | | | |
+	 *  \___|_| |_|\___|\___|_|\_\_|\___/ \__, |_|_| |_|
+	 *     %checklogin%                   |___/
+	 */
 	case "checklogin":
 		if(isset($_POST["user"]) and isset($_POST["pass"]))
 		{
@@ -813,14 +829,14 @@ switch($_GET["action"])
 		}
 		break;
 	
-	/*
-	 *  _                         _
-	 * | | ___   __ _  ___  _   _| |_
-	 * | |/ _ \ / _` |/ _ \| | | | __|
-	 * | | (_) | (_| | (_) | |_| | |_
-	 * |_|\___/ \__, |\___/ \__,_|\__|
-	 *          |___/         %logout%
-	 */
+	/*
+	 *  _                         _
+	 * | | ___   __ _  ___  _   _| |_
+	 * | |/ _ \ / _` |/ _ \| | | | __|
+	 * | | (_) | (_| | (_) | |_| | |_
+	 * |_|\___/ \__, |\___/ \__,_|\__|
+	 *          |___/         %logout%
+	 */
 	case "logout":
 		$isloggedin = false;
 		unset($user);
@@ -831,14 +847,14 @@ switch($_GET["action"])
 	<p>Logout Successful. You can login again <a href='index.php?action=login'>here</a>.</p>"));
 		break;
 	
-	/*
-	 *                    _ _ _
-	 *   ___ _ __ ___  __| (_) |_ ___
-	 *  / __| '__/ _ \/ _` | | __/ __|
-	 * | (__| | |  __/ (_| | | |_\__ \
-	 *  \___|_|  \___|\__,_|_|\__|___/
-	 *                       %credits%
-	 */
+	/*
+	 *                    _ _ _
+	 *   ___ _ __ ___  __| (_) |_ ___
+	 *  / __| '__/ _ \/ _` | | __/ __|
+	 * | (__| | |  __/ (_| | | |_\__ \
+	 *  \___|_|  \___|\__,_|_|\__|___/
+	 *                       %credits%
+	 */
 	case "credits":
 		$title = "Credits - $sitename";
 		$content = "<h1>$sitename credits</h1>
@@ -848,14 +864,14 @@ switch($_GET["action"])
 		exit(renderpage($title, $content));
 		break;
 	
-	/*
-	 *  _               _
-	 * | |__   __ _ ___| |__
-	 * | '_ \ / _` / __| '_ \
-	 * | | | | (_| \__ \ | | |
-	 * |_| |_|\__,_|___/_| |_|
-	 *                  %hash%
-	 */
+	/*
+	 *  _               _
+	 * | |__   __ _ ___| |__
+	 * | '_ \ / _` / __| '_ \
+	 * | | | | (_| \__ \ | | |
+	 * |_| |_|\__,_|___/_| |_|
+	 *                  %hash%
+	 */
 	case "hash":
 		if(!isset($_GET["string"]))
 		{
@@ -869,39 +885,39 @@ switch($_GET["action"])
 		}
 		break;
 	
-	/*
-	 *        _
-	 * __   _(_) _____      __
-	 * \ \ / / |/ _ \ \ /\ / /
-	 *  \ V /| |  __/\ V  V /
-	 *   \_/ |_|\___| \_/\_/
-	 *                  %view%
-	 */
+	/*
+	 *        _
+	 * __   _(_) _____      __
+	 * \ \ / / |/ _ \ \ /\ / /
+	 *  \ V /| |  __/\ V  V /
+	 *   \_/ |_|\___| \_/\_/
+	 *                  %view%
+	 */
 	case "view":
 	default:
 		//check to make sure that the page exists
-		if(!isset($pageindex->$page))
+		if(!isset($pageindex->$page))
 		{
 			if($editing)
 			{
 				//editing is enabled, redirect to the editing page
 				http_response_code(307); //temporary redirect
-				header("location: index.php?action=edit&newpage=yes&page=" . rawurlencode($page));
+				header("location: index.php?action=edit&newpage=yes&page=" . rawurlencode($page));
 				exit();
 			}
 			else
 			{
 				//editing is disabled, show an error message
 				http_response_code(404);
-				exit(renderpage("$page - 404 - $sitename", "<p>$page does not exist.</p><p>Since editing is currently disabled on this wiki, you may not create this page. If you feel that this page should exist, try contacting this wiki's Administrator.</p>"));
+				exit(renderpage("$page - 404 - $sitename", "<p>$page does not exist.</p><p>Since editing is currently disabled on this wiki, you may not create this page. If you feel that this page should exist, try contacting this wiki's Administrator.</p>"));
 			}
 		}
-		$title = "$page - $sitename";
-		$content = "<h1>$page</h1>";
+		$title = "$page - $sitename";
+		$content = "<h1>$page</h1>";
 		
 		$slimdown_start = microtime(true);
 		
-		$content .= Slimdown::render(file_get_contents("$page.md"));
+		$content .= Slimdown::render(file_get_contents("$page.md"));
 		
 		$content .= "\n\t<!-- Took " . (microtime(true) - $slimdown_start) . " seconds to parse markdown -->\n";
 		
