mikuli.cz

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

commit d611025b69453ef75daa1fc9b0abc21cee96cef8
parent 2e771bd19aa4ec59e7c531af8e6af5ddf9f2332f
Author: markseu <mark2011@mayberg.se>
Date:   Thu,  2 Jun 2016 17:31:42 +0200

System update (refactoring)

Diffstat:
Msystem/plugins/webinterface.css | 5+++--
Msystem/plugins/webinterface.js | 233++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msystem/plugins/webinterface.php | 321++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
3 files changed, 299 insertions(+), 260 deletions(-)

diff --git a/system/plugins/webinterface.css b/system/plugins/webinterface.css @@ -1,4 +1,4 @@ -/* Yellow web interface 0.6.7 */ +/* Yellow web interface 0.6.8 */ .yellow-bar { position:relative; overflow:hidden; height:2em; margin-bottom:10px; } .yellow-bar-left { display:block; float:left; } @@ -117,8 +117,9 @@ #yellow-pane-settings h1 { margin:0 1em; font-size:2em; } #yellow-pane-settings .yellow-form-control { width:15em; box-sizing:border-box; } #yellow-pane-settings .yellow-btn { width:15em; margin:1em 1em 0.5em 0; } +#yellow-pane-settings-status { margin:0.5em 0; display:inline-block; } #yellow-pane-settings-fields { width:15em; text-align:left; margin:0 auto; } -#yellow-pane-settings-buttons p { margin-top:0; margin-bottom:0; } +#yellow-pane-settings-buttons { margin-top:-0.5em; } #yellow-pane-edit { } #yellow-pane-edit h1 { margin:0 0 10px 0; font-size:1.5em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } diff --git a/system/plugins/webinterface.js b/system/plugins/webinterface.js @@ -4,45 +4,58 @@ // Yellow API var yellow = { - version: "0.6.7", - action: function(text) { yellow.webinterface.action(text); }, + version: "0.6.8", + action: function(action) { yellow.webinterface.action(action, "none"); }, + onLoad: function() { yellow.webinterface.loadInterface(); }, onClick: function(e) { yellow.webinterface.hidePanesOnClick(yellow.toolbox.getEventElement(e)); }, onKeydown: function(e) { yellow.webinterface.hidePanesOnKeydown(yellow.toolbox.getEventKeycode(e)); }, - onResize: function() { yellow.webinterface.resizePane(yellow.webinterface.paneId); }, - onUpdate: function() { yellow.webinterface.updatePane(yellow.webinterface.paneId, yellow.webinterface.paneType); }, - onIntervall: function() { yellow.webinterface.updateIntervall(); } + onUpdate: function() { yellow.webinterface.updatePane(yellow.webinterface.paneId, yellow.webinterface.paneAction, yellow.webinterface.paneStatus); }, + onResize: function() { yellow.webinterface.resizePane(yellow.webinterface.paneId, yellow.webinterface.paneAction, yellow.webinterface.paneStatus); } } // Yellow web interface yellow.webinterface = { paneId: 0, //visible pane ID - paneType: 0, //visible pane type + paneAction: 0, //current pane action + paneStatus: 0, //current pane status intervalId: 0, //timer interval ID // Handle action - action: function(text) + action: function(action, status) { - if(yellow.config.debug) console.log("yellow.webinterface.action action:"+text); - switch(text) + if(yellow.config.debug) console.log("yellow.webinterface.action action:"+action+" status:"+status); + switch(action) { - case "login": this.showPane("yellow-pane-login"); break; - case "logout": this.sendPane("yellow-pane-logout", "logout"); break; - case "signup": this.showPane("yellow-pane-signup", "signup"); break; - case "confirm": this.showPane("yellow-pane-signup", "confirm"); break; - case "approve": this.showPane("yellow-pane-signup", "approve"); break; - case "recover": this.showPane("yellow-pane-recover", "recover"); break; - case "settings": this.showPane("yellow-pane-settings", "settings"); break; - case "create": this.showPane("yellow-pane-edit", "create", true); break; - case "edit": this.showPane("yellow-pane-edit", "edit", true); break; - case "delete": this.showPane("yellow-pane-edit", "delete", true); break; - case "user": this.showPane("yellow-pane-user"); break; - case "send": this.sendPane(this.paneId, this.paneType); break; + case "login": this.showPane("yellow-pane-login", action, status); break; + case "logout": this.sendPane("yellow-pane-logout", action); break; + case "signup": this.showPane("yellow-pane-signup", action, status); break; + case "confirm": this.showPane("yellow-pane-signup", action, status); break; + case "approve": this.showPane("yellow-pane-signup", action, status); break; + case "recover": this.showPane("yellow-pane-recover", action, status); break; + case "settings": this.showPane("yellow-pane-settings", action, status); break; + case "create": this.showPane("yellow-pane-edit", action, status, true); break; + case "edit": this.showPane("yellow-pane-edit", action, status, true); break; + case "delete": this.showPane("yellow-pane-edit", action, status, true); break; + case "user": this.showPane("yellow-pane-user", action, status); break; + case "send": this.sendPane(this.paneId, this.paneAction); break; case "close": this.hidePane(this.paneId); break; case "help": this.hidePane(this.paneId); location.href = this.getText("UserHelpUrl", "yellow"); break; } }, + // Initialise interface + loadInterface: function() + { + var body = document.getElementsByTagName("body")[0]; + if(body && body.firstChild && !document.getElementById("yellow-bar")) + { + this.createBar("yellow-bar"); + this.action(yellow.page.action, yellow.page.status); + clearInterval(this.intervalId); + } + }, + // Create bar createBar: function(barId) { @@ -73,7 +86,7 @@ yellow.webinterface = }, // Create pane - createPane: function(paneId, paneType) + createPane: function(paneId, paneAction, paneStatus) { if(yellow.config.debug) console.log("yellow.webinterface.createPane id:"+paneId); var elementPane = document.createElement("div"); @@ -118,11 +131,11 @@ yellow.webinterface = "<form method=\"post\">"+ "<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+ "<h1>"+this.getText("SignupTitle")+"</h1>"+ - "<div id=\"yellow-pane-signup-status\" class=\""+yellow.page.status+"\">"+this.getText("SignupStatus", "", yellow.page.status)+"</div>"+ + "<div id=\"yellow-pane-signup-status\" class=\""+paneStatus+"\">"+this.getText(paneAction+"Status", "", paneStatus)+"</div>"+ "<div id=\"yellow-pane-signup-fields\">"+ "<input type=\"hidden\" name=\"action\" value=\"signup\" />"+ - "<p><label for=\"yellow-pane-signup-name\">"+this.getText("SignupName")+"</label><br /><input class=\"yellow-form-control\" name=\"name\" id=\"yellow-pane-signup-name\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("Name"))+"\" /></p>"+ - "<p><label for=\"yellow-pane-signup-email\">"+this.getText("SignupEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"yellow-pane-signup-email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("Email"))+"\" /></p>"+ + "<p><label for=\"yellow-pane-signup-name\">"+this.getText("SignupName")+"</label><br /><input class=\"yellow-form-control\" name=\"name\" id=\"yellow-pane-signup-name\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("name"))+"\" /></p>"+ + "<p><label for=\"yellow-pane-signup-email\">"+this.getText("SignupEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"yellow-pane-signup-email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("email"))+"\" /></p>"+ "<p><label for=\"yellow-pane-signup-password\">"+this.getText("SignupPassword")+"</label><br /><input class=\"yellow-form-control\" type=\"password\" name=\"password\" id=\"yellow-pane-signup-password\" maxlength=\"64\" value=\"\" /></p>"+ "<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("SignupButton")+"\" /></p>"+ "</div>"+ @@ -136,11 +149,11 @@ yellow.webinterface = "<form method=\"post\">"+ "<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+ "<h1>"+this.getText("RecoverTitle")+"</h1>"+ - "<div id=\"yellow-pane-recover-status\" class=\""+yellow.page.status+"\">"+this.getText("RecoverStatus", "", yellow.page.status)+"</div>"+ + "<div id=\"yellow-pane-recover-status\" class=\""+paneStatus+"\">"+this.getText("RecoverStatus", "", paneStatus)+"</div>"+ "<div id=\"yellow-pane-recover-fields-first\">"+ "<input type=\"hidden\" name=\"action\" value=\"recover\" />"+ - "<p><label for=\"yellow-pane-recover-email\">"+this.getText("RecoverEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"yellow-pane-recover-email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("Email"))+"\" /></p>"+ - "<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("RecoverButton")+"\" /></p>"+ + "<p><label for=\"yellow-pane-recover-email\">"+this.getText("RecoverEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"yellow-pane-recover-email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("email"))+"\" /></p>"+ + "<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("OkButton")+"\" /></p>"+ "</div>"+ "<div id=\"yellow-pane-recover-fields-second\">"+ "<p><label for=\"yellow-pane-recover-password\">"+this.getText("RecoverPassword")+"</label><br /><input class=\"yellow-form-control\" type=\"password\" name=\"password\" id=\"yellow-pane-recover-password\" maxlength=\"64\" value=\"\" /></p>"+ @@ -156,14 +169,16 @@ yellow.webinterface = "<form method=\"post\">"+ "<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+ "<h1 id=\"yellow-pane-settings-title\">"+this.getText("SettingsTitle")+"</h1>"+ + "<div id=\"yellow-pane-settings-status\" class=\""+paneStatus+"\">"+this.getText(paneAction+"Status", "", paneStatus)+"</div>"+ "<div id=\"yellow-pane-settings-fields\">"+ "<input type=\"hidden\" name=\"action\" value=\"settings\" />"+ - "<p><label for=\"yellow-pane-settings-name\">"+this.getText("SignupName")+"</label><br /><input class=\"yellow-form-control\" name=\"name\" id=\"yellow-pane-settings-name\" maxlength=\"64\" value=\"\" /></p>"+ - "<div id=\"yellow-pane-settings-buttons\">"+ - "<p><a href=\"#\" onclick=\"yellow.action('recover'); return false;\">"+this.getText("SettingsChangePassword")+"</a><p>"+ - "</div>"+this.getPaneLanguages(paneId)+ + "<p><label for=\"yellow-pane-settings-name\">"+this.getText("SignupName")+"</label><br /><input class=\"yellow-form-control\" name=\"name\" id=\"yellow-pane-settings-name\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("name"))+"\" /></p>"+ + this.getLanguages(paneId)+ "<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("OkButton")+"\" /></p>"+ "</div>"+ + "<div id=\"yellow-pane-settings-buttons\">"+ + "<p><input class=\"yellow-btn\" type=\"button\" onclick=\"yellow.action('close'); return false;\" value=\""+this.getText("OkButton")+"\" /></p>"+ + "</div>"+ "</form>"; break; case "yellow-pane-edit": @@ -192,8 +207,9 @@ yellow.webinterface = }, // Update pane - updatePane: function(paneId, paneType, init) + updatePane: function(paneId, paneAction, paneStatus, init) { + if(yellow.config.debug) console.log("yellow.webinterface.updatePane id:"+paneId); switch(paneId) { case "yellow-pane-login": @@ -203,49 +219,48 @@ yellow.webinterface = } break; case "yellow-pane-signup": - if(yellow.page.status=="next" || yellow.page.status=="done" || yellow.page.status=="expire") + if(paneStatus=="next" || paneStatus=="done" || paneStatus=="expire") { document.getElementById("yellow-pane-signup-fields").style.display = "none"; } else { document.getElementById("yellow-pane-signup-buttons").style.display = "none"; } - switch(paneType) - { - case "signup": text = this.getText("SignupStatus", "", yellow.page.status); break; - case "confirm": text = this.getText("ConfirmStatus", "", yellow.page.status); break; - case "approve": text = this.getText("ApproveStatus", "", yellow.page.status); break; - } - document.getElementById("yellow-pane-signup-status").innerHTML = yellow.toolbox.encodeHtml(text); break; case "yellow-pane-recover": - if(yellow.page.status=="next" || yellow.page.status=="done" || yellow.page.status=="expire") + if(paneStatus=="next" || paneStatus=="done" || paneStatus=="expire") { document.getElementById("yellow-pane-recover-fields-first").style.display = "none"; document.getElementById("yellow-pane-recover-fields-second").style.display = "none"; } else { document.getElementById("yellow-pane-recover-buttons").style.display = "none"; - if(this.getRequest("Id")) + if(this.getRequest("id")) { document.getElementById("yellow-pane-recover-fields-first").style.display = "none"; } else { document.getElementById("yellow-pane-recover-fields-second").style.display = "none"; } } - if(yellow.config.userEmail) - { - document.getElementById("yellow-pane-recover-email").value = yellow.config.userEmail; - } break; case "yellow-pane-settings": - document.getElementById("yellow-pane-settings-name").value = yellow.config.userName; - document.getElementById("yellow-pane-settings-"+yellow.config.userLanguage).checked = true; + if(paneStatus=="next" || paneStatus=="done" || paneStatus=="expire") + { + document.getElementById("yellow-pane-settings-fields").style.display = "none"; + } else { + document.getElementById("yellow-pane-settings-buttons").style.display = "none"; + } + if(paneStatus=="none") + { + document.getElementById("yellow-pane-settings-status").innerHTML = yellow.toolbox.encodeHtml(yellow.config.serverVersion); + document.getElementById("yellow-pane-settings-name").value = yellow.config.userName; + document.getElementById("yellow-pane-settings-"+yellow.config.userLanguage).checked = true; + } break; case "yellow-pane-edit": if(init) { var title = yellow.page.title; var string = yellow.page.rawDataEdit; - switch(paneType) + switch(paneAction) { case "create": title = this.getText("CreateTitle"); string = yellow.page.rawDataNew; break; case "delete": title = this.getText("DeleteTitle"); break; @@ -254,11 +269,11 @@ yellow.webinterface = document.getElementById("yellow-pane-edit-page").value = string; yellow.toolbox.setCursorPosition(document.getElementById("yellow-pane-edit-page"), 0); } - var action = this.getPaneAction(paneId, paneType) - if(action) + paneAction = this.getPaneAction(paneId, paneAction) + if(paneAction) { var key, className; - switch(action) + switch(paneAction) { case "create": key = "CreateButton"; className = "yellow-btn yellow-btn-create"; break; case "edit": key = "EditButton"; className = "yellow-btn yellow-btn-edit"; break; @@ -273,22 +288,9 @@ yellow.webinterface = } }, - // Update timer intervall - updateIntervall: function() - { - var body = document.getElementsByTagName("body")[0]; - if(body && body.firstChild && !document.getElementById("yellow-bar")) - { - this.createBar("yellow-bar"); - this.action(yellow.page.action); - clearInterval(this.intervalId); - } - }, - // Resize pane - resizePane: function(paneId) + resizePane: function(paneId, paneAction, paneStatus) { - if(yellow.config.debug) console.log("yellow.webinterface.resizePane id:"+paneId); var elementBar = document.getElementById("yellow-bar"); var paneTop = yellow.toolbox.getOuterTop(elementBar) + yellow.toolbox.getOuterHeight(elementBar); var paneWidth = yellow.toolbox.getOuterWidth(elementBar, true); @@ -311,7 +313,7 @@ yellow.webinterface = var height2 = yellow.toolbox.getOuterHeight(document.getElementById("yellow-pane-edit-content")); var height3 = yellow.toolbox.getOuterHeight(document.getElementById("yellow-pane-edit-page")); yellow.toolbox.setOuterHeight(document.getElementById("yellow-pane-edit-page"), height1 - height2 + height3); - var elementLink = document.getElementById("yellow-pane-"+this.paneType+"-link"); + var elementLink = document.getElementById("yellow-pane-"+paneAction+"-link"); var position = yellow.toolbox.getOuterLeft(elementLink) + yellow.toolbox.getOuterWidth(elementLink)/2; position -= yellow.toolbox.getOuterLeft(document.getElementById("yellow-pane-edit")) + 1; yellow.toolbox.setOuterLeft(document.getElementById("yellow-pane-edit-arrow"), position); @@ -328,36 +330,14 @@ yellow.webinterface = } }, - // Send pane - sendPane: function(paneId, paneType) - { - if(yellow.config.debug) console.log("yellow.webinterface.sendPane id:"+paneId); - if(paneId=="yellow-pane-edit") - { - var action = this.getPaneAction(paneId, paneType); - if(action) - { - var params = {}; - params.action = action; - params.rawdatasource = yellow.page.rawDataSource; - params.rawdataedit = document.getElementById("yellow-pane-edit-page").value; - yellow.toolbox.submitForm(params, true); - } else { - this.hidePane(paneId); - } - } else { - yellow.toolbox.submitForm({"action":paneType}); - } - }, - // Show or hide pane - showPane: function(paneId, paneType, modal) + showPane: function(paneId, paneAction, paneStatus, modal) { - if(this.paneId!=paneId || this.paneType!=paneType) + if(this.paneId!=paneId || this.paneAction!=paneAction) { this.hidePane(this.paneId); var element = document.getElementById(paneId); - if(!element) element = this.createPane(paneId, paneType); + if(!element) element = this.createPane(paneId, paneAction, paneStatus); if(!yellow.toolbox.isVisible(element)) { if(yellow.config.debug) console.log("yellow.webinterface.showPane id:"+paneId); @@ -368,9 +348,10 @@ yellow.webinterface = yellow.toolbox.addValue("meta[name=viewport]", "content", ", maximum-scale=1, user-scalable=0"); } this.paneId = paneId; - this.paneType = paneType; - this.resizePane(paneId); - this.updatePane(paneId, paneType, true); + this.paneAction = paneAction; + this.paneStatus = paneStatus; + this.resizePane(paneId, paneAction, paneStatus); + this.updatePane(paneId, paneAction, paneStatus, true); } } else { this.hidePane(this.paneId); @@ -388,7 +369,8 @@ yellow.webinterface = yellow.toolbox.removeValue("meta[name=viewport]", "content", ", maximum-scale=1, user-scalable=0"); element.style.display = "none"; this.paneId = 0; - this.paneType = 0; + this.paneAction = 0; + this.paneStatus = 0; } }, @@ -423,29 +405,49 @@ yellow.webinterface = if(keycode==27) this.hidePanes(); }, + // Send pane + sendPane: function(paneId, paneAction) + { + if(yellow.config.debug) console.log("yellow.webinterface.sendPane id:"+paneId); + if(paneId=="yellow-pane-edit") + { + paneAction = this.getPaneAction(paneId, paneAction); + if(paneAction) + { + var params = {}; + params.action = paneAction; + params.rawdatasource = yellow.page.rawDataSource; + params.rawdataedit = document.getElementById("yellow-pane-edit-page").value; + yellow.toolbox.submitForm(params, true); + } else { + this.hidePane(paneId); + } + } else { + yellow.toolbox.submitForm({"action":paneAction}); + } + }, + // Return pane action - getPaneAction: function(paneId, paneType) + getPaneAction: function(paneId, paneAction) { - var action = ""; if(paneId=="yellow-pane-edit") { - if(!yellow.config.userRestrictions) + var string = document.getElementById("yellow-pane-edit-page").value; + var paneActionOld = paneAction; + switch(paneAction) { - var string = document.getElementById("yellow-pane-edit-page").value; - switch(paneType) - { - case "create": action = "create"; break; - case "edit": action = string ? "edit" : "delete"; break; - case "delete": action = "delete"; break; - } - if(yellow.page.statusCode==424 && paneType!="delete") action = "create"; + case "create": paneAction = "create"; break; + case "edit": paneAction = string ? "edit" : "delete"; break; + case "delete": paneAction = "delete"; break; } + if(yellow.page.statusCode==424 && paneActionOld!="delete") paneAction = "create"; + if(yellow.config.userRestrictions) paneAction = ""; } - return action; + return paneAction; }, - // Return pane languages - getPaneLanguages: function(paneId) + // Return language selection + getLanguages: function(paneId) { var languages = ""; if(yellow.toolbox.getLength(yellow.config.serverLanguages)>1) @@ -453,7 +455,8 @@ yellow.webinterface = languages += "<p>"; for(var language in yellow.config.serverLanguages) { - languages += "<label for=\""+paneId+"-"+language+"\"><input type=\"radio\" name=\"language\" id=\""+paneId+"-"+language+"\" value=\""+language+"\"> "+yellow.config.serverLanguages[language]+"</label><br />"; + var checked = language==this.getRequest("language") ? " checked=\"checked\"" : ""; + languages += "<label for=\""+paneId+"-"+language+"\"><input type=\"radio\" name=\"language\" id=\""+paneId+"-"+language+"\" value=\""+language+"\""+checked+"> "+yellow.config.serverLanguages[language]+"</label><br />"; } languages += "</p>"; } @@ -464,7 +467,7 @@ yellow.webinterface = getRequest: function(key, prefix) { if(!prefix) prefix = "request"; - key = prefix + key; + key = prefix + key.charAt(0).toUpperCase() + key.slice(1); return (key in yellow.page) ? yellow.page[key] : ""; }, @@ -473,7 +476,7 @@ yellow.webinterface = { if(!prefix) prefix = "webinterface"; if(!postfix) postfix = "" - key = prefix + key + postfix.charAt(0).toUpperCase() + postfix.slice(1); + key = prefix + key.charAt(0).toUpperCase() + key.slice(1) + postfix.charAt(0).toUpperCase() + postfix.slice(1); return (key in yellow.text) ? yellow.text[key] : "["+key+"]"; } } @@ -767,4 +770,4 @@ yellow.toolbox = } } -yellow.webinterface.intervalId = setInterval("yellow.onIntervall()", 1); +yellow.webinterface.intervalId = setInterval("yellow.onLoad()", 1); diff --git a/system/plugins/webinterface.php b/system/plugins/webinterface.php @@ -5,7 +5,7 @@ // Web interface plugin class YellowWebinterface { - const Version = "0.6.7"; + const Version = "0.6.8"; var $yellow; //access to API var $active; //web interface is active? (boolean) var $userEmail; //web interface user @@ -13,6 +13,7 @@ class YellowWebinterface var $userRestrictions; //web interface user can change page? (boolean) var $action; //web interface action var $status; //web interface status + var $installation; //web interface installation var $users; //web interface users var $merge; //web interface merge var $rawDataSource; //raw data of page for comparison @@ -22,6 +23,7 @@ class YellowWebinterface function onLoad($yellow) { $this->yellow = $yellow; + $this->installation = new YellowInstallation($yellow); $this->users = new YellowUsers($yellow); $this->merge = new YellowMerge($yellow); $this->yellow->config->setDefault("webinterfaceServerScheme", $this->yellow->config->get("serverScheme")); @@ -42,9 +44,10 @@ class YellowWebinterface function onRequest($serverScheme, $serverName, $base, $location, $fileName) { $statusCode = 0; - if($this->checkRequest($location, $fileName)) + if($this->yellow->config->get("installationMode")) { - list($serverScheme, $serverName, $base, $location, $fileName) = $this->updateRequestInformation(); + $statusCode = $this->installation->processRequest($serverScheme, $serverName, $base, $location, $fileName); + } else if($this->checkRequest($location)) { $statusCode = $this->processRequest($serverScheme, $serverName, $base, $location, $fileName); } return $statusCode; @@ -107,6 +110,7 @@ class YellowWebinterface list($name, $command) = $args; switch($command) { + case "clean": $statusCode = $this->cleanCommand($args); break; case "user": $statusCode = $this->userCommand($args); break; default: $statusCode = 0; } @@ -118,6 +122,15 @@ class YellowWebinterface { return "user [EMAIL PASSWORD NAME LANGUAGE STATUS HOME]\n"; } + + // Clean user accounts + function cleanCommand($args) + { + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $statusCode = $this->users->clean($fileNameUser) ? 200 : 500; + if($statusCode == 500) echo "ERROR cleaning configuration: Can't write file '$fileNameUser'!\n"; + return status; + } // Update user account function userCommand($args) @@ -160,7 +173,8 @@ class YellowWebinterface function processRequest($serverScheme, $serverName, $base, $location, $fileName) { $statusCode = 0; - if($this->isActive() && $this->checkUser($location, $fileName)) + list($serverScheme, $serverName, $base, $location, $fileName) = $this->updateRequestInformation(); + if($this->checkUser($location, $fileName)) { switch($_REQUEST["action"]) { @@ -183,7 +197,6 @@ class YellowWebinterface case "confirm": $statusCode = $this->processRequestConfirm($serverScheme, $serverName, $base, $location, $fileName); break; case "approve": $statusCode = $this->processRequestApprove($serverScheme, $serverName, $base, $location, $fileName); break; case "recover": $statusCode = $this->processRequestRecover($serverScheme, $serverName, $base, $location, $fileName); break; - case "install": $statusCode = $this->processRequestInstall($serverScheme, $serverName, $base, $location, $fileName); break; } } if($statusCode == 0) @@ -367,22 +380,23 @@ class YellowWebinterface // Process request to change settings function processRequestSettings($serverScheme, $serverName, $base, $location, $fileName) { - $statusCode = 0; - if($this->getUserAccount($this->userEmail, "", "settings") == "ok") + $this->action = "settings"; + $this->status = $this->getUserAccount($this->userEmail, "", $this->action); + if($this->status == "ok") { $name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"])); $language = trim($_REQUEST["language"]); $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); - if($this->users->update($fileNameUser, $this->userEmail, "", $name, $language)) - { - $statusCode = 303; - $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location); - $this->yellow->sendStatus($statusCode, $location); - } else { - $statusCode = 500; - $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false); - $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); - } + $this->status = $this->users->update($fileNameUser, $this->userEmail, "", $name, $language) ? "done" : "error"; + if($this->status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } + if($this->status == "done") + { + $statusCode = 303; + $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location); + $this->yellow->sendStatus($statusCode, $location); + } else { + $statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false); } return $statusCode; } @@ -470,63 +484,6 @@ class YellowWebinterface return $statusCode; } - // Process request to install - function processRequestInstall($serverScheme, $serverName, $base, $location, $fileName) - { - $statusCode = 0; - if($this->yellow->config->get("installationMode")) - { - $fileName = $this->yellow->config->get("configDir")."page-installation.txt"; - $this->yellow->pages->pages["root/"] = array(); - $this->yellow->page = new YellowPage($this->yellow); - $this->yellow->page->setRequestInformation($serverScheme, $serverName, $base, $location, $fileName); - $this->yellow->page->parseData($this->getRawDataInstallation($fileName, $this->yellow->getRequestLanguage()), false, 404); - $this->yellow->page->parserSafeMode = false; - $this->yellow->page->parseContent(); - $name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"])); - $email = trim($_REQUEST["email"]); - $password = trim($_REQUEST["password"]); - $language = trim($_REQUEST["language"]); - $status = trim($_REQUEST["status"]); - if($status == "install") - { - $status = "ok"; - $fileNameHome = $this->yellow->lookup->findFileFromLocation("/"); - $fileData = strreplaceu("\r\n", "\n", $this->yellow->toolbox->readFile($fileNameHome)); - if($fileData==$this->getRawDataHome("en") && $language!="en") - { - $status = $this->yellow->toolbox->createFile($fileNameHome, $this->getRawDataHome($language)) ? "ok" : "error"; - if($status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameHome'!"); - } - } - if($status == "ok") - { - if(!empty($email) && !empty($password) && $this->getUserAccount($email, $password, "install") == "ok") - { - $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); - $status = $this->users->update($fileNameUser, $email, $password, $name, $language, "active", "/") ? "ok" : "error"; - if($status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); - } - } - if($status == "ok") - { - if($this->yellow->config->get("sitename") == "Yellow") $_REQUEST["sitename"] = $name; - $fileNameConfig = $this->yellow->config->get("configDir").$this->yellow->config->get("configFile"); - $status = $this->yellow->config->update($fileNameConfig, $this->getInstallationData()) ? "done" : "error"; - if($status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameConfig'!"); - } - if($status == "done") - { - $statusCode = 303; - $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location); - $this->yellow->sendStatus($statusCode, $location); - } else { - $statusCode = $this->yellow->sendPage(); - } - } - return $statusCode; - } - // Send mail to web interface user function sendMail($serverScheme, $serverName, $base, $email, $action) { @@ -568,7 +525,7 @@ class YellowWebinterface } // Check web interface request - function checkRequest($location, $fileName) + function checkRequest($location) { if($this->yellow->toolbox->getServerScheme()==$this->yellow->config->get("webinterfaceServerScheme") && $this->yellow->toolbox->getServerName()==$this->yellow->config->get("webinterfaceServerName")) @@ -576,12 +533,7 @@ class YellowWebinterface $locationLength = strlenu($this->yellow->config->get("webinterfaceLocation")); $this->active = substru($location, 0, $locationLength) == $this->yellow->config->get("webinterfaceLocation"); } - if($this->yellow->config->get("installationMode")) - { - $_REQUEST["action"] = $this->yellow->isStaticFile($location, $fileName, false) ? "" : "install"; - $this->active = false; - } - return $this->yellow->config->get("installationMode") || $this->isActive(); + return $this->isActive(); } // Check web interface user @@ -784,42 +736,6 @@ class YellowWebinterface return $page; } - // Return raw data for installation page - function getRawDataInstallation($fileName, $language) - { - $fileData = $this->yellow->toolbox->readFile($fileName); - if(empty($fileData)) - { - $this->yellow->text->setLanguage($language); - $fileData = "---\nTitle:".$this->yellow->text->get("webinterfaceInstallationTitle")."\nLanguage:$language\nNavigation:navigation\n---\n"; - $fileData .= "<form class=\"installation-form\" action=\"".$this->yellow->page->getLocation()."\" method=\"post\">\n"; - $fileData .= "<p><label for=\"name\">".$this->yellow->text->get("webinterfaceSignupName")."</label><br /><input class=\"form-control\" type=\"text\" maxlength=\"64\" name=\"name\" id=\"name\" value=\"\"></p>\n"; - $fileData .= "<p><label for=\"email\">".$this->yellow->text->get("webinterfaceSignupEmail")."</label><br /><input class=\"form-control\" type=\"text\" maxlength=\"64\" name=\"email\" id=\"email\" value=\"\"></p>\n"; - $fileData .= "<p><label for=\"password\">".$this->yellow->text->get("webinterfaceSignupPassword")."</label><br /><input class=\"form-control\" type=\"password\" maxlength=\"64\" name=\"password\" id=\"password\" value=\"\"></p>\n"; - if(count($this->yellow->text->getLanguages()) > 1) - { - $fileData .= "<p>"; - foreach($this->yellow->text->getLanguages() as $language) - { - $checked = $language==$this->yellow->text->language ? " checked=\"checked\"" : ""; - $fileData .= "<label for=\"$language\"><input type=\"radio\" name=\"language\" id=\"$language\" value=\"$language\"$checked> ".$this->yellow->text->getTextHtml("languageDescription", $language)."</label><br />"; - } - $fileData .= "</p>\n"; - } - $fileData .= "<input class=\"btn\" type=\"submit\" value=\"".$this->yellow->text->get("webinterfaceOkButton")."\" />\n"; - $fileData .= "<input type=\"hidden\" name=\"status\" value=\"install\" />\n"; - $fileData .= "</form>\n"; - } - return $fileData; - } - - // Return raw data for home page - function getRawDataHome($language) - { - $rawData = "---\nTitle: Home\n---\n".strreplaceu("\\n", "\n", $this->yellow->text->getText("webinterfaceInstallationHomePage", $language)); - return $rawData; - } - // Return raw data for new page function getRawDataNew($location = "") { @@ -827,18 +743,18 @@ class YellowWebinterface $fileName = $this->yellow->lookup->findFileNew($fileName, $this->yellow->config->get("webinterfaceNewFile"), $this->yellow->config->get("configDir"), $this->yellow->config->get("template")); - $fileData = $this->yellow->toolbox->readFile($fileName); - $fileData = preg_replace("/@datetime/i", date("Y-m-d H:i:s"), $fileData); - $fileData = preg_replace("/@date/i", date("Y-m-d"), $fileData); - $fileData = preg_replace("/@usershort/i", strtok($this->users->getName($this->userEmail), " "), $fileData); - $fileData = preg_replace("/@username/i", $this->users->getName($this->userEmail), $fileData); - $fileData = preg_replace("/@userlanguage/i", $this->users->getLanguage($this->userEmail), $fileData); + $rawData = $this->yellow->toolbox->readFile($fileName); + $rawData = preg_replace("/@datetime/i", date("Y-m-d H:i:s"), $rawData); + $rawData = preg_replace("/@date/i", date("Y-m-d"), $rawData); + $rawData = preg_replace("/@usershort/i", strtok($this->users->getName($this->userEmail), " "), $rawData); + $rawData = preg_replace("/@username/i", $this->users->getName($this->userEmail), $rawData); + $rawData = preg_replace("/@userlanguage/i", $this->users->getLanguage($this->userEmail), $rawData); if(!empty($location)) { $title = $this->yellow->toolbox->createTextTitle($location); - $fileData = $this->updateDataTitle($fileData, $title); + $rawData = $this->updateDataTitle($rawData, $title); } - return $fileData; + return $rawData; } // Return page data including login information @@ -882,7 +798,7 @@ class YellowWebinterface { $data["serverLanguages"][$language] = $this->yellow->text->getTextHtml("languageDescription", $language); } - $data["serverVersion"] = YellowCore::Version; + $data["serverVersion"] = "Yellow ".YellowCore::Version; } else { $data["loginEmail"] = $this->yellow->config->get("loginEmail"); $data["loginPassword"] = $this->yellow->config->get("loginPassword"); @@ -892,23 +808,6 @@ class YellowWebinterface return $data; } - // Return installation data - function getInstallationData() - { - $data = array(); - foreach($_REQUEST as $key=>$value) - { - if(!$this->yellow->config->isExisting($key)) continue; - $data[$key] = trim($value); - } - $data["# serverScheme"] = $this->yellow->toolbox->getServerScheme(); - $data["# serverName"] = $this->yellow->toolbox->getServerName(); - $data["# serverBase"] = $this->yellow->toolbox->getServerBase(); - $data["# serverTime"] = $this->yellow->toolbox->getServerTime(); - $data["installationMode"] = "0"; - return $data; - } - // Return request strings function getRequestData() { @@ -964,6 +863,127 @@ class YellowWebinterface return $this->active; } } + +// Yellow installation +class YellowInstallation +{ + var $yellow; //access to API + + function __construct($yellow) + { + $this->yellow = $yellow; + } + + // Process request to install + function processRequest($serverScheme, $serverName, $base, $location, $fileName) + { + $statusCode = 0; + if(!$this->yellow->isStaticFile($location, $fileName, false)) + { + $fileName = $this->yellow->config->get("configDir")."page-installation.txt"; + $this->yellow->pages->pages["root/"] = array(); + $this->yellow->page = new YellowPage($this->yellow); + $this->yellow->page->setRequestInformation($serverScheme, $serverName, $base, $location, $fileName); + $this->yellow->page->parseData($this->getRawDataWelcome($fileName, $this->yellow->getRequestLanguage()), false, 404); + $this->yellow->page->parserSafeMode = false; + $this->yellow->page->parseContent(); + $name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"])); + $email = trim($_REQUEST["email"]); + $password = trim($_REQUEST["password"]); + $language = trim($_REQUEST["language"]); + $status = trim($_REQUEST["status"]); + if($status == "install") + { + $status = "ok"; + $fileNameHome = $this->yellow->lookup->findFileFromLocation("/"); + $fileData = strreplaceu("\r\n", "\n", $this->yellow->toolbox->readFile($fileNameHome)); + if($fileData==$this->getRawDataHome("en") && $language!="en") + { + $status = $this->yellow->toolbox->createFile($fileNameHome, $this->getRawDataHome($language)) ? "ok" : "error"; + if($status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameHome'!"); + } + } + if($status == "ok") + { + if(!empty($email) && !empty($password)) + { + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $status = $this->yellow->plugins->get("webinterface")->users->update($fileNameUser, $email, $password, $name, $language) ? "ok" : "error"; + if($status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } + } + if($status == "ok") + { + if($this->yellow->config->get("sitename") == "Yellow") $_REQUEST["sitename"] = $name; + $fileNameConfig = $this->yellow->config->get("configDir").$this->yellow->config->get("configFile"); + $status = $this->yellow->config->update($fileNameConfig, $this->getConfigData()) ? "done" : "error"; + if($status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameConfig'!"); + } + if($status == "done") + { + $statusCode = 303; + $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location); + $this->yellow->sendStatus($statusCode, $location); + } else { + $statusCode = $this->yellow->sendPage(); + } + } + return $statusCode; + } + + // Return raw data for welcome page + function getRawDataWelcome($fileName, $language) + { + $rawData = $this->yellow->toolbox->readFile($fileName); + if(empty($rawData)) + { + $this->yellow->text->setLanguage($language); + $rawData = "---\nTitle:".$this->yellow->text->get("webinterfaceInstallationTitle")."\nLanguage:$language\nNavigation:navigation\n---\n"; + $rawData .= "<form class=\"installation-form\" action=\"".$this->yellow->page->getLocation()."\" method=\"post\">\n"; + $rawData .= "<p><label for=\"name\">".$this->yellow->text->get("webinterfaceSignupName")."</label><br /><input class=\"form-control\" type=\"text\" maxlength=\"64\" name=\"name\" id=\"name\" value=\"\"></p>\n"; + $rawData .= "<p><label for=\"email\">".$this->yellow->text->get("webinterfaceSignupEmail")."</label><br /><input class=\"form-control\" type=\"text\" maxlength=\"64\" name=\"email\" id=\"email\" value=\"\"></p>\n"; + $rawData .= "<p><label for=\"password\">".$this->yellow->text->get("webinterfaceSignupPassword")."</label><br /><input class=\"form-control\" type=\"password\" maxlength=\"64\" name=\"password\" id=\"password\" value=\"\"></p>\n"; + if(count($this->yellow->text->getLanguages()) > 1) + { + $rawData .= "<p>"; + foreach($this->yellow->text->getLanguages() as $language) + { + $checked = $language==$this->yellow->text->language ? " checked=\"checked\"" : ""; + $rawData .= "<label for=\"$language\"><input type=\"radio\" name=\"language\" id=\"$language\" value=\"$language\"$checked> ".$this->yellow->text->getTextHtml("languageDescription", $language)."</label><br />"; + } + $rawData .= "</p>\n"; + } + $rawData .= "<input class=\"btn\" type=\"submit\" value=\"".$this->yellow->text->get("webinterfaceOkButton")."\" />\n"; + $rawData .= "<input type=\"hidden\" name=\"status\" value=\"install\" />\n"; + $rawData .= "</form>\n"; + } + return $rawData; + } + + // Return raw data for home page + function getRawDataHome($language) + { + $rawData = "---\nTitle: Home\n---\n".strreplaceu("\\n", "\n", $this->yellow->text->getText("webinterfaceInstallationHomePage", $language)); + return $rawData; + } + + // Return configuration data + function getConfigData() + { + $data = array(); + foreach($_REQUEST as $key=>$value) + { + if(!$this->yellow->config->isExisting($key)) continue; + $data[$key] = trim($value); + } + $data["# serverScheme"] = $this->yellow->toolbox->getServerScheme(); + $data["# serverName"] = $this->yellow->toolbox->getServerName(); + $data["# serverBase"] = $this->yellow->toolbox->getServerBase(); + $data["# serverTime"] = $this->yellow->toolbox->getServerTime(); + $data["installationMode"] = "0"; + return $data; + } +} // Yellow users class YellowUsers @@ -995,6 +1015,21 @@ class YellowUsers } } + // Clean users in file + function clean($fileName) + { + $fileData = $this->yellow->toolbox->readFile($fileName); + foreach($this->yellow->toolbox->getTextLines($fileData) as $line) + { + preg_match("/^\s*(.*?)\s*:\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches); + if(empty($matches[5]) || $matches[5]=="active" || $matches[5]=="inactive") + { + $fileDataNew .= $line; + } + } + return $this->yellow->toolbox->createFile($fileName, $fileDataNew); + } + // Update users in file function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $home = "") {