浏览代码

Core update (good design is simple to use)

markseu 11 年之前
父节点
当前提交
a281dfb66a

+ 1 - 1
system/config/textenglish.ini

@@ -10,8 +10,8 @@ webinterfaceLoginEmail		= Email:
 webinterfaceLoginPassword	= Password:
 webinterfaceLoginButton		= Login
 webinterfaceSaveButton		= Save
+webinterfaceCancelButton	= Cancel
 webinterfaceEdit			= Edit
-webinterfaceShow			= Show
 webinterfaceUserLogout		= Logout
 webinterface424Title		= New page
 webinterface424Text			= Write text here

+ 1 - 1
system/config/user.ini

@@ -1,3 +1,3 @@
 // Yellow user accounts
-// Format: Email, password (sha256 with email prefix as salt), name, language
+// Format: Email, password (sha256 with email prefix as salt), name, language, home
 

+ 6 - 1
system/core/core-commandline.php

@@ -5,7 +5,7 @@
 // Command line core plugin
 class YellowCommandline
 {
-	const Version = "0.2.6";
+	const Version = "0.2.7";
 	var $yellow;				//access to API
 	var $content;				//number of content pages
 	var $media;					//number of media files
@@ -353,6 +353,11 @@ class YellowCommandline
 				if($statusCode != 0) break;
 			}
 		}
+		if($statusCode == 0)
+		{
+			$statusCode = 400;
+			echo "Yellow command line: Invalid arguments\n";
+		}
 		return $statusCode;
 	}
 }

+ 10 - 2
system/core/core-webinterface.js

@@ -4,11 +4,12 @@
 // Yellow main API
 var yellow =
 {
-	version: "0.2.4",
+	version: "0.2.5",
 	onClick: function(e) { yellow.webinterface.hidePanesOnClick(yellow.toolbox.getEventElement(e)); },
 	onKeydown: function(e) { yellow.webinterface.hidePanesOnKeydown(yellow.toolbox.getEventKeycode(e)); },
 	onResize: function() { yellow.webinterface.resizePanes(); },
 	onShow: function(id) { yellow.webinterface.showPane(id); },
+	onHide: function(id) { yellow.webinterface.hidePane(id); },
 	onLogout: function() { yellow.toolbox.submitForm({"action":"logout"}); },
 	webinterface:{}, page:{}, toolbox:{}, config:{}, text:{}
 }
@@ -42,6 +43,12 @@ yellow.webinterface =
 				yellow.toolbox.insertAfter(this.createPane("yellow-pane-edit"), body.firstChild);
 				yellow.toolbox.insertAfter(this.createPane("yellow-pane-user"), body.firstChild);
 				yellow.toolbox.setText(document.getElementById("yellow-edit-text"), yellow.page.rawData);
+				if(yellow.page.permissions)
+				{
+					document.getElementById("yellow-edit-cancel").style.display = "none";
+				} else {
+					document.getElementById("yellow-edit-save").style.display = "none";
+				}
 			} else {
 				yellow.toolbox.insertBefore(this.createBar("yellow-bar", true), body.firstChild);
 				yellow.toolbox.insertAfter(this.createPane("yellow-pane-login", true), body.firstChild);
@@ -100,7 +107,8 @@ yellow.webinterface =
 				"<textarea id=\"yellow-edit-text\" name=\"rawdata\"></textarea>"+
 				"<div id=\"yellow-edit-info\" /></div>"+
 				"<div id=\"yellow-edit-buttons\">"+
-				"<input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("SaveButton")+"\" />"+
+				"<input id=\"yellow-edit-save\" class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("SaveButton")+"\" />"+
+				"<input id=\"yellow-edit-cancel\" class=\"yellow-btn\" type=\"button\" onclick=\"yellow.onHide('yellow-pane-edit'); return false;\" value=\""+this.getText("CancelButton")+"\" />"+
 				"</div>"+
 				"</form>";
 		} else if(id == "yellow-pane-user") {

+ 96 - 63
system/core/core-webinterface.php

@@ -5,12 +5,11 @@
 // Web interface core plugin
 class YellowWebinterface
 {
-	const Version = "0.2.7";
+	const Version = "0.2.8";
 	var $yellow;				//access to API
 	var $users;					//web interface users
-	var $activeLocation;		//web interface location? (boolean)
-	var $activeUserFail;		//web interface login failed? (boolean)
-	var $activeUserEmail;		//web interface user currently logged in
+	var $active;				//web interface is active location? (boolean)
+	var $loginFailed;			//web interface login failed? (boolean)
 	var $rawDataOriginal;		//raw data of page in case of errors
 
 	// Initialise plugin
@@ -19,6 +18,7 @@ class YellowWebinterface
 		$this->yellow = $yellow;
 		$this->yellow->config->setDefault("webinterfaceLocation", "/edit/");
 		$this->yellow->config->setDefault("webinterfaceUserFile", "user.ini");
+		$this->yellow->config->setDefault("webinterfaceUserHome", "/");
 		$this->users = new YellowWebinterfaceUsers($yellow);
 		$this->users->load($this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"));
 	}
@@ -27,12 +27,12 @@ class YellowWebinterface
 	function onRequest($location)
 	{
 		$statusCode = 0;
-		if($this->checkWebinterfaceLocation($location))
+		if($this->checkLocation($location))
 		{
 			list($serverName, $serverBase, $location, $fileName) = $this->yellow->getRequestInformation($this->yellow->config->get("webinterfaceLocation"));
 			if($this->checkUser()) $statusCode = $this->processRequestAction($serverName, $serverBase, $location, $fileName);
 			if($statusCode == 0) $statusCode = $this->yellow->processRequest($serverName, $serverBase, $location, $fileName,
-													false, $this->activeUserFail ? 401 : 0);
+													false, $this->loginFailed ? 401 : 0);
 		} else {
 			if($this->yellow->config->get("webinterfaceLocation") == "$location/")
 			{
@@ -47,7 +47,7 @@ class YellowWebinterface
 	// Handle page meta data parsing
 	function onParseMeta($page, $text)
 	{
-		if($this->isWebinterfaceLocation() && $this->isUser())
+		if($this->isActive() && $this->isUser())
 		{
 			if($page == $this->yellow->page)
 			{
@@ -60,16 +60,16 @@ class YellowWebinterface
 	function onParseContent($page, $text)
 	{
 		$output = NULL;
-		if($this->isWebinterfaceLocation() && $this->isUser())
+		if($this->isActive() && $this->isUser())
 		{
 			if($page == $this->yellow->page)
 			{
 				switch($page->statusCode)
 				{
-					case 424:	$language = $this->isUser() ? $this->users->getLanguage($this->activeUserEmail) : $page->get("language");
+					case 424:	$language = $this->isUser() ? $this->users->getLanguage() : $page->get("language");
 								$page->rawData = "---\r\n";
 								$page->rawData .= "Title: ".$this->yellow->text->getText("webinterface424Title", $language)."\r\n";
-								$page->rawData .= "Author: ".$this->users->getName($this->activeUserEmail)."\r\n";
+								$page->rawData .= "Author: ".$this->users->getName()."\r\n";
 								$page->rawData .= "---\r\n";
 								$page->rawData .= $this->yellow->text->getText("webinterface424Text", $language);
 								break;
@@ -92,18 +92,20 @@ class YellowWebinterface
 	function onHeaderExtra()
 	{
 		$header = "";
-		if($this->isWebinterfaceLocation())
+		if($this->isActive())
 		{
 			$location = $this->yellow->config->getHtml("serverBase").$this->yellow->config->getHtml("pluginLocation");
-			$language = $this->isUser() ? $this->users->getLanguage($this->activeUserEmail) : $this->yellow->page->get("language");
+			$language = $this->isUser() ? $this->users->getLanguage() : $this->yellow->page->get("language");
 			$header .= "<link rel=\"styleSheet\" type=\"text/css\" media=\"all\" href=\"{$location}core-webinterface.css\" />\n";
 			$header .= "<script type=\"text/javascript\" src=\"{$location}core-webinterface.js\"></script>\n";
 			$header .= "<script type=\"text/javascript\">\n";
 			$header .= "// <![CDATA[\n";
 			if($this->isUser())
 			{
+				$permissions = $this->checkPermissions($this->yellow->page->location, $this->yellow->page->fileName);
 				$header .= "yellow.page.rawData = ".json_encode($this->yellow->page->rawData).";\n";
-				$header .= "yellow.config = ".json_encode($this->getConfigData($this->activeUserEmail)).";\n";
+				$header .= "yellow.page.permissions = " .json_encode($permissions).";\n";
+				$header .= "yellow.config = ".json_encode($this->getConfigData()).";\n";
 			}
 			$header .= "yellow.text = ".json_encode($this->yellow->text->getData("webinterface", $language)).";\n";
 			if(defined("DEBUG")) $header .= "yellow.debug = ".json_encode(DEBUG).";\n";
@@ -116,7 +118,7 @@ class YellowWebinterface
 	// Handle command help
 	function onCommandHelp()
 	{
-		return "user EMAIL PASSWORD [NAME LANGUAGE]\n";
+		return "user EMAIL PASSWORD [NAME LANGUAGE HOME]\n";
 	}
 	
 	// Handle command
@@ -135,11 +137,11 @@ class YellowWebinterface
 	function userCommand($args)
 	{
 		$statusCode = 0;
-		list($dummy, $command, $email, $password, $name, $language) = $args;
-		if(!empty($email) && !empty($password) )
+		list($dummy, $command, $email, $password, $name, $language, $home) = $args;
+		if(!empty($email) && !empty($password) && (empty($home) || $home[0]=='/'))
 		{
 			$fileName = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile");
-			$statusCode = $this->users->createUser($fileName, $email, $password, $name, $language)  ? 200 : 500;
+			$statusCode = $this->users->createUser($fileName, $email, $password, $name, $language, $home)  ? 200 : 500;
 			if($statusCode != 200) echo "ERROR updating configuration: Can't write file '$fileName'!\n";
 			echo "Yellow $command: User account ".($statusCode!=200 ? "not " : "");
 			echo ($this->users->isExisting($email) ? "updated" : "created")."\n";
@@ -156,7 +158,7 @@ class YellowWebinterface
 		$statusCode = 0;
 		switch($_POST["action"])
 		{
-			case "edit":	if(!empty($_POST["rawdata"]) && $this->checkUserPermissions($location, $fileName))
+			case "edit":	if(!empty($_POST["rawdata"]) && $this->checkPermissions($location, $fileName))
 							{
 								$this->rawDataOriginal = $_POST["rawdata"];
 								if($this->yellow->toolbox->createFile($fileName, $_POST["rawdata"]))
@@ -171,12 +173,20 @@ class YellowWebinterface
 								}
 							}
 							break;
-			case "login":	$statusCode = 303;
-							$locationHeader = $this->yellow->toolbox->getHttpLocationHeader($serverName, $serverBase, $location);
-							$this->yellow->sendStatus($statusCode, $locationHeader);
+			case "login":	$home = $this->users->getHome();
+							if(substru($location, 0, strlenu($home)) == $home)
+							{
+								$statusCode = 303;
+								$locationHeader = $this->yellow->toolbox->getHttpLocationHeader($serverName, $serverBase, $location);
+								$this->yellow->sendStatus($statusCode, $locationHeader);
+							} else {
+								$statusCode = 302;
+								$locationHeader = $this->yellow->toolbox->getHttpLocationHeader($serverName, $serverBase, $home);
+								$this->yellow->sendStatus($statusCode, $locationHeader);
+							}
 							break;
 			case "logout":	$this->users->destroyCookie("login");
-							$this->activeUserEmail = "";
+							$this->users->email = "";
 							$statusCode = 302;
 							$locationHeader = $this->yellow->toolbox->getHttpLocationHeader($serverName, $this->yellow->config->get("serverBase"), $location);
 							$this->yellow->sendStatus($statusCode, $locationHeader);
@@ -189,7 +199,7 @@ class YellowWebinterface
 									$locationHeader = $this->yellow->toolbox->getHttpLocationHeader($serverName, $serverBase, "$location/");
 									$this->yellow->sendStatus($statusCode, $locationHeader);
 								} else {
-									$statusCode = $this->checkUserPermissions($location, $fileName) ? 424 : 404;
+									$statusCode = $this->checkPermissions($location, $fileName) ? 424 : 404;
 									$this->yellow->processRequest($serverName, $serverBase, $location, $fileName, false, $statusCode);
 								}
 							}
@@ -198,14 +208,14 @@ class YellowWebinterface
 	}
 	
 	// Check web interface location
-	function checkWebinterfaceLocation($location)
+	function checkLocation($location)
 	{
 		$locationLength = strlenu($this->yellow->config->get("webinterfaceLocation"));
-		$this->activeLocation = substru($location, 0, $locationLength) == $this->yellow->config->get("webinterfaceLocation");
-		return $this->isWebinterfaceLocation();
+		$this->active = substru($location, 0, $locationLength) == $this->yellow->config->get("webinterfaceLocation");
+		return $this->isActive();
 	}
 	
-	// Check user login
+	// Check web interface user
 	function checkUser()
 	{
 		if($_POST["action"] == "login")
@@ -215,47 +225,57 @@ class YellowWebinterface
 			if($this->users->checkUser($email, $password))
 			{
 				$this->users->createCookie("login", $email);
-				$this->activeUserEmail = $email;
+				$this->users->email = $email;
 			} else {
-				$this->activeUserFail = true;
+				$this->loginFailed = true;
 			}
 		} else if(isset($_COOKIE["login"])) {
 			$cookie = $_COOKIE["login"];
 			if($this->users->checkCookie($cookie))
 			{
-				$this->activeUserEmail = $this->users->getCookieEmail($cookie);
+				$this->users->email = $this->users->getCookieEmail($cookie);
 			} else {
-				$this->activeUserFail = true;
+				$this->loginFailed = true;
 			}
 		}
 		return $this->isUser();
 	}
-	
-	// Check users permissions for creating new page
-	function checkUserPermissions($location, $fileName)
+
+	// Check permissions for changing page
+	function checkPermissions($location, $fileName)
 	{
-		$path = dirname($fileName);
-		return is_dir($path) && strlenu(basename($fileName))<128;
+		$permissions = true;
+		foreach($this->yellow->plugins->plugins as $key=>$value)
+		{
+			if(method_exists($value["obj"], "onCheckPermissions"))
+			{
+				$permissions = $value["obj"]->onCheckPermissions($location, $fileName, $this->users);
+				if(!$permissions) break;
+			}
+		}
+		$permissions &= is_dir(dirname($fileName)) && strlenu(basename($fileName))<128;
+		return $permissions;
 	}
 	
 	// Check if web interface location
-	function isWebinterfaceLocation()
+	function isActive()
 	{
-		return $this->activeLocation;
+		return $this->active;
 	}
 	
 	// Check if user is logged in
 	function isUser()
 	{
-		return !empty($this->activeUserEmail);
+		return !empty($this->users->email);
 	}
 	
-	// Return configuration data including user information
-	function getConfigData($email)
+	// Return configuration data including information of current user
+	function getConfigData()
 	{
-		$data = array("userEmail" => $email,
-					  "userName" => $this->users->getName($email),
-					  "userLanguage" => $this->users->getLanguage($email),
+		$data = array("userEmail" => $this->users->email,
+					  "userName" => $this->users->getName(),
+					  "userLanguage" => $this->users->getLanguage(),
+					  "userHome" => $this->users->getHome(),
 					  "serverName" => $this->yellow->config->get("serverName"),
 					  "serverBase" => $this->yellow->config->get("serverBase"));
 		return array_merge($data, $this->yellow->config->getData("Location"));
@@ -267,6 +287,7 @@ class YellowWebinterfaceUsers
 {
 	var $yellow;	//access to API
 	var $users;		//registered users
+	var $email;		//current user
 	
 	function __construct($yellow)
 	{
@@ -283,18 +304,30 @@ class YellowWebinterfaceUsers
 			foreach($fileData as $line)
 			{
 				if(preg_match("/^\//", $line)) continue;
-				preg_match("/^(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
+				preg_match("/^(.*?),\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
 				if(!empty($matches[1]) && !empty($matches[2]) && !empty($matches[3]) && !empty($matches[4]))
 				{
-					$this->setUser($matches[1], $matches[2], $matches[3], $matches[4]);
+					$this->set($matches[1], $matches[2], $matches[3], $matches[4], $matches[5]);
 					if(defined("DEBUG") && DEBUG>=3) echo "YellowWebinterfaceUsers::load email:$matches[1] $matches[3]<br/>\n";
 				}
 			}
 		}
 	}
 	
+	// Set user data
+	function set($email, $password, $name, $language, $home)
+	{
+		$this->users[$email] = array();
+		$this->users[$email]["email"] = $email;
+		$this->users[$email]["password"] = $password;
+		$this->users[$email]["name"] = $name;
+		$this->users[$email]["language"] = $language;
+		$this->users[$email]["home"] = $home;
+		$this->users[$email]["session"] = hash("sha256", $email.$password.$password.$email);
+	}
+	
 	// Create or update user in file
-	function createUser($fileName, $email, $password, $name, $language)
+	function createUser($fileName, $email, $password, $name, $language, $home)
 	{
 		$email = strreplaceu(',', '-', $email);
 		$password = hash("sha256", $email.$password);
@@ -304,14 +337,15 @@ class YellowWebinterfaceUsers
 		{
 			foreach($fileData as $line)
 			{
-				preg_match("/^(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
+				preg_match("/^(.*?),\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
 				if(!empty($matches[1]) && !empty($matches[2]) && !empty($matches[3]) && !empty($matches[4]))
 				{
 					if($matches[1] == $email)
 					{
 						$name = strreplaceu(',', '-', empty($name) ? $matches[3] : $name);
 						$language = strreplaceu(',', '-', empty($language) ? $matches[4] : $language);
-						$fileDataNew .= "$email,$password,$name,$language\n";
+						$home = strreplaceu(',', '-', empty($home) ? $matches[5] : $home);
+						$fileDataNew .= "$email,$password,$name,$language,$home\n";
 						$fileNewUser = false;
 						continue;
 					}
@@ -323,22 +357,12 @@ class YellowWebinterfaceUsers
 		{
 			$name = strreplaceu(',', '-', empty($name) ? $this->yellow->config->get("sitename") : $name);
 			$language = strreplaceu(',', '-', empty($language) ? $this->yellow->config->get("language") : $language);
-			$fileDataNew .= "$email,$password,$name,$language\n";
+			$home = strreplaceu(',', '-', empty($home) ? $this->yellow->config->get("webinterfaceUserHome") : $home);
+			$fileDataNew .= "$email,$password,$name,$language,$home\n";
 		}
 		return $this->yellow->toolbox->createFile($fileName, $fileDataNew);
 	}
 
-	// Set user data
-	function setUser($email, $password, $name, $language)
-	{
-		$this->users[$email] = array();
-		$this->users[$email]["email"] = $email;
-		$this->users[$email]["password"] = $password;
-		$this->users[$email]["name"] = $name;
-		$this->users[$email]["language"] = $language;
-		$this->users[$email]["session"] = hash("sha256", $email.$password.$password.$email);
-	}
-	
 	// Check user login
 	function checkUser($email, $password)
 	{
@@ -377,16 +401,25 @@ class YellowWebinterfaceUsers
 	}
 	
 	// Return user name
-	function getName($email)
+	function getName($email = "")
 	{
+		if(empty($email)) $email = $this->email;
 		return $this->isExisting($email) ? $this->users[$email]["name"] : "";
 	}
 
 	// Return user language
-	function getLanguage($email)
+	function getLanguage($email = "")
 	{
+		if(empty($email)) $email = $this->email;
 		return $this->isExisting($email) ? $this->users[$email]["language"] : "";
 	}	
+
+	// Return user home
+	function getHome($email = "")
+	{
+		if(empty($email)) $email = $this->email;
+		return $this->isExisting($email) ? $this->users[$email]["home"] : "";
+	}
 	
 	// Check if user exists
 	function isExisting($email)

+ 2 - 2
system/core/core.php

@@ -5,7 +5,7 @@
 // Yellow main class
 class Yellow
 {
-	const Version = "0.2.16";
+	const Version = "0.2.17";
 	var $page;				//current page
 	var $pages;				//pages from file system
 	var $config;			//configuration
@@ -854,7 +854,7 @@ class YellowPages
 		return new YellowPageCollection($this->yellow);
 	}
 	
-	// Return pages from file system
+	// Return page collection with all pages from file system
 	function index($showInvisible = false, $levelMax = 0)
 	{
 		return $this->findChildrenRecursive("", $showInvisible, $levelMax);