System update (refactoring)

This commit is contained in:
markseu 2016-06-02 17:31:42 +02:00
parent 2e771bd19a
commit d611025b69
3 changed files with 300 additions and 261 deletions

View file

@ -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; }

View file

@ -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();
},
// Return pane action
getPaneAction: function(paneId, paneType)
// Send pane
sendPane: function(paneId, paneAction)
{
var action = "";
if(yellow.config.debug) console.log("yellow.webinterface.sendPane id:"+paneId);
if(paneId=="yellow-pane-edit")
{
if(!yellow.config.userRestrictions)
paneAction = this.getPaneAction(paneId, paneAction);
if(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";
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 action;
},
// Return pane languages
getPaneLanguages: function(paneId)
// Return pane action
getPaneAction: function(paneId, paneAction)
{
if(paneId=="yellow-pane-edit")
{
var string = document.getElementById("yellow-pane-edit-page").value;
var paneActionOld = paneAction;
switch(paneAction)
{
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 paneAction;
},
// 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);

View file

@ -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 = "")
{