mikuli.cz

:)
git clone https://git.sr.ht/~ashymad/mikuli.cz
Log | Files | Refs

commit a281dfb66aeca30d32f4b28b5bf5bad97c204e8b
parent 54ab20e32654aabed54ce93592b7f3cfff7d6d2d
Author: markseu <mark2011@mayberg.se>
Date:   Mon,  7 Apr 2014 17:14:31 +0200

Core update (good design is simple to use)

Diffstat:
Msystem/config/textenglish.ini | 2+-
Msystem/config/user.ini | 2+-
Msystem/core/core-commandline.php | 7++++++-
Msystem/core/core-webinterface.js | 12++++++++++--
Msystem/core/core-webinterface.php | 159++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Msystem/core/core.php | 4++--
6 files changed, 116 insertions(+), 70 deletions(-)

diff --git a/system/config/textenglish.ini b/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 diff --git a/system/config/user.ini b/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 diff --git a/system/core/core-commandline.php b/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; } } diff --git a/system/core/core-webinterface.js b/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") { diff --git a/system/core/core-webinterface.php b/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) diff --git a/system/core/core.php b/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);