System update (web interface settings)

This commit is contained in:
markseu 2016-05-15 18:35:10 +02:00
parent 5ed65a06ff
commit 2e771bd19a
8 changed files with 498 additions and 434 deletions

View file

@ -3,4 +3,4 @@ Title: Home
---
Your website works!
You can now [edit this page] or use your text editor.
You can [edit this page] or use your text editor.

View file

@ -3,7 +3,7 @@
Language: de
LanguageDescription: Deutsch
LanguageAuthor: David Fehrmann
LanguageVersion: 0.6.4
LanguageVersion: 0.6.5
BlogBy: von
BlogFilter: Blog:
@ -29,10 +29,8 @@ SearchQuery: Suche:
SearchResultsNone: Bitte einen Suchbegriff eingeben.
SearchResultsEmpty: Keine Treffer für diese Suchanfrage.
SearchButton: Suchen
WebinterfaceInstallationTitle: Willkommen
WebinterfaceInstallationSitename: Webseite:
WebinterfaceInstallationAuthor: Name:
WebinterfaceInstallationHomePage: ---\nTitle: Home\n---\nDeine Webseite funktioniert!\n\nDu kannst [edit - diese Seite bearbeiten] oder einen Texteditor benutzen.
WebinterfaceInstallationTitle: Hallo
WebinterfaceInstallationHomePage: Deine Webseite funktioniert!\n\nDu kannst [edit - diese Seite bearbeiten] oder einen Texteditor benutzen.
WebinterfaceLoginTitle: Yellow
WebinterfaceLoginEmail: E-Mail:
WebinterfaceLoginPassword: Kennwort:
@ -73,7 +71,7 @@ WebinterfaceRecoverStatusExpire: Benutzerkonto kann nicht wiederhergestellt werd
WebinterfaceWelcomeSubject: Willkommen
WebinterfaceWelcomeMessage: Hallo @usershort, dein Benutzerkonto wurde erstellt. Viel Spass beim Bearbeiten der Webseite.
WebinterfaceInformationSubject: Willkommen zurück
WebinterfaceInformationMessage: Hallo @usershort, dein Benutzerkonto wurde wiederhergestellt. Viel Spass beim Bearbeiten der Webseite.
WebinterfaceInformationMessage: Hallo @usershort, dein Benutzerkonto wurde geändert. Viel Spass beim Bearbeiten der Webseite.
WebinterfaceOkButton: Ok
WebinterfaceCancelButton: Abbruch
WebinterfaceCreateButton: Erzeugen
@ -85,6 +83,9 @@ WebinterfaceDelete: -
WebinterfaceCreateTitle: Neue Seite
WebinterfaceDeleteTitle: Seite löschen
WebinterfaceMarkdownHelp: Markdown
WebinterfaceSettingsTitle: Einstellungen
WebinterfaceSettingsChangeEmail: Email ändern
WebinterfaceSettingsChangePassword: Kennwort ändern
WebinterfaceUserHelp: Hilfe
WebinterfaceUserLogout: Abmelden
WikiFilter: Wiki:

View file

@ -3,7 +3,7 @@
Language: en
LanguageDescription: English
LanguageAuthor: Mark Seuffert
LanguageVersion: 0.6.4
LanguageVersion: 0.6.5
BlogBy: by
BlogFilter: Blog:
@ -29,10 +29,8 @@ SearchQuery: Search:
SearchResultsNone: Enter a search term.
SearchResultsEmpty: No results found.
SearchButton: Search
WebinterfaceInstallationTitle: Welcome
WebinterfaceInstallationSitename: Website:
WebinterfaceInstallationAuthor: Name:
WebinterfaceInstallationHomePage: ---\nTitle: Home\n---\nYour website works!\n\nYou can now [edit this page] or use your text editor.
WebinterfaceInstallationTitle: Hello
WebinterfaceInstallationHomePage: Your website works!\n\nYou can [edit this page] or use your text editor.
WebinterfaceLoginTitle: Yellow
WebinterfaceLoginEmail: Email:
WebinterfaceLoginPassword: Password:
@ -73,7 +71,7 @@ WebinterfaceRecoverStatusExpire: User account can not be recovered. Link has exp
WebinterfaceWelcomeSubject: Welcome
WebinterfaceWelcomeMessage: Hi @usershort, your user account has been created. Have fun editing the website.
WebinterfaceInformationSubject: Welcome back
WebinterfaceInformationMessage: Hi @usershort, your user account has been recovered. Have fun editing the website.
WebinterfaceInformationMessage: Hi @usershort, your user account has been changed. Have fun editing the website.
WebinterfaceOkButton: Ok
WebinterfaceCancelButton: Cancel
WebinterfaceCreateButton: Create
@ -85,6 +83,9 @@ WebinterfaceDelete: -
WebinterfaceCreateTitle: New page
WebinterfaceDeleteTitle: Delete page
WebinterfaceMarkdownHelp: Markdown
WebinterfaceSettingsTitle: Settings
WebinterfaceSettingsChangeEmail: Change your email
WebinterfaceSettingsChangePassword: Change your password
WebinterfaceUserHelp: Help
WebinterfaceUserLogout: Logout
WikiFilter: Wiki:

View file

@ -3,7 +3,7 @@
Language: fr
LanguageDescription: Français
LanguageAuthor: Juh Nibreh
LanguageVersion: 0.6.4
LanguageVersion: 0.6.5
BlogBy: par
BlogFilter: Blog:
@ -29,10 +29,8 @@ SearchQuery: Rechercher:
SearchResultsNone: Entrez un mot dans le champ de recherche.
SearchResultsEmpty: Pas de résultats.
SearchButton: Rechercher
WebinterfaceInstallationTitle: Bienvenue
WebinterfaceInstallationSitename: Site web:
WebinterfaceInstallationAuthor: Nom:
WebinterfaceInstallationHomePage: ---\nTitle: Home\n---\nVotre site web fonctionne!\n\nVous pouvez [edit - modifier cette page] ou utiliser un éditeur de texte.
WebinterfaceInstallationTitle: Bonjour
WebinterfaceInstallationHomePage: Votre site web fonctionne!\n\nVous pouvez [edit - modifier cette page] ou utiliser un éditeur de texte.
WebinterfaceLoginTitle: Yellow
WebinterfaceLoginEmail: Email:
WebinterfaceLoginPassword: Mot de passe:
@ -73,7 +71,7 @@ WebinterfaceRecoverStatusExpire: Le compte ne peut pas être restauré. Le lien
WebinterfaceWelcomeSubject: Bienvenue
WebinterfaceWelcomeMessage: Bonjour @usershort, votre compte utilisateur a bien été créé. Amusez-vous bien en éditant le site web.
WebinterfaceInformationSubject: Bienvenue à nouveau
WebinterfaceInformationMessage: Bonjour @usershort, votre compte utilisateur a bien été restauré. Amusez-vous bien en éditant le site web.
WebinterfaceInformationMessage: Bonjour @usershort, votre compte utilisateur a bien été changé. Amusez-vous bien en éditant le site web.
WebinterfaceOkButton: Ok
WebinterfaceCancelButton: Annuler
WebinterfaceCreateButton: Créer
@ -85,6 +83,9 @@ WebinterfaceDelete: -
WebinterfaceCreateTitle: Nouvelle page
WebinterfaceDeleteTitle: Supprimer page
WebinterfaceMarkdownHelp: Markdown
WebinterfaceSettingsTitle: Paramètres
WebinterfaceSettingsChangeEmail: Changez email
WebinterfaceSettingsChangePassword: Changez mot de passe
WebinterfaceUserHelp: Aide
WebinterfaceUserLogout: Déconnexion
WikiFilter: Wiki:

View file

@ -5,7 +5,7 @@
// Language plugin
class YellowLanguage
{
const Version = "0.6.4";
const Version = "0.6.5";
var $yellow; //access to API
// Handle initialisation

View file

@ -1,4 +1,4 @@
/* Yellow web interface 0.6.6 */
/* Yellow web interface 0.6.7 */
.yellow-bar { position:relative; overflow:hidden; height:2em; margin-bottom:10px; }
.yellow-bar-left { display:block; float:left; }
@ -20,8 +20,8 @@
.yellow-pane p { margin:0.5em; }
.yellow-pane ul { list-style:none; margin:0 0.5em; padding:0; }
.yellow-pane div { overflow:hidden; }
.yellow-cancel { display:block; float:right; padding:0 0.5em; color:#bbb; }
.yellow-cancel:hover { text-decoration:none; color:#000; }
.yellow-close { display:block; float:right; padding:0 0.5em; color:#bbb; }
.yellow-close:hover { text-decoration:none; color:#000; }
.yellow-arrow { position:absolute; top:0; left:0; }
.yellow-arrow:after, .yellow-arrow:before {
position:absolute;
@ -91,7 +91,7 @@
#yellow-pane-login { text-align:center; white-space:nowrap; }
#yellow-pane-login h1 { margin:0 1em; font-size:2em; }
#yellow-pane-login input { width:15em; box-sizing:border-box; }
#yellow-pane-login .yellow-form-control { width:15em; box-sizing:border-box; }
#yellow-pane-login .yellow-btn { width:15em; margin:1em 1em 0.5em 0; }
#yellow-pane-login-fields { width:15em; text-align:left; margin:0 auto; }
#yellow-pane-login-buttons { margin:0.5em 0; }
@ -99,7 +99,7 @@
#yellow-pane-signup { text-align:center; white-space:nowrap; }
#yellow-pane-signup h1 { margin:0 1em; font-size:2em; }
#yellow-pane-signup input { width:15em; box-sizing:border-box; }
#yellow-pane-signup .yellow-form-control { width:15em; box-sizing:border-box; }
#yellow-pane-signup .yellow-btn { width:15em; margin:1em 1em 0.5em 0; }
#yellow-pane-signup-status { margin:0.5em 0; display:inline-block; }
#yellow-pane-signup-fields { width:15em; text-align:left; margin:0 auto; }
@ -107,18 +107,26 @@
#yellow-pane-recover { text-align:center; white-space:nowrap; }
#yellow-pane-recover h1 { margin:0 1em; font-size:2em; }
#yellow-pane-recover input { width:15em; box-sizing:border-box; }
#yellow-pane-recover .yellow-form-control { width:15em; box-sizing:border-box; }
#yellow-pane-recover .yellow-btn { width:15em; margin:1em 1em 0.5em 0; }
#yellow-pane-recover-status { margin:0.5em 0; display:inline-block; }
#yellow-pane-recover-fields-first, #yellow-pane-recover-fields-second { width:15em; text-align:left; margin:0 auto; }
#yellow-pane-recover-buttons { margin-top:-0.5em; }
#yellow-pane-settings { text-align:center; white-space:nowrap; }
#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-fields { width:15em; text-align:left; margin:0 auto; }
#yellow-pane-settings-buttons p { margin-top:0; margin-bottom:0; }
#yellow-pane-edit { }
#yellow-pane-edit h1 { margin:0 0 10px 0; font-size:1.5em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
#yellow-pane-edit-page { padding:5px; outline:none; resize:none; }
#yellow-pane-edit-buttons { margin-top:5px; }
#yellow-pane-edit-buttons input { margin-right:10px; }
#yellow-pane-edit-help { float:right; }
#yellow-pane-user { cursor:pointer; }
#yellow-pane-user a { text-decoration:none; }
#yellow-pane-user a:hover { text-decoration:underline; }

View file

@ -4,89 +4,59 @@
// Yellow API
var yellow =
{
version: "0.6.6",
version: "0.6.7",
action: function(text) { yellow.webinterface.action(text); },
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); },
webinterface:{}, toolbox:{}, page:{}, config:{}, text:{}
onIntervall: function() { yellow.webinterface.updateIntervall(); }
}
// Yellow web interface
yellow.webinterface =
{
loaded: false, //web interface loaded? (boolean)
intervalId: 0, //timer interval ID
paneId: 0, //visible pane ID
paneType: 0, //visible pane type
intervalId: 0, //timer interval ID
// Initialise web interface
init: function()
{
this.intervalId = setInterval("yellow.webinterface.load()", 1);
yellow.toolbox.addEvent(document, "click", yellow.onClick);
yellow.toolbox.addEvent(document, "keydown", yellow.onKeydown);
yellow.toolbox.addEvent(window, "resize", yellow.onResize);
},
// Load web interface
load: function()
{
var body = document.getElementsByTagName("body")[0];
if(body && body.firstChild && !this.loaded)
{
this.loaded = true;
if(yellow.config.webinterfaceLocation)
{
if(yellow.debug) console.log("yellow.webinterface.load email:"+yellow.config.userEmail+" "+yellow.config.userName);
if(yellow.config.userEmail)
{
this.createBar("yellow-bar", true, body.firstChild);
this.createPane("yellow-pane-edit", true, body.firstChild);
this.createPane("yellow-pane-user", true, body.firstChild);
yellow.toolbox.addEvent(document.getElementById("yellow-pane-edit-page"), "keyup", yellow.onUpdate);
yellow.toolbox.addEvent(document.getElementById("yellow-pane-edit-page"), "change", yellow.onUpdate);
} else {
this.createBar("yellow-bar", false, body.firstChild);
this.createPane("yellow-pane-login", false, body.firstChild);
this.createPane("yellow-pane-signup", false, body.firstChild);
this.createPane("yellow-pane-recover", false, body.firstChild);
yellow.action(yellow.page.loginAction);
}
}
clearInterval(this.intervalId);
}
},
// Execute action
// Handle action
action: function(text)
{
if(yellow.config.debug) console.log("yellow.webinterface.action action:"+text);
switch(text)
{
case "login": this.togglePane("yellow-pane-login"); break;
case "logout": yellow.toolbox.submitForm({"action":"logout"}); break;
case "signup": this.togglePane("yellow-pane-signup", "signup"); break;
case "confirm": this.togglePane("yellow-pane-signup", "confirm"); break;
case "approve": this.togglePane("yellow-pane-signup", "approve"); break;
case "recover": this.togglePane("yellow-pane-recover", "recover"); break;
case "create": this.togglePane("yellow-pane-edit", "create", true); break;
case "edit": this.togglePane("yellow-pane-edit", "edit", true); break;
case "delete": this.togglePane("yellow-pane-edit", "delete", true); break;
case "user": this.togglePane("yellow-pane-user"); break;
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 "close": this.hidePane(this.paneId); break;
case "help": this.hidePane(this.paneId); location.href = this.getText("UserHelpUrl", "yellow"); break;
}
},
// Create bar
createBar: function(id, normal, elementReference)
createBar: function(barId)
{
if(yellow.debug) console.log("yellow.webinterface.createBar id:"+id);
if(yellow.config.debug) console.log("yellow.webinterface.createBar id:"+barId);
var elementBar = document.createElement("div");
elementBar.className = "yellow-bar";
elementBar.setAttribute("id", id);
if(normal)
elementBar.setAttribute("id", barId);
if(barId=="yellow-bar")
{
yellow.toolbox.addEvent(document, "click", yellow.onClick);
yellow.toolbox.addEvent(document, "keydown", yellow.onKeydown);
yellow.toolbox.addEvent(window, "resize", yellow.onResize);
}
if(yellow.config.userName)
{
elementBar.innerHTML =
"<div class=\"yellow-bar-left\">"+
@ -95,21 +65,27 @@ yellow.webinterface =
"<div class=\"yellow-bar-right\">"+
"<a href=\"#\" onclick=\"yellow.action('create'); return false;\" id=\"yellow-pane-create-link\">"+this.getText("Create")+"</a>"+
"<a href=\"#\" onclick=\"yellow.action('delete'); return false;\" id=\"yellow-pane-delete-link\">"+this.getText("Delete")+"</a>"+
"<a href=\"#\" onclick=\"yellow.action('user'); return false;\" id=\"yellow-pane-user-link\">"+yellow.config.userName+"</a>"+
"<a href=\"#\" onclick=\"yellow.action('user'); return false;\" id=\"yellow-pane-user-link\">"+yellow.toolbox.encodeHtml(yellow.config.userName)+"</a>"+
"</div>";
}
yellow.toolbox.insertBefore(elementBar, elementReference);
yellow.toolbox.insertBefore(elementBar, document.getElementsByTagName("body")[0].firstChild);
return elementBar;
},
// Create pane
createPane: function(paneId, bubble, elementReference)
createPane: function(paneId, paneType)
{
if(yellow.debug) console.log("yellow.webinterface.createPane id:"+paneId);
if(yellow.config.debug) console.log("yellow.webinterface.createPane id:"+paneId);
var elementPane = document.createElement("div");
elementPane.className = "yellow-pane";
elementPane.setAttribute("id", paneId);
elementPane.style.display = "none";
if(bubble)
if(paneId=="yellow-pane-edit")
{
yellow.toolbox.addEvent(elementPane, "keyup", yellow.onUpdate);
yellow.toolbox.addEvent(elementPane, "change", yellow.onUpdate);
}
if(paneId=="yellow-pane-edit" || paneId=="yellow-pane-user")
{
var elementArrow = document.createElement("span");
elementArrow.className = "yellow-arrow";
@ -118,16 +94,17 @@ yellow.webinterface =
}
var elementDiv = document.createElement("div");
elementDiv.setAttribute("id", paneId+"-content");
if(paneId == "yellow-pane-login")
switch(paneId)
{
elementDiv.innerHTML =
case "yellow-pane-login":
elementDiv.innerHTML =
"<form method=\"post\">"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-cancel\">x</a>"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+
"<h1>"+this.getText("LoginTitle")+"</h1>"+
"<div id=\"yellow-pane-login-fields\">"+
"<input type=\"hidden\" name=\"action\" value=\"login\" />"+
"<p><label for=\"email\">"+this.getText("LoginEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"email\" maxlength=\"64\" value=\""+yellow.config.loginEmail+"\" /></p>"+
"<p><label for=\"password\">"+this.getText("LoginPassword")+"</label><br /><input class=\"yellow-form-control\" type=\"password\" name=\"password\" id=\"password\" maxlength=\"64\" value=\""+yellow.config.loginPassword+"\" /></p>"+
"<p><label for=\"yellow-pane-login-email\">"+this.getText("LoginEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"yellow-pane-login-email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(yellow.config.loginEmail)+"\" /></p>"+
"<p><label for=\"yellow-pane-login-password\">"+this.getText("LoginPassword")+"</label><br /><input class=\"yellow-form-control\" type=\"password\" name=\"password\" id=\"yellow-pane-login-password\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(yellow.config.loginPassword)+"\" /></p>"+
"<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("LoginButton")+"\" /></p>"+
"</div>"+
"<div id=\"yellow-pane-login-buttons\">"+
@ -135,44 +112,62 @@ yellow.webinterface =
"<p><a href=\"#\" onclick=\"yellow.action('signup'); return false;\">"+this.getText("LoginSignup")+"</a><p>"+
"</div>"+
"</form>";
} else if(paneId == "yellow-pane-signup") {
elementDiv.innerHTML =
break;
case "yellow-pane-signup":
elementDiv.innerHTML =
"<form method=\"post\">"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-cancel\">x</a>"+
"<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.loginStatus+"\">"+this.getText("SignupStatus", "", yellow.page.loginStatus)+"</div>"+
"<div id=\"yellow-pane-signup-status\" class=\""+yellow.page.status+"\">"+this.getText("SignupStatus", "", yellow.page.status)+"</div>"+
"<div id=\"yellow-pane-signup-fields\">"+
"<input type=\"hidden\" name=\"action\" value=\"signup\" />"+
"<p><label for=\"name\">"+this.getText("SignupName")+"</label><br /><input class=\"yellow-form-control\" name=\"name\" id=\"name\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("Name"))+"\" /></p>"+
"<p><label for=\"email\">"+this.getText("SignupEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("Email"))+"\" /></p>"+
"<p><label for=\"password\">"+this.getText("SignupPassword")+"</label><br /><input class=\"yellow-form-control\" type=\"password\" name=\"password\" id=\"password\" maxlength=\"64\" value=\"\" /></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>"+
"<div id=\"yellow-pane-signup-buttons\">"+
"<p><input class=\"yellow-btn\" type=\"button\" onclick=\"yellow.action('close'); return false;\" value=\""+this.getText("OkButton")+"\" /></p>"+
"</div>"+
"</form>";
} else if(paneId == "yellow-pane-recover") {
elementDiv.innerHTML =
break;
case "yellow-pane-recover":
elementDiv.innerHTML =
"<form method=\"post\">"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-cancel\">x</a>"+
"<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.loginStatus+"\">"+this.getText("RecoverStatus", "", yellow.page.loginStatus)+"</div>"+
"<div id=\"yellow-pane-recover-status\" class=\""+yellow.page.status+"\">"+this.getText("RecoverStatus", "", yellow.page.status)+"</div>"+
"<div id=\"yellow-pane-recover-fields-first\">"+
"<input type=\"hidden\" name=\"action\" value=\"recover\" />"+
"<p><label for=\"email\">"+this.getText("RecoverEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("Email"))+"\" /></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("RecoverButton")+"\" /></p>"+
"</div>"+
"<div id=\"yellow-pane-recover-fields-second\">"+
"<p><label for=\"password\">"+this.getText("RecoverPassword")+"</label><br /><input class=\"yellow-form-control\" type=\"password\" name=\"password\" id=\"password\" maxlength=\"64\" value=\"\" /></p>"+
"<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("RecoverButton")+"\" /></p>"+
"<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>"+
"<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("OkButton")+"\" /></p>"+
"</div>"+
"<div id=\"yellow-pane-recover-buttons\">"+
"<p><input class=\"yellow-btn\" type=\"button\" onclick=\"yellow.action('close'); return false;\" value=\""+this.getText("OkButton")+"\" /></p>"+
"</div>"+
"</form>";
} else if(paneId == "yellow-pane-edit") {
elementDiv.innerHTML =
break;
case "yellow-pane-settings":
elementDiv.innerHTML =
"<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-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><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("OkButton")+"\" /></p>"+
"</div>"+
"</form>";
break;
case "yellow-pane-edit":
elementDiv.innerHTML =
"<form method=\"post\">"+
"<h1 id=\"yellow-pane-edit-title\">"+this.getText("Edit")+"</h1>"+
"<textarea id=\"yellow-pane-edit-page\" class=\"yellow-form-control\" name=\"rawdataedit\"></textarea>"+
@ -182,91 +177,162 @@ yellow.webinterface =
"<a href=\""+this.getText("MarkdownHelpUrl", "yellow")+"\" target=\"_blank\" id=\"yellow-pane-edit-help\">"+this.getText("MarkdownHelp")+"</a>" +
"</div>"+
"</form>";
} else if(paneId == "yellow-pane-user") {
elementDiv.innerHTML =
"<p>"+yellow.config.userEmail+"</p>"+
"<p><a href=\""+this.getText("UserHelpUrl", "yellow")+"\" onclick=\"yellow.action('user'); return true;\">"+this.getText("UserHelp")+"</a></p>" +
break;
case "yellow-pane-user":
elementDiv.innerHTML =
"<p>"+yellow.toolbox.encodeHtml(yellow.config.userEmail)+"</p>"+
"<p><a href=\"#\" onclick=\"yellow.action('settings'); return false;\">"+this.getText("SettingsTitle")+"</a></p>" +
"<p><a href=\"#\" onclick=\"yellow.action('help'); return false;\">"+this.getText("UserHelp")+"</a></p>" +
"<p><a href=\"#\" onclick=\"yellow.action('logout'); return false;\">"+this.getText("UserLogout")+"</a></p>";
break;
}
elementPane.appendChild(elementDiv);
yellow.toolbox.insertAfter(elementPane, elementReference);
yellow.toolbox.insertAfter(elementPane, document.getElementsByTagName("body")[0].firstChild);
return elementPane;
},
// Update pane
updatePane: function(paneId, paneType, init)
{
if(yellow.debug) console.log("yellow.webinterface.updatePane id:"+paneId);
if(paneId == "yellow-pane-login")
switch(paneId)
{
if(!yellow.config.loginExtra)
{
document.getElementById("yellow-pane-login-buttons").style.display = "none";
}
} else if(paneId == "yellow-pane-signup") {
switch(paneType)
{
case "signup": text = this.getText("SignupStatus", "", yellow.page.loginStatus); break;
case "confirm": text = this.getText("ConfirmStatus", "", yellow.page.loginStatus); break;
case "approve": text = this.getText("ApproveStatus", "", yellow.page.loginStatus); break;
}
document.getElementById("yellow-pane-signup-status").innerHTML = yellow.toolbox.encodeHtml(text);
if(yellow.page.loginStatus=="next" || yellow.page.loginStatus=="done" || yellow.page.loginStatus=="expire")
{
document.getElementById("yellow-pane-signup-fields").style.display = "none";
} else {
document.getElementById("yellow-pane-signup-buttons").style.display = "none";
}
} else if(paneId == "yellow-pane-recover") {
if(yellow.page.loginStatus=="next" || yellow.page.loginStatus=="done" || yellow.page.loginStatus=="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"))
case "yellow-pane-login":
if(!yellow.config.loginButtons)
{
document.getElementById("yellow-pane-recover-fields-first").style.display = "none";
} else {
document.getElementById("yellow-pane-recover-fields-second").style.display = "none";
document.getElementById("yellow-pane-login-buttons").style.display = "none";
}
break;
case "yellow-pane-signup":
if(yellow.page.status=="next" || yellow.page.status=="done" || yellow.page.status=="expire")
{
document.getElementById("yellow-pane-signup-fields").style.display = "none";
} else {
document.getElementById("yellow-pane-signup-buttons").style.display = "none";
}
}
} else if(paneId == "yellow-pane-edit") {
if(init)
{
var title = yellow.page.title;
var string = yellow.page.rawDataEdit;
switch(paneType)
{
case "create": title = this.getText("CreateTitle"); string = yellow.page.rawDataNew; break;
case "delete": title = this.getText("DeleteTitle"); break;
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-edit-title").innerHTML = yellow.toolbox.encodeHtml(title);
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)
{
var key, className;
switch(action)
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")
{
case "create": key = "CreateButton"; className = "yellow-btn yellow-btn-create"; break;
case "edit": key = "EditButton"; className = "yellow-btn yellow-btn-edit"; break;
case "delete": key = "DeleteButton"; className = "yellow-btn yellow-btn-delete"; break;
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"))
{
document.getElementById("yellow-pane-recover-fields-first").style.display = "none";
} else {
document.getElementById("yellow-pane-recover-fields-second").style.display = "none";
}
}
document.getElementById("yellow-pane-edit-send").value = this.getText(key);
document.getElementById("yellow-pane-edit-send").className = className;
} else {
document.getElementById("yellow-pane-edit-send").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;
break;
case "yellow-pane-edit":
if(init)
{
var title = yellow.page.title;
var string = yellow.page.rawDataEdit;
switch(paneType)
{
case "create": title = this.getText("CreateTitle"); string = yellow.page.rawDataNew; break;
case "delete": title = this.getText("DeleteTitle"); break;
}
document.getElementById("yellow-pane-edit-title").innerHTML = yellow.toolbox.encodeHtml(title);
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)
{
var key, className;
switch(action)
{
case "create": key = "CreateButton"; className = "yellow-btn yellow-btn-create"; break;
case "edit": key = "EditButton"; className = "yellow-btn yellow-btn-edit"; break;
case "delete": key = "DeleteButton"; className = "yellow-btn yellow-btn-delete"; break;
}
document.getElementById("yellow-pane-edit-send").value = this.getText(key);
document.getElementById("yellow-pane-edit-send").className = className;
} else {
document.getElementById("yellow-pane-edit-send").style.display = "none";
}
break;
}
},
// 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)
{
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);
var paneHeight = yellow.toolbox.getWindowHeight() - paneTop - yellow.toolbox.getOuterHeight(elementBar);
switch(paneId)
{
case "yellow-pane-login":
case "yellow-pane-signup":
case "yellow-pane-recover":
case "yellow-pane-settings":
yellow.toolbox.setOuterTop(document.getElementById(paneId), paneTop);
yellow.toolbox.setOuterWidth(document.getElementById(paneId), paneWidth);
break;
case "yellow-pane-edit":
yellow.toolbox.setOuterTop(document.getElementById("yellow-pane-edit"), paneTop);
yellow.toolbox.setOuterHeight(document.getElementById("yellow-pane-edit"), paneHeight);
yellow.toolbox.setOuterWidth(document.getElementById("yellow-pane-edit"), paneWidth);
yellow.toolbox.setOuterWidth(document.getElementById("yellow-pane-edit-page"), yellow.toolbox.getWidth(document.getElementById("yellow-pane-edit")));
var height1 = yellow.toolbox.getHeight(document.getElementById("yellow-pane-edit"));
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 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);
break;
case "yellow-pane-user":
yellow.toolbox.setOuterTop(document.getElementById("yellow-pane-user"), paneTop);
yellow.toolbox.setOuterHeight(document.getElementById("yellow-pane-user"), paneHeight, true);
yellow.toolbox.setOuterLeft(document.getElementById("yellow-pane-user"), paneWidth - yellow.toolbox.getOuterWidth(document.getElementById("yellow-pane-user")), true);
var elementLink = document.getElementById("yellow-pane-user-link");
var position = yellow.toolbox.getOuterLeft(elementLink) + yellow.toolbox.getOuterWidth(elementLink)/2;
position -= yellow.toolbox.getOuterLeft(document.getElementById("yellow-pane-user"));
yellow.toolbox.setOuterLeft(document.getElementById("yellow-pane-user-arrow"), position);
break;
}
},
// Send pane
sendPane: function(paneId, paneType)
{
if(yellow.debug) console.log("yellow.webinterface.sendPane id:"+paneId);
if(paneId == "yellow-pane-edit")
if(yellow.config.debug) console.log("yellow.webinterface.sendPane id:"+paneId);
if(paneId=="yellow-pane-edit")
{
var action = this.getPaneAction(paneId, paneType);
if(action)
@ -279,38 +345,35 @@ yellow.webinterface =
} else {
this.hidePane(paneId);
}
} else {
yellow.toolbox.submitForm({"action":paneType});
}
},
// Show or hide pane
togglePane: function(paneId, paneType, modal)
showPane: function(paneId, paneType, modal)
{
if(this.paneId!=paneId || this.paneType!=paneType)
{
this.hidePane(this.paneId);
this.showPane(paneId, paneType, modal);
} else {
this.hidePane(paneId);
}
},
// Show pane
showPane: function(paneId, paneType, modal)
{
var element = document.getElementById(paneId);
if(!yellow.toolbox.isVisible(element))
{
if(yellow.debug) console.log("yellow.webinterface.showPane id:"+paneId);
element.style.display = "block";
if(modal)
var element = document.getElementById(paneId);
if(!element) element = this.createPane(paneId, paneType);
if(!yellow.toolbox.isVisible(element))
{
yellow.toolbox.addClass(document.body, "yellow-body-modal-open");
yellow.toolbox.addValue("meta[name=viewport]", "content", ", maximum-scale=1, user-scalable=0");
if(yellow.config.debug) console.log("yellow.webinterface.showPane id:"+paneId);
element.style.display = "block";
if(modal)
{
yellow.toolbox.addClass(document.body, "yellow-body-modal-open");
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.paneId = paneId;
this.paneType = paneType;
this.resizePane(paneId);
this.updatePane(paneId, paneType, true);
} else {
this.hidePane(this.paneId);
}
},
@ -320,7 +383,7 @@ yellow.webinterface =
var element = document.getElementById(paneId);
if(yellow.toolbox.isVisible(element))
{
if(yellow.debug) console.log("yellow.webinterface.hidePane id:"+paneId);
if(yellow.config.debug) console.log("yellow.webinterface.hidePane id:"+paneId);
yellow.toolbox.removeClass(document.body, "yellow-body-modal-open");
yellow.toolbox.removeValue("meta[name=viewport]", "content", ", maximum-scale=1, user-scalable=0");
element.style.display = "none";
@ -357,61 +420,16 @@ yellow.webinterface =
// Hide all panes on ESC key
hidePanesOnKeydown: function(keycode)
{
if(keycode == 27) this.hidePanes();
},
// Resize panes where needed
resizePane: function(paneId)
{
if(document.getElementById("yellow-bar"))
{
var elementBar = document.getElementById("yellow-bar");
var paneTop = yellow.toolbox.getOuterTop(elementBar) + yellow.toolbox.getOuterHeight(elementBar);
var paneWidth = yellow.toolbox.getOuterWidth(elementBar, true);
var paneHeight = yellow.toolbox.getWindowHeight() - paneTop - yellow.toolbox.getOuterHeight(elementBar);
switch(paneId)
{
case "yellow-pane-login":
case "yellow-pane-signup":
case "yellow-pane-recover":
yellow.toolbox.setOuterTop(document.getElementById(paneId), paneTop);
yellow.toolbox.setOuterWidth(document.getElementById(paneId), paneWidth);
break;
case "yellow-pane-edit":
yellow.toolbox.setOuterTop(document.getElementById("yellow-pane-edit"), paneTop);
yellow.toolbox.setOuterHeight(document.getElementById("yellow-pane-edit"), paneHeight);
yellow.toolbox.setOuterWidth(document.getElementById("yellow-pane-edit"), paneWidth);
yellow.toolbox.setOuterWidth(document.getElementById("yellow-pane-edit-page"), yellow.toolbox.getWidth(document.getElementById("yellow-pane-edit")));
var height1 = yellow.toolbox.getHeight(document.getElementById("yellow-pane-edit"));
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 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);
break;
case "yellow-pane-user":
yellow.toolbox.setOuterTop(document.getElementById("yellow-pane-user"), paneTop);
yellow.toolbox.setOuterHeight(document.getElementById("yellow-pane-user"), paneHeight, true);
yellow.toolbox.setOuterLeft(document.getElementById("yellow-pane-user"), paneWidth - yellow.toolbox.getOuterWidth(document.getElementById("yellow-pane-user")), true);
var elementLink = document.getElementById("yellow-pane-user-link");
var position = yellow.toolbox.getOuterLeft(elementLink) + yellow.toolbox.getOuterWidth(elementLink)/2;
position -= yellow.toolbox.getOuterLeft(document.getElementById("yellow-pane-user"));
yellow.toolbox.setOuterLeft(document.getElementById("yellow-pane-user-arrow"), position);
break;
}
if(yellow.debug) console.log("yellow.webinterface.resizePane bar:"+elementBar.offsetWidth+"/"+elementBar.offsetHeight);
}
if(keycode==27) this.hidePanes();
},
// Return pane action
getPaneAction: function(paneId, paneType)
{
var action = "";
if(paneId == "yellow-pane-edit")
if(paneId=="yellow-pane-edit")
{
if(!yellow.page.userRestrictions)
if(!yellow.config.userRestrictions)
{
var string = document.getElementById("yellow-pane-edit-page").value;
switch(paneType)
@ -425,6 +443,22 @@ yellow.webinterface =
}
return action;
},
// Return pane languages
getPaneLanguages: function(paneId)
{
var languages = "";
if(yellow.toolbox.getLength(yellow.config.serverLanguages)>1)
{
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 />";
}
languages += "</p>";
}
return languages;
},
// Return request string
getRequest: function(key, prefix)
@ -515,6 +549,12 @@ yellow.toolbox =
return e.keyCode
},
// Return element length
getLength: function(element)
{
return Object.keys ? Object.keys(element).length : 0;
},
// Set element width/height in pixel, including padding and border
setOuterWidth: function(element, width, maxWidth)
{
@ -727,4 +767,4 @@ yellow.toolbox =
}
}
yellow.webinterface.init();
yellow.webinterface.intervalId = setInterval("yellow.onIntervall()", 1);

View file

@ -5,12 +5,14 @@
// Web interface plugin
class YellowWebinterface
{
const Version = "0.6.6";
const Version = "0.6.7";
var $yellow; //access to API
var $active; //web interface is active? (boolean)
var $loginAction; //web interface login action
var $loginStatus; //web interface login status
var $userEmail; //web interface user
var $userLanguage; //web interface user language
var $userRestrictions; //web interface user can change page? (boolean)
var $action; //web interface action
var $status; //web interface status
var $users; //web interface users
var $merge; //web interface merge
var $rawDataSource; //raw data of page for comparison
@ -40,20 +42,10 @@ class YellowWebinterface
function onRequest($serverScheme, $serverName, $base, $location, $fileName)
{
$statusCode = 0;
if($this->checkRequest($location))
if($this->checkRequest($location, $fileName))
{
list($serverScheme, $serverName, $base, $location, $fileName) = $this->updateRequestInformation();
$statusCode = $this->processRequest($serverScheme, $serverName, $base, $location, $fileName);
} else {
$activeLocation = $this->yellow->config->get("webinterfaceLocation");
if(rtrim($location, '/') == rtrim($activeLocation, '/'))
{
$statusCode = 301;
$location = $this->yellow->lookup->normaliseUrl(
$this->yellow->config->get("webinterfaceServerScheme"),
$this->yellow->config->get("webinterfaceServerName"), $base, $activeLocation);
$this->yellow->sendStatus($statusCode, $location);
}
}
return $statusCode;
}
@ -67,16 +59,12 @@ class YellowWebinterface
{
if(empty($this->rawDataSource)) $this->rawDataSource = $page->rawData;
if(empty($this->rawDataEdit)) $this->rawDataEdit = $page->rawData;
if($page->statusCode == 424)
{
$title = $this->yellow->toolbox->createTextTitle($page->location);
$this->rawDataEdit = $this->getRawDataNew($title);
}
} else {
if(empty($this->loginAction)) $this->loginAction = "login";
if(empty($this->loginStatus)) $this->loginStatus = "none";
if($this->loginStatus == "error") $this->loginAction = "error";
if($page->statusCode == 424) $this->rawDataEdit = $this->getRawDataNew($page->location);
}
if(empty($this->userLanguage)) $this->userLanguage = $page->get("language");
if(empty($this->action)) $this->action = $this->isUser() ? "none" : "login";
if(empty($this->status)) $this->status = "none";
if($this->status == "error") $this->action = "error";
}
}
@ -107,7 +95,6 @@ class YellowWebinterface
$output .= "yellow.page = ".json_encode($this->getPageData()).";\n";
$output .= "yellow.config = ".json_encode($this->getConfigData()).";\n";
$output .= "yellow.text = ".json_encode($this->getTextData()).";\n";
if(defined("DEBUG") && DEBUG>=1) $output .= "yellow.debug = ".json_encode(DEBUG).";\n";
$output .= "// ]]>\n";
$output .= "</script>\n";
}
@ -184,10 +171,10 @@ 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 "settings": $statusCode = $this->processRequestSettings($serverScheme, $serverName, $base, $location, $fileName); break;
case "create": $statusCode = $this->processRequestCreate($serverScheme, $serverName, $base, $location, $fileName); break;
case "edit": $statusCode = $this->processRequestEdit($serverScheme, $serverName, $base, $location, $fileName); break;
case "delete": $statusCode = $this->processRequestDelete($serverScheme, $serverName, $base, $location, $fileName); break;
case "install": $statusCode = $this->processRequestInstall($serverScheme, $serverName, $base, $location, $fileName); break;
}
} else {
switch($_REQUEST["action"])
@ -202,7 +189,9 @@ class YellowWebinterface
if($statusCode == 0)
{
$statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false);
if($this->loginAction == "fail") $this->yellow->page->error(500, "Login failed, [please log in](javascript:yellow.action('login');)!");
$fileNameConfig = $this->yellow->config->get("configDir").$this->yellow->config->get("configFile");
if($this->action == "off") $this->yellow->page->error(500, "Please configure webmaster email in file '$fileNameConfig'!");
if($this->action == "fail") $this->yellow->page->error(500, "Login failed, [please log in](javascript:yellow.action('login');)!");
}
return $statusCode;
}
@ -218,7 +207,7 @@ class YellowWebinterface
if($this->yellow->isRequestContentDirectory($location))
{
$statusCode = 301;
$location = $this->yellow->lookup->isFileLocation($location) ? "$location/" : "/".$this->yellow->getRequestLanguage()."/";
$location = $this->yellow->lookup->isFileLocation($location) ? "$location/" : "/".$this->yellow->getRequestLanguage(true)."/";
$location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location);
$this->yellow->sendStatus($statusCode, $location);
} else {
@ -234,7 +223,7 @@ class YellowWebinterface
function processRequestLogin($serverScheme, $serverName, $base, $location, $fileName)
{
$statusCode = 0;
$home = $this->users->getHome();
$home = $this->users->getHome($this->userEmail);
if(substru($location, 0, strlenu($home)) == $home)
{
$statusCode = 303;
@ -252,8 +241,8 @@ class YellowWebinterface
function processRequestLogout($serverScheme, $serverName, $base, $location, $fileName)
{
$statusCode = 302;
$this->userEmail = "";
$this->users->destroyCookie("login");
$this->users->email = "";
$location = $this->yellow->lookup->normaliseUrl(
$this->yellow->config->get("serverScheme"),
$this->yellow->config->get("serverName"),
@ -265,25 +254,25 @@ class YellowWebinterface
// Process request for user signup
function processRequestSignup($serverScheme, $serverName, $base, $location, $fileName)
{
$this->loginAction = "signup";
$this->loginStatus = "ok";
$this->action = "signup";
$this->status = "ok";
$name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"]));
$email = trim($_REQUEST["email"]);
$password = trim($_REQUEST["password"]);
if(empty($name) || empty($email) || empty($password)) $this->loginStatus = "incomplete";
if($this->loginStatus == "ok") $this->loginStatus = $this->getUserAccount($email, $password, $this->loginAction);
if($this->loginStatus == "ok" && !$this->isExtra()) $this->loginStatus = "next";
if($this->loginStatus == "ok" && $this->users->isExisting($email)) $this->loginStatus = "next";
if($this->loginStatus == "ok")
if(empty($name) || empty($email) || empty($password)) $this->status = "incomplete";
if($this->status == "ok") $this->status = $this->getUserAccount($email, $password, $this->action);
if($this->status == "ok" && !$this->users->isWebmaster()) $this->status = "next";
if($this->status == "ok" && $this->users->isExisting($email)) $this->status = "next";
if($this->status == "ok")
{
$fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile");
$this->loginStatus = $this->users->update($fileNameUser, $email, $password, $name, "", "unconfirmed") ? "ok" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
$this->status = $this->users->update($fileNameUser, $email, $password, $name, "", "unconfirmed") ? "ok" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
}
if($this->loginStatus == "ok")
if($this->status == "ok")
{
$this->loginStatus = $this->sendMail($serverScheme, $serverName, $base, $email, "confirm") ? "next" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't send email on this server!");
$this->status = $this->sendMail($serverScheme, $serverName, $base, $email, "confirm") ? "next" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't send email on this server!");
}
$statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false);
return $statusCode;
@ -292,20 +281,20 @@ class YellowWebinterface
// Process request to confirm user signup
function processRequestConfirm($serverScheme, $serverName, $base, $location, $fileName)
{
$this->loginAction = "confirm";
$this->loginStatus = "ok";
$this->action = "confirm";
$this->status = "ok";
$email = $_REQUEST["email"];
$this->loginStatus = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]);
if($this->loginStatus == "ok")
$this->status = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]);
if($this->status == "ok")
{
$fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile");
$this->loginStatus = $this->users->update($fileNameUser, $email, "", "", "", "unapproved") ? "ok" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
$this->status = $this->users->update($fileNameUser, $email, "", "", "", "unapproved") ? "ok" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
}
if($this->loginStatus == "ok")
if($this->status == "ok")
{
$this->loginStatus = $this->sendMail($serverScheme, $serverName, $base, $email, "approve") ? "done" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't send email on this server!");
$this->status = $this->sendMail($serverScheme, $serverName, $base, $email, "approve") ? "done" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't send email on this server!");
}
$statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false);
return $statusCode;
@ -314,20 +303,20 @@ class YellowWebinterface
// Process request to approve user signup
function processRequestApprove($serverScheme, $serverName, $base, $location, $fileName)
{
$this->loginAction = "approve";
$this->loginStatus = "ok";
$this->action = "approve";
$this->status = "ok";
$email = $_REQUEST["email"];
$this->loginStatus = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]);
if($this->loginStatus == "ok")
$this->status = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]);
if($this->status == "ok")
{
$fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile");
$this->loginStatus = $this->users->update($fileNameUser, $email, "", "", "", "active") ? "ok" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
$this->status = $this->users->update($fileNameUser, $email, "", "", "", "active") ? "ok" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
}
if($this->loginStatus == "ok")
if($this->status == "ok")
{
$this->loginStatus = $this->sendMail($serverScheme, $serverName, $base, $email, "welcome") ? "done" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't send email on this server!");
$this->status = $this->sendMail($serverScheme, $serverName, $base, $email, "welcome") ? "done" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't send email on this server!");
}
$statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false);
return $statusCode;
@ -336,42 +325,67 @@ class YellowWebinterface
// Process request to recover password
function processRequestRecover($serverScheme, $serverName, $base, $location, $fileName)
{
$this->loginAction = "recover";
$this->loginStatus = "ok";
$this->action = "recover";
$this->status = "ok";
$email = trim($_REQUEST["email"]);
$password = trim($_REQUEST["password"]);
if(empty($_REQUEST["id"]))
{
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $this->loginStatus = "invalid";
if($this->loginStatus == "ok" && !$this->isExtra()) $this->loginStatus = "next";
if($this->loginStatus == "ok" && !$this->users->isExisting($email)) $this->loginStatus = "next";
if($this->loginStatus == "ok")
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $this->status = "invalid";
if($this->status == "ok" && !$this->users->isWebmaster()) $this->status = "next";
if($this->status == "ok" && !$this->users->isExisting($email)) $this->status = "next";
if($this->status == "ok")
{
$this->loginStatus = $this->sendMail($serverScheme, $serverName, $base, $email, "recover") ? "next" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't send email on this server!");
$this->status = $this->sendMail($serverScheme, $serverName, $base, $email, "recover") ? "next" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't send email on this server!");
}
} else {
$this->loginStatus = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]);
if($this->loginStatus == "ok")
$this->status = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]);
if($this->status == "ok")
{
if(empty($password)) $this->loginStatus = "password";
if($this->loginStatus == "ok") $this->loginStatus = $this->getUserAccount($email, $password, $this->loginAction);
if($this->loginStatus == "ok")
if(empty($password)) $this->status = "password";
if($this->status == "ok") $this->status = $this->getUserAccount($email, $password, $this->action);
if($this->status == "ok")
{
$fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile");
$this->loginStatus = $this->users->update($fileNameUser, $email, $password) ? "ok" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
$this->status = $this->users->update($fileNameUser, $email, $password) ? "ok" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
}
if($this->loginStatus == "ok")
if($this->status == "ok")
{
$this->loginStatus = $this->sendMail($serverScheme, $serverName, $base, $email, "information") ? "done" : "error";
if($this->loginStatus == "error") $this->yellow->page->error(500, "Can't send email on this server!");
$this->userEmail = "";
$this->users->destroyCookie("login");
$this->status = $this->sendMail($serverScheme, $serverName, $base, $email, "information") ? "done" : "error";
if($this->status == "error") $this->yellow->page->error(500, "Can't send email on this server!");
}
}
}
$statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false);
return $statusCode;
}
// Process request to change settings
function processRequestSettings($serverScheme, $serverName, $base, $location, $fileName)
{
$statusCode = 0;
if($this->getUserAccount($this->userEmail, "", "settings") == "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'!");
}
}
return $statusCode;
}
// Process request to create page
function processRequestCreate($serverScheme, $serverName, $base, $location, $fileName)
@ -460,7 +474,7 @@ class YellowWebinterface
function processRequestInstall($serverScheme, $serverName, $base, $location, $fileName)
{
$statusCode = 0;
if($this->yellow->config->get("installationMode") && !$this->yellow->isStaticFile($location, $fileName, false))
if($this->yellow->config->get("installationMode"))
{
$fileName = $this->yellow->config->get("configDir")."page-installation.txt";
$this->yellow->pages->pages["root/"] = array();
@ -469,7 +483,7 @@ class YellowWebinterface
$this->yellow->page->parseData($this->getRawDataInstallation($fileName, $this->yellow->getRequestLanguage()), false, 404);
$this->yellow->page->parserSafeMode = false;
$this->yellow->page->parseContent();
$author = trim($_REQUEST["author"]);
$name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"]));
$email = trim($_REQUEST["email"]);
$password = trim($_REQUEST["password"]);
$language = trim($_REQUEST["language"]);
@ -477,26 +491,26 @@ class YellowWebinterface
if($status == "install")
{
$status = "ok";
$fileNamePage = $this->yellow->lookup->findFileFromLocation("/");
$rawData = strreplaceu("\\n", "\n", $this->yellow->text->getText("webinterfaceInstallationHomePage", "en"));
if($this->yellow->toolbox->readFile($fileNamePage)==$rawData && $language!="en")
$fileNameHome = $this->yellow->lookup->findFileFromLocation("/");
$fileData = strreplaceu("\r\n", "\n", $this->yellow->toolbox->readFile($fileNameHome));
if($fileData==$this->getRawDataHome("en") && $language!="en")
{
$rawData = strreplaceu("\\n", "\n", $this->yellow->text->getText("webinterfaceInstallationHomePage", $language));
$status = $this->yellow->toolbox->createFile($fileNamePage, $rawData) ? "ok" : "error";
if($status == "error") $this->yellow->page->error(500, "Can't write file '$fileNamePage'!");
$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($this->getUserAccount($email, $password, "install") == "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, $author, $language, "active", "/") ? "ok" : "error";
$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'!");
@ -516,13 +530,13 @@ class YellowWebinterface
// Send mail to web interface user
function sendMail($serverScheme, $serverName, $base, $email, $action)
{
if($action=="welcome" || $action == "information")
if($action=="welcome" || $action=="information")
{
$url = "$serverScheme://$serverName$base/";
} else {
$expire = time()+60*60*24*30;
$id = $this->users->createRequestId($email, $action, $expire);
$url = "$serverScheme://$serverName$base"."/action:$action/email:$email/expire:$expire/id:$id";
$expire = time()+60*60*24;
$id = $this->users->createUserRequestId($email, $action, $expire);
$url = "$serverScheme://$serverName$base"."/action:$action/email:$email/expire:$expire/id:$id/";
}
if($action == "approve")
{
@ -554,18 +568,18 @@ class YellowWebinterface
}
// Check web interface request
function checkRequest($location)
function checkRequest($location, $fileName)
{
if($this->yellow->toolbox->getServerScheme()==$this->yellow->config->get("webinterfaceServerScheme") &&
$this->yellow->toolbox->getServerName()==$this->yellow->config->get("webinterfaceServerName"))
{
$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"] = "install";
} else {
if($this->yellow->toolbox->getServerScheme()==$this->yellow->config->get("webinterfaceServerScheme") &&
$this->yellow->toolbox->getServerName()==$this->yellow->config->get("webinterfaceServerName"))
{
$locationLength = strlenu($this->yellow->config->get("webinterfaceLocation"));
$this->active = substru($location, 0, $locationLength) == $this->yellow->config->get("webinterfaceLocation");
}
$_REQUEST["action"] = $this->yellow->isStaticFile($location, $fileName, false) ? "" : "install";
$this->active = false;
}
return $this->yellow->config->get("installationMode") || $this->isActive();
}
@ -580,51 +594,62 @@ class YellowWebinterface
if($this->users->checkUser($email, $password))
{
$this->users->createCookie("login", $email);
$this->users->email = $email;
$this->userEmail = $email;
$this->userLanguage = $this->getUserLanguage($email);
$this->userRestrictions = $this->getUserRestrictions($email, $location, $fileName);
} else {
$this->loginAction = "fail";
$this->action = "fail";
}
} else if(isset($_COOKIE["login"])) {
list($email, $session) = explode(',', $_COOKIE["login"], 2);
if($this->users->checkCookie($email, $session))
{
$this->users->email = $email;
$this->userEmail = $email;
$this->userLanguage = $this->getUserLanguage($email);
$this->userRestrictions = $this->getUserRestrictions($email, $location, $fileName);
} else {
$this->loginAction = "fail";
$this->action = "fail";
}
}
if(!$this->users->getNumber() && !$this->users->isWebmaster()) $this->action = "off";
return $this->isUser();
}
// Return user language
function getUserLanguage($email)
{
$language = $this->users->getLanguage($email);
if(!$this->yellow->text->isLanguage($language)) $language = $this->yellow->config->get("language");
return $language;
}
// Return user account request
function getUserRequest($email, $action, $expire, $id)
{
$loginStatus = $this->users->checkRequest($email, $action, $expire, $id) ? "ok" : "done";
if($loginStatus=="done" && $expire<=time()) $loginStatus = "expire";
return $loginStatus;
$status = $this->users->checkUserRequest($email, $action, $expire, $id) ? "ok" : "done";
if($status=="done" && $expire<=time()) $status = "expire";
return $status;
}
// Return user account changes
function getUserAccount($email, $password, $action)
{
$loginStatus = NULL;
$status = NULL;
foreach($this->yellow->plugins->plugins as $key=>$value)
{
if(method_exists($value["obj"], "onUserAccount"))
{
$loginStatus = $value["obj"]->onUserAccount($email, $password, $action, $status, $this->users);
if(!is_null($loginStatus)) break;
$status = $value["obj"]->onUserAccount($email, $password, $action, $status, $this->users);
if(!is_null($status)) break;
}
}
if(is_null($loginStatus))
if(is_null($status))
{
$loginStatus = "ok";
if(strlenu($password)<$this->yellow->config->get("webinterfaceUserPasswordMinLength")) $loginStatus = "weak";
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $loginStatus = "invalid";
$status = "ok";
if(!empty($password) && strlenu($password)<$this->yellow->config->get("webinterfaceUserPasswordMinLength")) $status = "weak";
if(!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) $status = "invalid";
}
return $loginStatus;
return $status;
}
// Return user restrictions to change page
@ -642,7 +667,7 @@ class YellowWebinterface
if(is_null($userRestrictions))
{
$userRestrictions = !is_dir(dirname($fileName)) || strlenu(basename($fileName))>128;
$userRestrictions |= substru($location, 0, strlenu($this->users->getHome())) != $this->users->getHome();
$userRestrictions |= substru($location, 0, strlenu($this->users->getHome($email))) != $this->users->getHome($email);
}
return $userRestrictions;
}
@ -715,7 +740,7 @@ class YellowWebinterface
if(!$ok) $page->error(500, "Page '".$page->get("title")."' can not be created!");
}
}
if($this->getUserRestrictions($this->users->email, $page->location, $page->fileName))
if($this->getUserRestrictions($this->userEmail, $page->location, $page->fileName))
{
$page->error(500, "Page '".$page->get("title")."' is not allowed!");
}
@ -752,7 +777,7 @@ class YellowWebinterface
}
}
}
if($this->getUserRestrictions($this->users->email, $page->location, $page->fileName))
if($this->getUserRestrictions($this->userEmail, $page->location, $page->fileName))
{
$page->error(500, "Page '".$page->get("title")."' is not allowed!");
}
@ -768,10 +793,9 @@ class YellowWebinterface
$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=\"sitename\">".$this->yellow->text->get("webinterfaceInstallationSitename")."</label><br /><input class=\"form-control\" type=\"text\" name=\"sitename\" id=\"sitename\" value=\"".$this->yellow->config->getHtml("sitename")."\"></p>\n";
$fileData .= "<p><label for=\"author\">".$this->yellow->text->get("webinterfaceInstallationAuthor")."</label><br /><input class=\"form-control\" type=\"text\" maxlength=\"64\" name=\"author\" id=\"author\" value=\"\"></p>\n";
$fileData .= "<p><label for=\"email\">".$this->yellow->text->get("webinterfaceLoginEmail")."</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("webinterfaceLoginPassword")."</label><br /><input class=\"form-control\" type=\"password\" maxlength=\"64\" name=\"password\" id=\"password\" value=\"\"></p>\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>";
@ -789,8 +813,15 @@ class YellowWebinterface
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($title = "")
function getRawDataNew($location = "")
{
$fileName = $this->yellow->lookup->findFileFromLocation($this->yellow->page->location);
$fileName = $this->yellow->lookup->findFileNew($fileName,
@ -799,10 +830,14 @@ class YellowWebinterface
$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(), " "), $fileData);
$fileData = preg_replace("/@username/i", $this->users->getName(), $fileData);
$fileData = preg_replace("/@userlanguage/i", $this->users->getLanguage(), $fileData);
if(!empty($title)) $fileData = $this->updateDataTitle($fileData, $title);
$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);
if(!empty($location))
{
$title = $this->yellow->toolbox->createTextTitle($location);
$fileData = $this->updateDataTitle($fileData, $title);
}
return $fileData;
}
@ -816,15 +851,13 @@ class YellowWebinterface
$data["rawDataSource"] = $this->rawDataSource;
$data["rawDataEdit"] = $this->rawDataEdit;
$data["rawDataNew"] = $this->getRawDataNew();
$data["userRestrictions"] = $this->userRestrictions;
$data["pageFile"] = $this->yellow->page->get("pageFile");
$data["parserSafeMode"] = $this->yellow->page->parserSafeMode;
$data["statusCode"] = $this->yellow->page->statusCode;
} else {
$data["loginAction"] = $this->loginAction;
$data["loginStatus"] = $this->loginStatus;
if($this->loginAction != "none") $data = array_merge($data, $this->getRequestData());
}
if($this->action != "none") $data = array_merge($data, $this->getRequestData());
$data["action"] = $this->action;
$data["status"] = $this->status;
$data["statusCode"] = $this->yellow->page->statusCode;
return $data;
}
@ -834,21 +867,28 @@ class YellowWebinterface
$data = $this->yellow->config->getData("", "Location");
if($this->isUser())
{
$data["userEmail"] = $this->users->email;
$data["userName"] = $this->users->getName();
$data["userLanguage"] = $this->users->getLanguage();
$data["userStatus"] = $this->users->getStatus();
$data["userHome"] = $this->users->getHome();
$data["userEmail"] = $this->userEmail;
$data["userName"] = $this->users->getName($this->userEmail);
$data["userLanguage"] = $this->users->getLanguage($this->userEmail);
$data["userStatus"] = $this->users->getStatus($this->userEmail);
$data["userHome"] = $this->users->getHome($this->userEmail);
$data["userRestrictions"] = $this->userRestrictions;
$data["serverScheme"] = $this->yellow->config->get("serverScheme");
$data["serverName"] = $this->yellow->config->get("serverName");
$data["serverBase"] = $this->yellow->config->get("serverBase");
$data["serverTime"] = $this->yellow->config->get("serverTime");
$data["serverLanguages"] = $this->yellow->text->getLanguages();
$data["serverLanguages"] = array();
foreach($this->yellow->text->getLanguages() as $language)
{
$data["serverLanguages"][$language] = $this->yellow->text->getTextHtml("languageDescription", $language);
}
$data["serverVersion"] = YellowCore::Version;
} else {
$data["loginEmail"] = $this->yellow->config->get("loginEmail");
$data["loginPassword"] = $this->yellow->config->get("loginPassword");
$data["loginExtra"] = intval($this->isExtra());
$data["loginButtons"] = intval($this->users->isWebmaster());
}
if(defined("DEBUG") && DEBUG>=1) $data["debug"] = DEBUG;
return $data;
}
@ -875,7 +915,7 @@ class YellowWebinterface
$data = array();
foreach($_REQUEST as $key=>$value)
{
if($key == "password") continue;
if($key=="login" || $key=="password") continue;
$data["request".ucfirst($key)] = trim($value);
}
return $data;
@ -896,11 +936,9 @@ class YellowWebinterface
// Return text strings
function getTextData()
{
$language = $this->isUser() ? $this->users->getLanguage() : $this->yellow->page->get("language");
if(!$this->yellow->text->isLanguage($language)) $language = $this->yellow->config->get("language");
$textLanguage = array_merge($this->yellow->text->getData("language", $language));
$textWebinterface = array_merge($this->yellow->text->getData("webinterface", $language));
$textYellow = array_merge($this->yellow->text->getData("yellow", $language));
$textLanguage = array_merge($this->yellow->text->getData("language", $this->userLanguage));
$textWebinterface = array_merge($this->yellow->text->getData("webinterface", $this->userLanguage));
$textYellow = array_merge($this->yellow->text->getData("yellow", $this->userLanguage));
return array_merge($textLanguage, $textWebinterface, $textYellow);
}
@ -914,23 +952,17 @@ class YellowWebinterface
return $text;
}
// Check if user is logged in
function isUser()
{
return !empty($this->userEmail);
}
// Check if web interface request
function isActive()
{
return $this->active;
}
// Check if extra login features
function isExtra()
{
return strposu($this->yellow->config->get("email"), '@') !== false;
}
// Check if user is logged in
function isUser()
{
return !empty($this->users->email);
}
}
// Yellow users
@ -938,7 +970,6 @@ class YellowUsers
{
var $yellow; //access to API
var $users; //registered users
var $email; //current user
function __construct($yellow)
{
@ -954,7 +985,7 @@ class YellowUsers
foreach($this->yellow->toolbox->getTextLines($fileData) as $line)
{
if(preg_match("/^\#/", $line)) continue;
preg_match("/^(.*?)\s*:\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
preg_match("/^\s*(.*?)\s*:\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
if(!empty($matches[1]) && !empty($matches[2]) && !empty($matches[3]) && !empty($matches[4]) &&
!empty($matches[5]) && !empty($matches[6]))
{
@ -994,7 +1025,7 @@ class YellowUsers
$fileData = $this->yellow->toolbox->readFile($fileName);
foreach($this->yellow->toolbox->getTextLines($fileData) as $line)
{
preg_match("/^(.*?)\s*:\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
preg_match("/^\s*(.*?)\s*:\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches);
if(!empty($matches[1]) && $matches[1]==$email)
{
$fileDataNew .= "$email: $hash,$name,$language,$status,$home\n";
@ -1056,75 +1087,51 @@ class YellowUsers
}
// Check user request
function checkRequest($email, $action, $expire, $id)
function checkUserRequest($email, $action, $expire, $id)
{
switch($action)
{
case "confirm": $status = "unconfirmed"; break;
case "approve": $status = "unapproved"; break;
case "recover": $status = "active"; break;
case "confirm": $status = "unconfirmed"; break;
case "approve": $status = "unapproved"; break;
default: $status = "active"; break;
}
return $this->isExisting($email) && $this->users[$email]["status"]==$status && $expire>time() &&
$this->yellow->toolbox->verifyHash($this->users[$email]["hash"].$action.$expire, "sha256", $id);
}
// Create user request ID
function createRequestId($email, $action, $expire)
function createUserRequestId($email, $action, $expire)
{
return $this->yellow->toolbox->createHash($this->users[$email]["hash"].$action.$expire, "sha256");
}
// Retun user login information, TODO: this is an obsolete function and will be removed soon
function getUserInfo($email, $password, $name, $language, $home)
{
$algorithm = $this->yellow->config->get("webinterfaceUserHashAlgorithm");
$cost = $this->yellow->config->get("webinterfaceUserHashCost");
$hash = $this->yellow->toolbox->createHash($password, $algorithm, $cost);
if(!empty($hash))
{
$email = strreplaceu(',', '-', $email);
$hash = strreplaceu(',', '-', $hash);
$name = strreplaceu(',', '-', empty($name) ? $this->yellow->config->get("sitename") : $name);
$language = strreplaceu(',', '-', empty($language) ? $this->yellow->config->get("language") : $language);
$status = strreplaceu(',', '-', empty($status) ? $this->yellow->config->get("webinterfaceUserStatus") : $status);
$home = strreplaceu(',', '-', empty($home) ? $this->yellow->config->get("webinterfaceUserHome") : $home);
$user = "$email: $hash,$name,$language,$status,$home\n";
}
return $user;
}
// Return user hash
function getHash($email = "")
{
if(empty($email)) $email = $this->email;
return $this->isExisting($email) ? $this->users[$email]["hash"] : "";
}
// Return user name
function getName($email = "")
{
if(empty($email)) $email = $this->email;
return $this->isExisting($email) ? $this->users[$email]["name"] : "";
}
// Return user language
function getLanguage($email = "")
{
if(empty($email)) $email = $this->email;
return $this->isExisting($email) ? $this->users[$email]["language"] : "";
}
// Return user status
function getStatus($email = "")
{
if(empty($email)) $email = $this->email;
return $this->isExisting($email) ? $this->users[$email]["status"] : "";
}
// Return user home
function getHome($email = "")
{
if(empty($email)) $email = $this->email;
return $this->isExisting($email) ? $this->users[$email]["home"] : "";
}
@ -1133,6 +1140,12 @@ class YellowUsers
{
return count($this->users);
}
// Check if web master exists
function isWebmaster()
{
return strposu($this->yellow->config->get("email"), '@') !== false;
}
// Check if user exists
function isExisting($email)