mikuli.cz

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

commit 2e771bd19aa4ec59e7c531af8e6af5ddf9f2332f
parent 5ed65a06ff8cc4253eb6a52e2b9678948e063372
Author: markseu <mark2011@mayberg.se>
Date:   Sun, 15 May 2016 18:35:10 +0200

System update (web interface settings)

Diffstat:
Mcontent/1-home/page.txt | 4++--
Msystem/plugins/language-de.txt | 13+++++++------
Msystem/plugins/language-en.txt | 13+++++++------
Msystem/plugins/language-fr.txt | 13+++++++------
Msystem/plugins/language.php | 2+-
Msystem/plugins/webinterface.css | 20++++++++++++++------
Msystem/plugins/webinterface.js | 475+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Msystem/plugins/webinterface.php | 393+++++++++++++++++++++++++++++++++++++++++--------------------------------------
8 files changed, 498 insertions(+), 435 deletions(-)

diff --git a/content/1-home/page.txt b/content/1-home/page.txt @@ -3,4 +3,4 @@ Title: Home --- Your website works! -You can now [edit this page] or use your text editor. -\ No newline at end of file +You can [edit this page] or use your text editor. +\ No newline at end of file diff --git a/system/plugins/language-de.txt b/system/plugins/language-de.txt @@ -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: diff --git a/system/plugins/language-en.txt b/system/plugins/language-en.txt @@ -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: diff --git a/system/plugins/language-fr.txt b/system/plugins/language-fr.txt @@ -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: diff --git a/system/plugins/language.php b/system/plugins/language.php @@ -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 diff --git a/system/plugins/webinterface.css b/system/plugins/webinterface.css @@ -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; } diff --git a/system/plugins/webinterface.js b/system/plugins/webinterface.js @@ -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"; + 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-recover-fields-second").style.display = "none"; + 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(); -\ No newline at end of file +yellow.webinterface.intervalId = setInterval("yellow.onIntervall()", 1); diff --git a/system/plugins/webinterface.php b/system/plugins/webinterface.php @@ -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,22 +952,16 @@ class YellowWebinterface return $text; } - // Check if web interface request - function isActive() - { - return $this->active; - } - - // Check if extra login features - function isExtra() + // Check if user is logged in + function isUser() { - return strposu($this->yellow->config->get("email"), '@') !== false; + return !empty($this->userEmail); } - // Check if user is logged in - function isUser() + // Check if web interface request + function isActive() { - return !empty($this->users->email); + return $this->active; } } @@ -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)