mikuli.cz

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

commit 168b285ea634845e899854f81ff45a4f62d61524
parent c47f6f7c8dfbb91a3a2308fff56c07a3bee4d93d
Author: markseu <mark2011@mayberg.se>
Date:   Sat, 13 Aug 2016 17:48:18 +0200

System update (summer remix)

Diffstat:
Msystem/config/config.ini | 6+++---
Msystem/plugins/language-de.txt | 36+++++++++++++++++++++++++-----------
Msystem/plugins/language-en.txt | 36+++++++++++++++++++++++++-----------
Msystem/plugins/language-fr.txt | 44+++++++++++++++++++++++++++++---------------
Msystem/plugins/language.php | 2+-
Msystem/plugins/update.php | 9++++-----
Msystem/plugins/webinterface.css | 16++--------------
Msystem/plugins/webinterface.js | 95++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msystem/plugins/webinterface.php | 714+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
9 files changed, 566 insertions(+), 392 deletions(-)

diff --git a/system/config/config.ini b/system/config/config.ini @@ -53,12 +53,12 @@ UpdateThemesUrl: https://github.com/datenstrom/yellow-themes UpdateVersionFile: version.ini UpdateInformationFile: update.ini WebinterfaceLocation: /edit/ +WebinterfaceNewFile: page-new-(.*).txt +WebinterfaceMetaFilePrefix: published +WebinterfaceUserFile: user.ini WebinterfaceUserPasswordMinLength: 4 WebinterfaceUserHashAlgorithm: bcrypt WebinterfaceUserHashCost: 10 WebinterfaceUserStatus: active WebinterfaceUserPending: none WebinterfaceUserHome: / -WebinterfaceUserFile: user.ini -WebinterfaceNewFile: page-new-(.*).txt -WebinterfaceMetaFilePrefix: published 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.6 +LanguageVersion: 0.6.7 BlogBy: von BlogFilter: Blog: @@ -51,28 +51,45 @@ WebinterfaceSignupStatusNext: Benutzerkonto wird erstellt, bitte überprüfe dei WebinterfaceRecoverTitle: Kennwort vergessen WebinterfaceRecoverEmail: E-Mail: WebinterfaceRecoverPassword: Kennwort: -WebinterfaceRecoverButton: Absenden WebinterfaceRecoverStatusNone: Kein Problem, du kannst ein neues Kennwort erstellen. WebinterfaceRecoverStatusInvalid: Bitte eine gültige E-Mail angeben. WebinterfaceRecoverStatusPassword: Bitte ein neues Kennwort angeben. WebinterfaceRecoverStatusWeak: Bitte eine anderes Kennwort angeben. WebinterfaceRecoverStatusNext: Benutzerkonto wird wiederhergestellt, bitte überprüfe deine E-Mails. +WebinterfaceSettingsTitle: Einstellungen +WebinterfaceSettingsStatusInvalid: Bitte eine gültige E-Mail angeben. +WebinterfaceSettingsStatusExists: Bitte eine andere E-Mail angeben. +WebinterfaceSettingsStatusWeak: Bitte eine anderes Kennwort angeben. +WebinterfaceSettingsStatusNext: Benutzerkonto wird geändert, bitte überprüfe deine E-Mails. WebinterfaceConfirmSubject: Benutzerkonto bestätigen WebinterfaceConfirmMessage: Hallo @usershort, bitte bestätige dein Benutzerkonto. Klicke auf den folgenden Link. -WebinterfaceConfirmStatusDone: Benutzerkonto wurde bestätigt. Vielen Dank! -WebinterfaceConfirmStatusExpire: Benutzerkonto kann nicht bestätigt werden. Link ist abgelaufen! +WebinterfaceConfirmStatusDone: Benutzerkonto wurde bestätigt und wartet auf Genehmigung. Vielen Dank! +WebinterfaceConfirmStatusExpired: Benutzerkonto kann nicht bestätigt werden. Link ist abgelaufen! WebinterfaceApproveSubject: Benutzerkonto genehmigen WebinterfaceApproveMessage: Hallo @usershort, bitte genehmige ein neues Benutzerkonto für @useraccount. Klicke auf den folgenden Link. WebinterfaceApproveStatusDone: Benutzerkonto wurde genehmigt. Vielen Dank! -WebinterfaceApproveStatusExpire: Benutzerkonto kann nicht genehmigt werden. Link ist abgelaufen! +WebinterfaceApproveStatusExpired: Benutzerkonto kann nicht genehmigt werden. Link ist abgelaufen! WebinterfaceRecoverSubject: Benutzerkonto wiederherstellen WebinterfaceRecoverMessage: Hallo @usershort, bitte bestätige dass du dein Kennwort vergessen hast. Klicke auf den folgenden Link. WebinterfaceRecoverStatusDone: Benutzerkonto wurde wiederhergestellt. Vielen Dank! -WebinterfaceRecoverStatusExpire: Benutzerkonto kann nicht wiederhergestellt werden. Link ist abgelaufen! +WebinterfaceRecoverStatusExpired: Benutzerkonto kann nicht wiederhergestellt werden. Link ist abgelaufen! +WebinterfaceReconfirmSubject: Benutzerkonto ändern +WebinterfaceReconfirmMessage: Hallo @usershort, bitte bestätige eine neue E-Mail für dein Benutzerkonto. Klicke auf den folgenden Link. +WebinterfaceReconfirmStatusDone: Benutzerkonto wurde bestätigt. Vielen Dank! +WebinterfaceReconfirmStatusExpired: Benutzerkonto kann nicht bestätigt werden. Link ist abgelaufen! +WebinterfaceChangeSubject: Benutzerkonto ändern +WebinterfaceChangeMessage: Hallo @usershort, bitte bestätige dass du dein Benutzerkonto ändern möchtest. Klicke auf den folgenden Link. +WebinterfaceChangeStatusDone: Benutzerkonto wurde geändert. Vielen Dank! +WebinterfaceChangeStatusExpired: Benutzerkonto kann nicht geändert werden. Link ist abgelaufen! 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 geändert. Viel Spass beim Bearbeiten der Webseite. +WebinterfaceInformationMessage: Hallo @usershort, dein Benutzerkonto wurde geändert. Du kannst dich jetzt anmelden. +WebinterfaceUpdateTitle: Aktualisierung +WebinterfaceUpdateCheck: Nach Aktualisierung suchen +WebinterfaceUpdateStatusNone: Nach Aktualisierung suchen… +WebinterfaceUpdateStatusEmpty: Keine Aktualisierung verfügbar. +WebinterfaceUpdateButton: Aktualisieren WebinterfaceOkButton: Ok WebinterfaceCancelButton: Abbruch WebinterfaceCreateButton: Erzeugen @@ -81,12 +98,9 @@ WebinterfaceDeleteButton: Löschen WebinterfaceEdit: Seite ändern WebinterfaceCreate: + WebinterfaceDelete: - -WebinterfaceCreateTitle: Neue Seite +WebinterfaceCreateTitle: Seite erzeugen 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.6 +LanguageVersion: 0.6.7 BlogBy: by BlogFilter: Blog: @@ -51,28 +51,45 @@ WebinterfaceSignupStatusNext: User account will be created, please check your em WebinterfaceRecoverTitle: Forgot your password WebinterfaceRecoverEmail: Email: WebinterfaceRecoverPassword: Password: -WebinterfaceRecoverButton: Send WebinterfaceRecoverStatusNone: No problem, you can create a new password. WebinterfaceRecoverStatusInvalid: Please enter a valid email. WebinterfaceRecoverStatusPassword: Please enter a new password. WebinterfaceRecoverStatusWeak: Please enter a different password. WebinterfaceRecoverStatusNext: User account will be recovered, please check your emails. +WebinterfaceSettingsTitle: Settings +WebinterfaceSettingsStatusInvalid: Please enter a valid email. +WebinterfaceSettingsStatusExists: Please enter a different email. +WebinterfaceSettingsStatusWeak: Please enter a different password. +WebinterfaceSettingsStatusNext: User account will be changed, please check your emails. WebinterfaceConfirmSubject: Confirm user account WebinterfaceConfirmMessage: Hi @usershort, please confirm your user account. Click the following link. -WebinterfaceConfirmStatusDone: User account confirmed. Thank you! -WebinterfaceConfirmStatusExpire: User account can not be confirmed. Link has expired! +WebinterfaceConfirmStatusDone: User account confirmed and waiting for approval. Thank you! +WebinterfaceConfirmStatusExpired: User account can not be confirmed. Link has expired! WebinterfaceApproveSubject: Approve user account WebinterfaceApproveMessage: Hi @usershort, please approve a new user account for @useraccount. Click the following link. WebinterfaceApproveStatusDone: User account approved. Thank you! -WebinterfaceApproveStatusExpire: User account can not be approved. Link has expired! +WebinterfaceApproveStatusExpired: User account can not be approved. Link has expired! WebinterfaceRecoverSubject: Recover user account WebinterfaceRecoverMessage: Hi @usershort, please confirm that you forgot your password. Click the following link. WebinterfaceRecoverStatusDone: User account recovered. Thank you! -WebinterfaceRecoverStatusExpire: User account can not be recovered. Link has expired! +WebinterfaceRecoverStatusExpired: User account can not be recovered. Link has expired! +WebinterfaceReconfirmSubject: Change user account +WebinterfaceReconfirmMessage: Hi @usershort, please confirm a new email for your user account. Click the following link. +WebinterfaceReconfirmStatusDone: User account confirmed. Thank you! +WebinterfaceReconfirmStatusExpired: User account can not be confirmed. Link has expired! +WebinterfaceChangeSubject: Change user account +WebinterfaceChangeMessage: Hi @usershort, please confirm that you want to change your user account. Click the following link. +WebinterfaceChangeStatusDone: User account changed. Thank you! +WebinterfaceChangeStatusExpired: User account can not be changed. Link has expired! 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 changed. Have fun editing the website. +WebinterfaceInformationMessage: Hi @usershort, your user account has been changed. You can now log in. +WebinterfaceUpdateTitle: Updates +WebinterfaceUpdateCheck: Check for updates +WebinterfaceUpdateStatusNone: Checking for updates… +WebinterfaceUpdateStatusEmpty: No updates available. +WebinterfaceUpdateButton: Update WebinterfaceOkButton: Ok WebinterfaceCancelButton: Cancel WebinterfaceCreateButton: Create @@ -81,12 +98,9 @@ WebinterfaceDeleteButton: Delete WebinterfaceEdit: Edit page WebinterfaceCreate: + WebinterfaceDelete: - -WebinterfaceCreateTitle: New page +WebinterfaceCreateTitle: Create 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.6 +LanguageVersion: 0.6.7 BlogBy: par BlogFilter: Blog: @@ -51,28 +51,45 @@ WebinterfaceSignupStatusNext: Votre compte a été créé, vérifiez vos emails. WebinterfaceRecoverTitle: Mot de passe oublié WebinterfaceRecoverEmail: Email: WebinterfaceRecoverPassword: Mot de passe: -WebinterfaceRecoverButton: Envoyer WebinterfaceRecoverStatusNone: Pas de problème, vous pouvez créer un nouveau mot de passe. WebinterfaceRecoverStatusInvalid: S'il vous plaît, veuillez entrer une adresse email valide. WebinterfaceRecoverStatusPassword: S'il vous plaît, choisissez un nouveau mot de passe. WebinterfaceRecoverStatusWeak: S'il vous plaît, choisissez un mot de passe différent. WebinterfaceRecoverStatusNext: Votre compte est à nouveau disponible, vérifiez vos emails. -WebinterfaceConfirmSubject: Création d'un compte utilisateur. -WebinterfaceConfirmMessage: Bonjour @usershort, veuillez confirmer la création de votre compte utilisateur. Cliquez sur le lien suivant. -WebinterfaceConfirmStatusDone: Votre compte utilisateur est confirmé. Merci! -WebinterfaceConfirmStatusExpire: Votre compte utilisateur ne peut pas être créé. Le lien de confirmation a expiré! -WebinterfaceApproveSubject: Approuver un nouvel utilisateur. +WebinterfaceSettingsTitle: Paramètres +WebinterfaceSettingsStatusInvalid: S'il vous plaît, veuillez entrer une adresse email valide. +WebinterfaceSettingsStatusExists: S'il vous plaît, veuillez entrer une adresse email différent. +WebinterfaceSettingsStatusWeak: S'il vous plaît, choisissez un mot de passe différent. +WebinterfaceSettingsStatusNext: Votre compte a été changé, vérifiez vos emails. +WebinterfaceConfirmSubject: Confirmation d'un compte utilisateur +WebinterfaceConfirmMessage: Bonjour @usershort, veuillez confirmer votre compte utilisateur. Cliquez sur le lien suivant. +WebinterfaceConfirmStatusDone: Votre compte utilisateur est confirmé et en attente d'approbation. Merci! +WebinterfaceConfirmStatusExpired: Le compte ne peut pas être créé. Le lien de confirmation a expiré! +WebinterfaceApproveSubject: Approuver un nouvel utilisateur WebinterfaceApproveMessage: Bonjour @usershort, veuillez approuver la création d'un nouveau compte utilisateur pour @useraccount. Cliquez sur le lien suivant. WebinterfaceApproveStatusDone: Compte utilisateur approuvé. Merci! -WebinterfaceApproveStatusExpire: Le compte ne peut pas être approuvé. Le lien de confirmation a expiré! -WebinterfaceRecoverSubject: Restauration d'un compte utilisateur. +WebinterfaceApproveStatusExpired: Le compte ne peut pas être approuvé. Le lien de confirmation a expiré! +WebinterfaceRecoverSubject: Restauration d'un compte utilisateur WebinterfaceRecoverMessage: Bonjour @usershort, veuillez confirmer que vous avez oublié votre mot de passe. Cliquez sur le lien suivant. WebinterfaceRecoverStatusDone: Compte utilisateur restauré. Merci! -WebinterfaceRecoverStatusExpire: Le compte ne peut pas être restauré. Le lien de confirmation a expiré! +WebinterfaceRecoverStatusExpired: Le compte ne peut pas être restauré. Le lien de confirmation a expiré! +WebinterfaceReconfirmSubject: Changement d'un compte utilisateur +WebinterfaceReconfirmMessage: Bonjour @usershort, veuillez confirmer une nouvelle adresse email pour votre compte utilisateur. Cliquez sur le lien suivant. +WebinterfaceReconfirmStatusDone: Votre compte utilisateur est confirmé. Merci! +WebinterfaceReconfirmStatusExpired: Le compte ne peut pas être créé. Le lien de confirmation a expiré! +WebinterfaceChangeSubject: Changement d'un compte utilisateur +WebinterfaceChangeMessage: Bonjour @usershort, veuillez confirmer que vous souhaitez modifier votre compte utilisateur. Cliquez sur le lien suivant. +WebinterfaceChangeStatusDone: Compte utilisateur changé. Merci! +WebinterfaceChangeStatusExpired: Le compte ne peut pas être changé. Le lien de confirmation a expiré! 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é changé. Amusez-vous bien en éditant le site web. +WebinterfaceInformationMessage: Bonjour @usershort, votre compte utilisateur a bien été changé. Vous pouvez maintenant vous connecter. +WebinterfaceUpdateTitle: Mises à jour +WebinterfaceUpdateCheck: Vérifier les mises à jour +WebinterfaceUpdateStatusNone: Vérification des mises à jour… +WebinterfaceUpdateStatusEmpty: Aucune mise à jour disponible. +WebinterfaceUpdateButton: Mettre à jour WebinterfaceOkButton: Ok WebinterfaceCancelButton: Annuler WebinterfaceCreateButton: Créer @@ -81,12 +98,9 @@ WebinterfaceDeleteButton: Supprimer WebinterfaceEdit: Éditer page WebinterfaceCreate: + WebinterfaceDelete: - -WebinterfaceCreateTitle: Nouvelle page +WebinterfaceCreateTitle: Créer 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.6"; + const VERSION = "0.6.7"; var $yellow; //access to API // Handle initialisation diff --git a/system/plugins/update.php b/system/plugins/update.php @@ -5,7 +5,7 @@ // Update plugin class YellowUpdate { - const VERSION = "0.6.6"; + const VERSION = "0.6.7"; var $yellow; //access to API // Handle initialisation @@ -284,12 +284,10 @@ class YellowUpdate $statusCode = 0; if($this->isContentFile($fileName)) { - $fileName = $this->yellow->lookup->findFileNew($fileName, - $this->yellow->config->get("webinterfaceNewFile"), $this->yellow->config->get("configDir"), "installation"); $this->yellow->pages->pages["root/"] = array(); $this->yellow->page = new YellowPage($this->yellow); $this->yellow->page->setRequestInformation($serverScheme, $serverName, $base, $location, $fileName); - $this->yellow->page->parseData($this->getRawDataInstallation($fileName, $this->yellow->getRequestLanguage()), false, 404); + $this->yellow->page->parseData($this->getRawDataInstallation($this->yellow->getRequestLanguage()), false, 404); $this->yellow->page->parserSafeMode = false; $this->yellow->page->parseContent(); $name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"])); @@ -346,8 +344,9 @@ class YellowUpdate } // Return raw data for installation page - function getRawDataInstallation($fileName, $language) + function getRawDataInstallation($language) { + $fileName = strreplaceu("(.*)", "installation", $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceNewFile")); $rawData = $this->yellow->toolbox->readFile($fileName); if(empty($rawData)) { diff --git a/system/plugins/webinterface.css b/system/plugins/webinterface.css @@ -1,4 +1,4 @@ -/* Yellow web interface 0.6.10 */ +/* Yellow web interface 0.6.11 */ .yellow-bar { position:relative; overflow:hidden; height:2em; margin-bottom:10px; } .yellow-bar-left { display:block; float:left; } @@ -20,7 +20,7 @@ .yellow-pane p { margin:0.5em; } .yellow-pane ul { list-style:none; margin:0 0.5em; padding:0; } .yellow-pane div { overflow:hidden; } -.yellow-close { display:block; float:right; padding:0 0.5em; color:#bbb; } +.yellow-close { display:block; float:right; padding:0 0.5em; color:#bbb; font-size:1.1em; } .yellow-close:hover { text-decoration:none; color:#000; } .yellow-arrow { position:absolute; top:0; left:0; } .yellow-arrow:after, .yellow-arrow:before { @@ -70,18 +70,6 @@ text-decoration:none; } .yellow-btn:active { box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.1); } -.yellow-btn-create { - background-color:#3cc335; color:#ffffff; - background-image:linear-gradient(to bottom, #5fee5b, #36bd2f); - border-color:#31b121 #31b121 #20b020; -} -.yellow-btn-create:hover, .yellow-btn-create:focus, .yellow-btn-create:active { color:#ffffff; } -.yellow-btn-edit { - background-color:#3cc335; color:#ffffff; - background-image:linear-gradient(to bottom, #5fee5b, #36bd2f); - border-color:#31b121 #31b121 #20b020; -} -.yellow-btn-edit:hover, .yellow-btn-edit:focus, .yellow-btn-edit:active { color:#ffffff; } .yellow-btn-delete { background-color:#c33c35; color:#ffffff; background-image:linear-gradient(to bottom, #ee5f5b, #bd362f); diff --git a/system/plugins/webinterface.js b/system/plugins/webinterface.js @@ -4,7 +4,7 @@ // Yellow API var yellow = { - version: "0.6.10", + version: "0.6.11", action: function(action) { yellow.webinterface.action(action, "none"); }, onLoad: function() { yellow.webinterface.loadInterface(); }, onClick: function(e) { yellow.webinterface.hidePanesOnClick(yellow.toolbox.getEventElement(e)); }, @@ -34,6 +34,8 @@ yellow.webinterface = case "approve": this.showPane("yellow-pane-signup", action, status); break; case "recover": this.showPane("yellow-pane-recover", action, status); break; case "settings": this.showPane("yellow-pane-settings", action, status); break; + case "reconfirm": this.showPane("yellow-pane-settings", action, status); break; + case "change": this.showPane("yellow-pane-settings", action, status); break; case "create": this.showPane("yellow-pane-edit", action, status, true); break; case "edit": this.showPane("yellow-pane-edit", action, status, true); break; case "delete": this.showPane("yellow-pane-edit", action, status, true); break; @@ -174,7 +176,8 @@ yellow.webinterface = "<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=\""+yellow.toolbox.encodeHtml(this.getRequest("name"))+"\" /></p>"+ - this.getLanguages(paneId)+ + "<p><label for=\"yellow-pane-settings-email\">"+this.getText("SignupEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"yellow-pane-settings-email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("email"))+"\" /></p>"+ + "<p><label for=\"yellow-pane-settings-password\">"+this.getText("SignupPassword")+"</label><br /><input class=\"yellow-form-control\" type=\"password\" name=\"password\" id=\"yellow-pane-settings-password\" maxlength=\"64\" value=\"\" /></p>"+this.getLanguages(paneId)+ "<p><input class=\"yellow-btn\" type=\"submit\" value=\""+this.getText("OkButton")+"\" /></p>"+ "</div>"+ "<div id=\"yellow-pane-settings-buttons\">"+ @@ -185,11 +188,11 @@ yellow.webinterface = case "yellow-pane-edit": elementDiv.innerHTML = "<form method=\"post\">"+ + "<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+ "<h1 id=\"yellow-pane-edit-title\">"+this.getText("Edit")+"</h1>"+ "<textarea id=\"yellow-pane-edit-page\" class=\"yellow-form-control\" name=\"rawdataedit\"></textarea>"+ "<div id=\"yellow-pane-edit-buttons\">"+ "<input id=\"yellow-pane-edit-send\" class=\"yellow-btn\" type=\"button\" onclick=\"yellow.action('send'); return false;\" value=\""+this.getText("EditButton")+"\" />"+ - "<input id=\"yellow-pane-edit-close\" class=\"yellow-btn\" type=\"button\" onclick=\"yellow.action('close'); return false;\" value=\""+this.getText("CancelButton")+"\" />"+ "<a href=\""+this.getText("MarkdownHelpUrl", "yellow")+"\" target=\"_blank\" id=\"yellow-pane-edit-help\">"+this.getText("MarkdownHelp")+"</a>" + "</div>"+ "</form>"; @@ -211,48 +214,41 @@ yellow.webinterface = updatePane: function(paneId, paneAction, paneStatus, init) { if(yellow.config.debug) console.log("yellow.webinterface.updatePane id:"+paneId); + var showFields = paneStatus!="next" && paneStatus!="done" && paneStatus!="expired"; switch(paneId) { case "yellow-pane-login": - if(!yellow.config.loginButtons) + if(yellow.config.loginRestrictions) { - document.getElementById("yellow-pane-login-buttons").style.display = "none"; + yellow.toolbox.setVisible(document.getElementById("yellow-pane-login-buttons"), false); } break; case "yellow-pane-signup": - if(paneStatus=="next" || paneStatus=="done" || paneStatus=="expire") - { - document.getElementById("yellow-pane-signup-fields").style.display = "none"; - } else { - document.getElementById("yellow-pane-signup-buttons").style.display = "none"; - } + yellow.toolbox.setVisible(document.getElementById("yellow-pane-signup-fields"), showFields); + yellow.toolbox.setVisible(document.getElementById("yellow-pane-signup-buttons"), !showFields); break; case "yellow-pane-recover": - if(paneStatus=="next" || paneStatus=="done" || paneStatus=="expire") + yellow.toolbox.setVisible(document.getElementById("yellow-pane-recover-fields-first"), showFields); + yellow.toolbox.setVisible(document.getElementById("yellow-pane-recover-fields-second"), showFields); + yellow.toolbox.setVisible(document.getElementById("yellow-pane-recover-buttons"), !showFields); + if(showFields) { - 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"; + yellow.toolbox.setVisible(document.getElementById("yellow-pane-recover-fields-first"), false); } else { - document.getElementById("yellow-pane-recover-fields-second").style.display = "none"; + yellow.toolbox.setVisible(document.getElementById("yellow-pane-recover-fields-second"), false); } } break; case "yellow-pane-settings": - if(paneStatus=="next" || paneStatus=="done" || paneStatus=="expire") - { - document.getElementById("yellow-pane-settings-fields").style.display = "none"; - } else { - document.getElementById("yellow-pane-settings-buttons").style.display = "none"; - } + yellow.toolbox.setVisible(document.getElementById("yellow-pane-settings-fields"), showFields); + yellow.toolbox.setVisible(document.getElementById("yellow-pane-settings-buttons"), !showFields); if(paneStatus=="none") { document.getElementById("yellow-pane-settings-status").innerHTML = yellow.toolbox.encodeHtml(yellow.config.serverVersion); document.getElementById("yellow-pane-settings-name").value = yellow.config.userName; + document.getElementById("yellow-pane-settings-email").value = yellow.config.userEmail; document.getElementById("yellow-pane-settings-"+yellow.config.userLanguage).checked = true; } break; @@ -271,20 +267,17 @@ yellow.webinterface = yellow.toolbox.setCursorPosition(document.getElementById("yellow-pane-edit-page"), 0); } paneAction = this.getPaneAction(paneId, paneAction); - if(paneAction) + var key, className, readOnly; + switch(paneAction) { - var key, className; - switch(paneAction) - { - 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"; + case "create": key = "CreateButton"; className = "yellow-btn yellow-btn-create"; readOnly = false; break; + case "edit": key = "EditButton"; className = "yellow-btn yellow-btn-edit"; readOnly = false; break; + case "delete": key = "DeleteButton"; className = "yellow-btn yellow-btn-delete"; readOnly = false; break; + case "": key = "CancelButton"; className = "yellow-btn yellow-btn-cancel"; readOnly = true; break; } + document.getElementById("yellow-pane-edit-send").value = this.getText(key); + document.getElementById("yellow-pane-edit-send").className = className; + document.getElementById("yellow-pane-edit-page").readOnly = readOnly; break; } }, @@ -342,7 +335,7 @@ yellow.webinterface = if(!yellow.toolbox.isVisible(element)) { if(yellow.config.debug) console.log("yellow.webinterface.showPane id:"+paneId); - element.style.display = "block"; + yellow.toolbox.setVisible(element, true); if(modal) { yellow.toolbox.addClass(document.body, "yellow-body-modal-open"); @@ -368,7 +361,7 @@ yellow.webinterface = 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"; + yellow.toolbox.setVisible(element, false); this.paneId = 0; this.paneAction = 0; this.paneStatus = 0; @@ -451,7 +444,7 @@ yellow.webinterface = getLanguages: function(paneId) { var languages = ""; - if(yellow.toolbox.getLength(yellow.config.serverLanguages)>1) + if(yellow.config.serverLanguages && yellow.toolbox.getLength(yellow.config.serverLanguages)>1) { languages += "<p>"; for(var language in yellow.config.serverLanguages) @@ -559,7 +552,7 @@ yellow.toolbox = return Object.keys ? Object.keys(element).length : 0; }, - // Set element width/height in pixel, including padding and border + // Set element width in pixel, including padding and border setOuterWidth: function(element, width, maxWidth) { width -= this.getBoxSize(element).width; @@ -571,6 +564,7 @@ yellow.toolbox = } }, + // Set element height in pixel, including padding and border setOuterHeight: function(element, height, maxHeight) { height -= this.getBoxSize(element).height; @@ -582,7 +576,7 @@ yellow.toolbox = } }, - // Return element width/height in pixel, including padding and border + // Return element width in pixel, including padding and border getOuterWidth: function(element, includeMargin) { var width = element.offsetWidth; @@ -590,6 +584,7 @@ yellow.toolbox = return width; }, + // Return element height in pixel, including padding and border getOuterHeight: function(element, includeMargin) { var height = element.offsetHeight; @@ -597,18 +592,19 @@ yellow.toolbox = return height; }, - // Return element width/height in pixel + // Return element width in pixel getWidth: function(element) { return element.offsetWidth - this.getBoxSize(element).width; }, + // Return element height in pixel getHeight: function(element) { return element.offsetHeight - this.getBoxSize(element).height; }, - // Set element top/left position in pixel + // Set element top position in pixel setOuterTop: function(element, top, marginTop) { if(marginTop) @@ -619,6 +615,7 @@ yellow.toolbox = } }, + // Set element left position in pixel setOuterLeft: function(element, left, marginLeft) { if(marginLeft) @@ -629,25 +626,27 @@ yellow.toolbox = } }, - // Return element top/left position in pixel + // Return element top position in pixel getOuterTop: function(element) { var top = element.getBoundingClientRect().top; return top + (window.pageYOffset || document.documentElement.scrollTop); }, + // Return element left position in pixel getOuterLeft: function(element) { var left = element.getBoundingClientRect().left; return left + (window.pageXOffset || document.documentElement.scrollLeft); }, - // Return window width/height in pixel + // Return window width in pixel getWindowWidth: function() { return window.innerWidth || document.documentElement.clientWidth; }, + // Return window height in pixel getWindowHeight: function() { return window.innerHeight || document.documentElement.clientHeight; @@ -726,6 +725,12 @@ yellow.toolbox = return pos; }, + // Set element visibility + setVisible: function(element, show) + { + element.style.display = show ? "block" : "none"; + }, + // Check if element exists and is visible isVisible: function(element) { diff --git a/system/plugins/webinterface.php b/system/plugins/webinterface.php @@ -5,37 +5,31 @@ // Web interface plugin class YellowWebinterface { - const VERSION = "0.6.10"; - var $yellow; //access to API - var $active; //web interface is active? (boolean) - 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 - var $rawDataEdit; //raw data of page for editing + const VERSION = "0.6.11"; + var $yellow; //access to API + var $response; //web interface response + var $users; //web interface users + var $merge; //web interface merge // Handle initialisation function onLoad($yellow) { $this->yellow = $yellow; + $this->response = new YellowResponse($yellow); $this->users = new YellowUsers($yellow); $this->merge = new YellowMerge($yellow); $this->yellow->config->setDefault("webinterfaceServerScheme", $this->yellow->config->get("serverScheme")); $this->yellow->config->setDefault("webinterfaceServerName", $this->yellow->config->get("serverName")); $this->yellow->config->setDefault("webinterfaceLocation", "/edit/"); + $this->yellow->config->setDefault("webinterfaceNewFile", "page-new-(.*).txt"); + $this->yellow->config->setDefault("webinterfaceMetaFilePrefix", "published"); + $this->yellow->config->setDefault("webinterfaceUserFile", "user.ini"); $this->yellow->config->setDefault("webinterfaceUserPasswordMinLength", "4"); $this->yellow->config->setDefault("webinterfaceUserHashAlgorithm", "bcrypt"); $this->yellow->config->setDefault("webinterfaceUserHashCost", "10"); $this->yellow->config->setDefault("webinterfaceUserStatus", "active"); $this->yellow->config->setDefault("webinterfaceUserPending", "none"); $this->yellow->config->setDefault("webinterfaceUserHome", "/"); - $this->yellow->config->setDefault("webinterfaceUserFile", "user.ini"); - $this->yellow->config->setDefault("webinterfaceNewFile", "page-new-(.*).txt"); - $this->yellow->config->setDefault("webinterfaceMetaFilePrefix", "published"); $this->users->load($this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile")); } @@ -45,7 +39,11 @@ class YellowWebinterface $statusCode = 0; if($this->checkRequest($location)) { - list($serverScheme, $serverName, $base, $location, $fileName) = $this->updateRequestInformation(); + $serverScheme = $this->yellow->config->get("webinterfaceServerScheme"); + $serverName = $this->yellow->config->get("webinterfaceServerName"); + $base = rtrim($this->yellow->config->get("serverBase").$this->yellow->config->get("webinterfaceLocation"), '/'); + list($serverScheme, $serverName, $base, $location, $fileName) = $this->yellow->getRequestInformation($serverScheme, $serverName, $base); + $this->yellow->page->setRequestInformation($serverScheme, $serverName, $base, $location, $fileName); $statusCode = $this->processRequest($serverScheme, $serverName, $base, $location, $fileName); } return $statusCode; @@ -54,18 +52,18 @@ class YellowWebinterface // Handle page meta data parsing function onParseMeta($page) { - if($this->isActive() && $page==$this->yellow->page) + if($page==$this->yellow->page && $this->response->isActive()) { - if($this->isUser()) + if($this->response->isUser()) { - if(empty($this->rawDataSource)) $this->rawDataSource = $page->rawData; - if(empty($this->rawDataEdit)) $this->rawDataEdit = $page->rawData; - if($page->statusCode==424) $this->rawDataEdit = $this->getRawDataNew($page->location); + if(empty($this->response->rawDataSource)) $this->response->rawDataSource = $page->rawData; + if(empty($this->response->rawDataEdit)) $this->response->rawDataEdit = $page->rawData; + if($page->statusCode==424) $this->response->rawDataEdit = $this->response->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"; + if(empty($this->response->language)) $this->response->language = $page->get("language"); + if(empty($this->response->action)) $this->response->action = $this->response->isUser() ? "none" : "login"; + if(empty($this->response->status)) $this->response->status = "none"; + if($this->response->status=="error") $this->response->action = "error"; } } @@ -86,16 +84,16 @@ class YellowWebinterface function onExtra($name) { $output = null; - if($this->isActive() && $name=="header") + if($name=="header" && $this->response->isActive()) { $location = $this->yellow->config->get("serverBase").$this->yellow->config->get("pluginLocation")."webinterface"; $output = "<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"".htmlspecialchars($location).".css\" />\n"; $output .= "<script type=\"text/javascript\" src=\"".htmlspecialchars($location).".js\"></script>\n"; $output .= "<script type=\"text/javascript\">\n"; $output .= "// <![CDATA[\n"; - $output .= "yellow.page = ".json_encode($this->getPageData()).";\n"; - $output .= "yellow.config = ".json_encode($this->getConfigData()).";\n"; - $output .= "yellow.text = ".json_encode($this->getTextData()).";\n"; + $output .= "yellow.page = ".json_encode($this->response->getPageData()).";\n"; + $output .= "yellow.config = ".json_encode($this->response->getConfigData()).";\n"; + $output .= "yellow.text = ".json_encode($this->response->getTextData()).";\n"; $output .= "// ]]>\n"; $output .= "</script>\n"; } @@ -166,7 +164,7 @@ class YellowWebinterface echo ($userExisting ? "updated" : "created")."\n"; } else { $statusCode = 200; - foreach($this->getUserData() as $line) echo "$line\n"; + foreach($this->users->getData() as $line) echo "$line\n"; if(!$this->users->getNumber()) echo "Yellow $command: No user accounts\n"; } return $statusCode; @@ -188,6 +186,8 @@ class YellowWebinterface 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 "reconfirm": $statusCode = $this->processRequestReconfirm($serverScheme, $serverName, $base, $location, $fileName); break; + case "change": $statusCode = $this->processRequestChange($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; @@ -199,12 +199,14 @@ 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 "reconfirm": $statusCode = $this->processRequestReconfirm($serverScheme, $serverName, $base, $location, $fileName); break; + case "change": $statusCode = $this->processRequestChange($serverScheme, $serverName, $base, $location, $fileName); break; } } if($statusCode==0) { $statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false); - if($this->action=="fail") $this->yellow->page->error(500, "Login failed, [please log in](javascript:yellow.action('login');)!"); + if($this->response->action=="fail") $this->yellow->page->error(500, "Login failed, [please log in](javascript:yellow.action('login');)!"); } return $statusCode; } @@ -224,7 +226,7 @@ class YellowWebinterface $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location); $this->yellow->sendStatus($statusCode, $location); } else { - $statusCode = $this->userRestrictions ? 404 : 424; + $statusCode = $this->response->isUserRestrictions() ? 404 : 424; $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false); $this->yellow->page->error($statusCode); } @@ -236,7 +238,7 @@ class YellowWebinterface function processRequestLogin($serverScheme, $serverName, $base, $location, $fileName) { $statusCode = 0; - $home = $this->users->getHome($this->userEmail); + $home = $this->users->getHome($this->response->userEmail); if(substru($location, 0, strlenu($home))==$home) { $statusCode = 303; @@ -254,7 +256,7 @@ class YellowWebinterface function processRequestLogout($serverScheme, $serverName, $base, $location, $fileName) { $statusCode = 302; - $this->userEmail = ""; + $this->response->userEmail = ""; $this->users->destroyCookie("login"); $location = $this->yellow->lookup->normaliseUrl( $this->yellow->config->get("serverScheme"), @@ -267,25 +269,25 @@ class YellowWebinterface // Process request for user signup function processRequestSignup($serverScheme, $serverName, $base, $location, $fileName) { - $this->action = "signup"; - $this->status = "ok"; + $this->response->action = "signup"; + $this->response->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->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") + if(empty($name) || empty($email) || empty($password)) $this->response->status = "incomplete"; + if($this->response->status=="ok") $this->response->status = $this->getUserAccount($email, $password, $this->response->action); + if($this->response->status=="ok" && $this->response->isLoginRestrictions()) $this->response->status = "next"; + if($this->response->status=="ok" && $this->users->isExisting($email)) $this->response->status = "next"; + if($this->response->status=="ok") { $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); - $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'!"); + $this->response->status = $this->users->update($fileNameUser, $email, $password, $name, "", "unconfirmed") ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); } - if($this->status=="ok") + if($this->response->status=="ok") { - $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!"); + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $email, "confirm") ? "next" : "error"; + if($this->response->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; @@ -294,20 +296,20 @@ class YellowWebinterface // Process request to confirm user signup function processRequestConfirm($serverScheme, $serverName, $base, $location, $fileName) { - $this->action = "confirm"; - $this->status = "ok"; + $this->response->action = "confirm"; + $this->response->status = "ok"; $email = $_REQUEST["email"]; - $this->status = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); - if($this->status=="ok") + $this->response->status = $this->users->getResponseStatus($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); + if($this->response->status=="ok") { $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); - $this->status = $this->users->update($fileNameUser, $email, "", "", "", "unapproved") ? "ok" : "error"; - if($this->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + $this->response->status = $this->users->update($fileNameUser, $email, "", "", "", "unapproved") ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); } - if($this->status=="ok") + if($this->response->status=="ok") { - $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!"); + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $email, "approve") ? "done" : "error"; + if($this->response->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; @@ -316,20 +318,20 @@ class YellowWebinterface // Process request to approve user signup function processRequestApprove($serverScheme, $serverName, $base, $location, $fileName) { - $this->action = "approve"; - $this->status = "ok"; + $this->response->action = "approve"; + $this->response->status = "ok"; $email = $_REQUEST["email"]; - $this->status = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); - if($this->status=="ok") + $this->response->status = $this->users->getResponseStatus($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); + if($this->response->status=="ok") { $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); - $this->status = $this->users->update($fileNameUser, $email, "", "", "", "active") ? "ok" : "error"; - if($this->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + $this->response->status = $this->users->update($fileNameUser, $email, "", "", "", "active") ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); } - if($this->status=="ok") + if($this->response->status=="ok") { - $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!"); + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $email, "welcome") ? "done" : "error"; + if($this->response->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; @@ -338,59 +340,89 @@ class YellowWebinterface // Process request to recover password function processRequestRecover($serverScheme, $serverName, $base, $location, $fileName) { - $this->action = "recover"; - $this->status = "ok"; + $this->response->action = "recover"; + $this->response->status = "ok"; $email = trim($_REQUEST["email"]); $password = trim($_REQUEST["password"]); if(empty($_REQUEST["id"])) { - 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") + if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $this->response->status = "invalid"; + if($this->response->status=="ok" && $this->response->isLoginRestrictions()) $this->response->status = "next"; + if($this->response->status=="ok" && !$this->users->isExisting($email)) $this->response->status = "next"; + if($this->response->status=="ok") { - $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!"); + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $email, "recover") ? "next" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't send email on this server!"); } } else { - $this->status = $this->getUserRequest($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); - if($this->status=="ok") + $this->response->status = $this->users->getResponseStatus($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); + if($this->response->status=="ok") { - if(empty($password)) $this->status = "password"; - if($this->status=="ok") $this->status = $this->getUserAccount($email, $password, $this->action); - if($this->status=="ok") + if(empty($password)) $this->response->status = "password"; + if($this->response->status=="ok") $this->response->status = $this->getUserAccount($email, $password, $this->response->action); + if($this->response->status=="ok") { $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); - $this->status = $this->users->update($fileNameUser, $email, $password) ? "ok" : "error"; - if($this->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + $this->response->status = $this->users->update($fileNameUser, $email, $password) ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); } - if($this->status=="ok") + if($this->response->status=="ok") { - $this->userEmail = ""; + $this->response->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!"); + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $email, "information") ? "done" : "error"; + if($this->response->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) { - $this->action = "settings"; - $this->status = "ok"; - if($this->status=="ok") + $this->response->action = "settings"; + $this->response->status = "ok"; + $email = trim($_REQUEST["email"]); + $emailSource = $this->response->userEmail; + $password = trim($_REQUEST["password"]); + $name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"])); + $language = trim($_REQUEST["language"]); + if($email!=$emailSource || !empty($password)) { - $name = trim(preg_replace("/[^\pL\d\-\. ]/u", "-", $_REQUEST["name"])); - $language = trim($_REQUEST["language"]); - $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); - $this->status = $this->users->update($fileNameUser, $this->userEmail, "", $name, $language) ? "done" : "error"; - if($this->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + if(empty($email)) $this->response->status = "invalid"; + if($this->response->status=="ok") $this->response->status = $this->getUserAccount($email, $password, $this->response->action); + if($this->response->status=="ok" && $email!=$emailSource && $this->users->isExisting($email)) $this->response->status = "exists"; + if($this->response->status=="ok" && $email!=$emailSource) + { + $pending = $emailSource; + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $this->response->status = $this->users->update($fileNameUser, $email, "no", $name, $language, "unconfirmed", $pending) ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } + if($this->response->status=="ok") + { + $pending = $email.':'.(empty($password) ? $this->users->getHash($emailSource) : $this->users->createHash($password)); + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $this->response->status = $this->users->update($fileNameUser, $emailSource, "", $name, $language, "", $pending) ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } + if($this->response->status=="ok") + { + $action = $email!=$emailSource ? "reconfirm" : "change"; + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $email, $action) ? "next" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't send email on this server!"); + } + } else { + if($this->response->status=="ok") + { + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $this->response->status = $this->users->update($fileNameUser, $email, "", $name, $language) ? "done" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } } - if($this->status=="done") + if($this->response->status=="done") { $statusCode = 303; $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location); @@ -400,19 +432,84 @@ class YellowWebinterface } return $statusCode; } + + // Process request to reconfirm email + function processRequestReconfirm($serverScheme, $serverName, $base, $location, $fileName) + { + $this->response->action = "reconfirm"; + $this->response->status = "ok"; + $email = $emailSource = $_REQUEST["email"]; + $this->response->status = $this->users->getResponseStatus($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); + if($this->response->status=="ok") + { + $emailSource = $this->users->getPending($email); + if(!$this->users->isExisting($emailSource) || $this->users->getStatus($emailSource)!="active") $this->response->status = "done"; + } + if($this->response->status=="ok") + { + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $this->response->status = $this->users->update($fileNameUser, $email, "", "", "", "unchanged") ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } + if($this->response->status=="ok") + { + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $emailSource, "change") ? "done" : "error"; + if($this->response->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 processRequestChange($serverScheme, $serverName, $base, $location, $fileName) + { + $this->response->action = "change"; + $this->response->status = "ok"; + $email = $emailSource = trim($_REQUEST["email"]); + $this->response->status = $this->users->getResponseStatus($email, $_REQUEST["action"], $_REQUEST["expire"], $_REQUEST["id"]); + if($this->response->status=="ok") + { + list($email, $hash) = explode(':', $this->users->getPending($email), 2); + if(!$this->users->isExisting($email) || empty($hash)) $this->response->status = "done"; + } + if($this->response->status=="ok" && $email!=$emailSource) + { + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $this->users->users[$emailSource]["pending"] = $this->yellow->config->get("webinterfaceUserPending"); + $this->response->status = $this->users->update($fileNameUser, $emailSource, "", "", "", "inactive") ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } + if($this->response->status=="ok") + { + $this->users->users[$email]["hash"] = $hash; + $this->users->users[$email]["pending"] = $this->yellow->config->get("webinterfaceUserPending"); + $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $this->response->status = $this->users->update($fileNameUser, $email, "", "", "", "active") ? "ok" : "error"; + if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); + } + if($this->response->status=="ok") + { + $this->response->userEmail = ""; + $this->users->destroyCookie("login"); + $this->response->status = $this->response->sendMail($serverScheme, $serverName, $base, $email, "information") ? "done" : "error"; + if($this->response->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 create page function processRequestCreate($serverScheme, $serverName, $base, $location, $fileName) { $statusCode = 0; - if(!$this->userRestrictions && !empty($_POST["rawdataedit"])) + if(!$this->response->isUserRestrictions() && !empty($_POST["rawdataedit"])) { - $this->rawDataSource = $this->rawDataEdit = rawurldecode($_POST["rawdatasource"]); - $rawData = $this->normaliseText(rawurldecode($_POST["rawdataedit"])); - $page = $this->getPageNew($serverScheme, $serverName, $base, $location, $fileName, $rawData); + $this->response->rawDataSource = $this->response->rawDataEdit = rawurldecode($_POST["rawdatasource"]); + $rawData = $this->response->normaliseText(rawurldecode($_POST["rawdataedit"])); + $page = $this->response->getPageNew($serverScheme, $serverName, $base, $location, $fileName, $rawData); if(!$page->isError()) { - if($this->yellow->toolbox->createFile($page->fileName, $page->rawData)) + if($this->yellow->toolbox->createFile($page->fileName, $page->rawData, true)) { $statusCode = 303; $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $page->location); @@ -435,12 +532,12 @@ class YellowWebinterface function processRequestEdit($serverScheme, $serverName, $base, $location, $fileName) { $statusCode = 0; - if(!$this->userRestrictions && !empty($_POST["rawdataedit"])) + if(!$this->response->isUserRestrictions() && !empty($_POST["rawdataedit"])) { - $this->rawDataSource = rawurldecode($_POST["rawdatasource"]); - $this->rawDataEdit = $this->normaliseText(rawurldecode($_POST["rawdataedit"])); - $page = $this->getPageUpdate($serverScheme, $serverName, $base, $location, $fileName, - $this->rawDataSource, $this->rawDataEdit, $this->yellow->toolbox->readFile($fileName)); + $this->response->rawDataSource = rawurldecode($_POST["rawdatasource"]); + $this->response->rawDataEdit = $this->response->normaliseText(rawurldecode($_POST["rawdataedit"])); + $page = $this->response->getPageUpdate($serverScheme, $serverName, $base, $location, $fileName, + $this->response->rawDataSource, $this->response->rawDataEdit, $this->yellow->toolbox->readFile($fileName)); if(!$page->isError()) { if($this->yellow->toolbox->renameFile($fileName, $page->fileName) && @@ -467,63 +564,37 @@ class YellowWebinterface function processRequestDelete($serverScheme, $serverName, $base, $location, $fileName) { $statusCode = 0; - if(!$this->userRestrictions) + if(!$this->response->isUserRestrictions() && is_file($fileName)) { - $this->rawDataSource = $this->rawDataEdit = rawurldecode($_POST["rawdatasource"]); - if(!is_file($fileName) || $this->yellow->toolbox->deleteFile($fileName)) + $this->response->rawDataSource = $this->response->rawDataEdit = rawurldecode($_POST["rawdatasource"]); + if($this->yellow->lookup->isFileLocation($location)) { - $statusCode = 303; - $location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location); - $this->yellow->sendStatus($statusCode, $location); + if($this->yellow->toolbox->deleteFile($fileName, $this->yellow->config->get("trashDir"))) + { + $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($statusCode, "Can't delete file '$fileName'!"); + } } else { - $statusCode = 500; - $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false); - $this->yellow->page->error($statusCode, "Can't delete file '$fileName'!"); + if($this->yellow->toolbox->deleteDirectory(dirname($fileName), $this->yellow->config->get("trashDir"))) + { + $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($statusCode, "Can't delete file '$fileName'!"); + } } } return $statusCode; } - // Send mail to web interface user - function sendMail($serverScheme, $serverName, $base, $email, $action) - { - if($action=="welcome" || $action=="information") - { - $url = "$serverScheme://$serverName$base/"; - } else { - $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") - { - $account = $email; - $name = $this->yellow->config->get("author"); - $email = $this->yellow->config->get("email"); - } else { - $account = $email; - $name = $this->users->getName($email); - } - $language = $this->users->getLanguage($email); - if(!$this->yellow->text->isLanguage($language)) $language = $this->yellow->config->get("language"); - $sitename = $this->yellow->config->get("sitename"); - $prefix = "webinterface".ucfirst($action); - $message = $this->yellow->text->getText("{$prefix}Message", $language); - $message = preg_replace("/@useraccount/i", $account, $message); - $message = preg_replace("/@usershort/i", strtok($name, " "), $message); - $message = preg_replace("/@username/i", $name, $message); - $message = preg_replace("/@userlanguage/i", $language, $message); - $mailTo = mb_encode_mimeheader("$name <$email>"); - $mailSubject = mb_encode_mimeheader($this->yellow->text->getText("{$prefix}Subject", $language)); - $mailHeaders = mb_encode_mimeheader("From: $sitename <noreply>")."\r\n"; - $mailHeaders .= mb_encode_mimeheader("X-Request-Url: $serverScheme://$serverName$base")."\r\n"; - $mailHeaders .= mb_encode_mimeheader("X-Remote-Addr: $_SERVER[REMOTE_ADDR]")."\r\n"; - $mailHeaders .= "Mime-Version: 1.0\r\n"; - $mailHeaders .= "Content-Type: text/plain; charset=utf-8\r\n"; - $mailMessage = "$message\r\n\r\n$url\r\n-- \r\n$sitename"; - return mail($mailTo, $mailSubject, $mailMessage, $mailHeaders); - } - // Check web interface request function checkRequest($location) { @@ -531,9 +602,9 @@ class YellowWebinterface $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"); + $this->response->active = substru($location, 0, $locationLength)==$this->yellow->config->get("webinterfaceLocation"); } - return $this->isActive(); + return $this->response->isActive(); } // Check web interface user @@ -546,40 +617,24 @@ class YellowWebinterface if($this->users->checkUser($email, $password)) { $this->users->createCookie("login", $email); - $this->userEmail = $email; - $this->userLanguage = $this->getUserLanguage($email); - $this->userRestrictions = $this->getUserRestrictions($email, $location, $fileName); + $this->response->userEmail = $email; + $this->response->userRestrictions = $this->getUserRestrictions($email, $location, $fileName); + $this->response->language = $this->response->getLanguage($email); } else { - $this->action = "fail"; + $this->response->action = "fail"; } } else if(isset($_COOKIE["login"])) { list($email, $session) = explode(',', $_COOKIE["login"], 2); if($this->users->checkCookie($email, $session)) { - $this->userEmail = $email; - $this->userLanguage = $this->getUserLanguage($email); - $this->userRestrictions = $this->getUserRestrictions($email, $location, $fileName); + $this->response->userEmail = $email; + $this->response->userRestrictions = $this->getUserRestrictions($email, $location, $fileName); + $this->response->language = $this->response->getLanguage($email); } else { - $this->action = "fail"; + $this->response->action = "fail"; } } - 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) - { - $status = $this->users->checkUserRequest($email, $action, $expire, $id) ? "ok" : "done"; - if($status=="done" && $expire<=time()) $status = "expire"; - return $status; + return $this->response->isUser(); } // Return user account changes @@ -617,48 +672,31 @@ class YellowWebinterface } if(is_null($userRestrictions)) { - $userRestrictions = !is_dir(dirname($fileName)) || strlenu(basename($fileName))>128; - $userRestrictions |= substru($location, 0, strlenu($this->users->getHome($email)))!=$this->users->getHome($email); + $userRestrictions = substru($location, 0, strlenu($this->users->getHome($email)))!=$this->users->getHome($email); + $userRestrictions |= empty($fileName) || strlenu(dirname($fileName))>128 || strlenu(basename($fileName))>128; } return $userRestrictions; } +} - // Update request information - function updateRequestInformation() - { - if($this->isActive()) - { - $serverScheme = $this->yellow->config->get("webinterfaceServerScheme"); - $serverName = $this->yellow->config->get("webinterfaceServerName"); - $base = rtrim($this->yellow->config->get("serverBase").$this->yellow->config->get("webinterfaceLocation"), '/'); - $this->yellow->page->base = $base; - } - return $this->yellow->getRequestInformation($serverScheme, $serverName, $base); - } - - // Update page data with title - function updateDataTitle($rawData, $title) - { - foreach($this->yellow->toolbox->getTextLines($rawData) as $line) - { - if(preg_match("/^(\s*Title\s*:\s*)(.*?)(\s*)$/i", $line, $matches)) $line = $matches[1].$title.$matches[3]; - $rawDataNew .= $line; - } - return $rawDataNew; - } +// Yellow response +class YellowResponse +{ + var $yellow; //access to API + var $webinterface; //access to web interface + var $userEmail; //user email + var $userRestrictions; //user can change page? (boolean) + var $active; //web interface is active? (boolean) + var $rawDataSource; //raw data of page for comparison + var $rawDataEdit; //raw data of page for editing + var $language; //response language + var $action; //response action + var $status; //response status - // Return page data title - function getDataTitle($rawData) + function __construct($yellow) { - $title = $this->yellow->page->get("title"); - if(preg_match("/^(\xEF\xBB\xBF)?\-\-\-[\r\n]+(.+?)[\r\n]+\-\-\-[\r\n]+/s", $rawData)) - { - foreach($this->yellow->toolbox->getTextLines($rawData) as $line) - { - if(preg_match("/^(\s*Title\s*:\s*)(.*?)(\s*)$/i", $line, $matches)) { $title = $matches[2]; break; } - } - } - return $title; + $this->yellow = $yellow; + $this->webinterface = $yellow->plugins->get("webinterface"); } // Return new page @@ -681,7 +719,7 @@ class YellowWebinterface if(strempty($titleNumber)) { $titleNumber = 2; $titleText = $titleText.' '; } for(; $titleNumber<=999; ++$titleNumber) { - $page->rawData = $this->updateDataTitle($rawData, $titleText.$titleNumber); + $page->rawData = $this->updateTextTitle($rawData, $titleText.$titleNumber); $page->fileName = $this->yellow->lookup->findFileFromTitle( $page->get($this->yellow->config->get("webinterfaceMetaFilePrefix")), $titleText.$titleNumber, $fileName, $this->yellow->config->get("contentDefaultFile"), $this->yellow->config->get("contentExtension")); @@ -691,7 +729,13 @@ class YellowWebinterface if(!$ok) $page->error(500, "Page '".$page->get("title")."' can not be created!"); } } - if($this->getUserRestrictions($this->userEmail, $page->location, $page->fileName)) + if(!is_dir(dirname($page->fileName))) + { + preg_match("/^([\d\-\_\.]*)(.*)$/", $page->get("title"), $matches); + if(preg_match("/\d$/", $matches[1])) $matches[1] .= '-'; + $page->fileName = $this->yellow->lookup->findFilePageNew($fileName, $matches[1]); + } + if($this->webinterface->getUserRestrictions($this->userEmail, $page->location, $page->fileName)) { $page->error(500, "Page '".$page->get("title")."' is not allowed!"); } @@ -703,7 +747,7 @@ class YellowWebinterface { $page = new YellowPage($this->yellow); $page->setRequestInformation($serverScheme, $serverName, $base, $location, $fileName); - $page->parseData($this->merge->merge($rawDataSource, $rawDataEdit, $rawDataFile), false, 0); + $page->parseData($this->webinterface->merge->merge($rawDataSource, $rawDataEdit, $rawDataFile), false, 0); if(empty($page->rawData)) $page->error(500, "Page has been modified by someone else!"); if($this->yellow->lookup->isFileLocation($location) && !$page->isError()) { @@ -728,41 +772,20 @@ class YellowWebinterface } } } - if($this->getUserRestrictions($this->userEmail, $page->location, $page->fileName)) + if($this->webinterface->getUserRestrictions($this->userEmail, $page->location, $page->fileName)) { $page->error(500, "Page '".$page->get("title")."' is not allowed!"); } return $page; } - // Return raw data for new page - function getRawDataNew($location = "") - { - $fileName = $this->yellow->lookup->findFileFromLocation($this->yellow->page->location); - $fileName = $this->yellow->lookup->findFileNew($fileName, - $this->yellow->config->get("webinterfaceNewFile"), $this->yellow->config->get("configDir"), - $this->yellow->config->get("template")); - $rawData = $this->yellow->toolbox->readFile($fileName); - $rawData = preg_replace("/@datetime/i", date("Y-m-d H:i:s"), $rawData); - $rawData = preg_replace("/@date/i", date("Y-m-d"), $rawData); - $rawData = preg_replace("/@usershort/i", strtok($this->users->getName($this->userEmail), " "), $rawData); - $rawData = preg_replace("/@username/i", $this->users->getName($this->userEmail), $rawData); - $rawData = preg_replace("/@userlanguage/i", $this->users->getLanguage($this->userEmail), $rawData); - if(!empty($location)) - { - $title = $this->yellow->toolbox->createTextTitle($location); - $rawData = $this->updateDataTitle($rawData, $title); - } - return $rawData; - } - // Return page data including login information function getPageData() { $data = array(); if($this->isUser()) { - $data["title"] = $this->getDataTitle($this->rawDataEdit); + $data["title"] = $this->getPageTitle($this->rawDataEdit); $data["rawDataSource"] = $this->rawDataSource; $data["rawDataEdit"] = $this->rawDataEdit; $data["rawDataNew"] = $this->getRawDataNew(); @@ -783,11 +806,12 @@ class YellowWebinterface if($this->isUser()) { $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["userName"] = $this->webinterface->users->getName($this->userEmail); + $data["userLanguage"] = $this->webinterface->users->getLanguage($this->userEmail); + $data["userStatus"] = $this->webinterface->users->getStatus($this->userEmail); + $data["userHome"] = $this->webinterface->users->getHome($this->userEmail); + $data["userRestrictions"] = intval($this->isUserRestrictions()); + $data["userWebmaster"] = intval($this->isUserWebmaster()); $data["serverScheme"] = $this->yellow->config->get("serverScheme"); $data["serverName"] = $this->yellow->config->get("serverName"); $data["serverBase"] = $this->yellow->config->get("serverBase"); @@ -801,7 +825,7 @@ class YellowWebinterface } else { $data["loginEmail"] = $this->yellow->config->get("loginEmail"); $data["loginPassword"] = $this->yellow->config->get("loginPassword"); - $data["loginButtons"] = intval($this->users->isWebmaster()); + $data["loginRestrictions"] = intval($this->isLoginRestrictions()); } if(defined("DEBUG") && DEBUG>=1) $data["debug"] = DEBUG; return $data; @@ -819,26 +843,66 @@ class YellowWebinterface return $data; } - // Return user data - function getUserData() + // Return text strings + function getTextData() { - $data = array(); - foreach($this->users->users as $key=>$value) + $textLanguage = array_merge($this->yellow->text->getData("language", $this->language)); + $textWebinterface = array_merge($this->yellow->text->getData("webinterface", $this->language)); + $textYellow = array_merge($this->yellow->text->getData("yellow", $this->language)); + return array_merge($textLanguage, $textWebinterface, $textYellow); + } + + // Return raw data for new page + function getRawDataNew($location = "") + { + $fileName = $this->yellow->lookup->findFileFromLocation($this->yellow->page->location); + $fileName = $this->yellow->lookup->findFileFromConfig($fileName, + $this->yellow->config->get("webinterfaceNewFile"), $this->yellow->config->get("template")); + $rawData = $this->yellow->toolbox->readFile($fileName); + $rawData = preg_replace("/@datetime/i", date("Y-m-d H:i:s"), $rawData); + $rawData = preg_replace("/@date/i", date("Y-m-d"), $rawData); + $rawData = preg_replace("/@usershort/i", strtok($this->webinterface->users->getName($this->userEmail), " "), $rawData); + $rawData = preg_replace("/@username/i", $this->webinterface->users->getName($this->userEmail), $rawData); + $rawData = preg_replace("/@userlanguage/i", $this->webinterface->users->getLanguage($this->userEmail), $rawData); + if(!empty($location)) { - $data[$key] = "$value[email] password $value[name] $value[language] $value[status]"; - if($this->getUserRestrictions($value["email"], "/locationcheck/", "/filecheck")) $data[$key] .= " restrictions"; + $title = $this->yellow->toolbox->createTextTitle($location); + $rawData = $this->updateTextTitle($rawData, $title); } - usort($data, strnatcasecmp); - return $data; + return $rawData; } - // Return text strings - function getTextData() + // Return page title + function getPageTitle($rawData) { - $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); + $title = $this->yellow->page->get("title"); + if(preg_match("/^(\xEF\xBB\xBF)?\-\-\-[\r\n]+(.+?)[\r\n]+\-\-\-[\r\n]+/s", $rawData)) + { + foreach($this->yellow->toolbox->getTextLines($rawData) as $line) + { + if(preg_match("/^(\s*Title\s*:\s*)(.*?)(\s*)$/i", $line, $matches)) { $title = $matches[2]; break; } + } + } + return $title; + } + + // Return language for user + function getLanguage($email) + { + $language = $this->webinterface->users->getLanguage($email); + if(!$this->yellow->text->isLanguage($language)) $language = $this->yellow->config->get("language"); + return $language; + } + + // Update text title + function updateTextTitle($rawData, $title) + { + foreach($this->yellow->toolbox->getTextLines($rawData) as $line) + { + if(preg_match("/^(\s*Title\s*:\s*)(.*?)(\s*)$/i", $line, $matches)) $line = $matches[1].$title.$matches[3]; + $rawDataNew .= $line; + } + return $rawDataNew; } // Normlise text with special characters @@ -851,16 +915,74 @@ class YellowWebinterface return $text; } + // Send mail to user + function sendMail($serverScheme, $serverName, $base, $email, $action) + { + if($action=="welcome" || $action=="information") + { + $url = "$serverScheme://$serverName$base/"; + } else { + $expire = time()+60*60*24; + $id = $this->webinterface->users->createRequestId($email, $action, $expire); + $url = "$serverScheme://$serverName$base"."/action:$action/email:$email/expire:$expire/id:$id/"; + } + if($action=="approve") + { + $account = $email; + $name = $this->yellow->config->get("author"); + $email = $this->yellow->config->get("email"); + } else { + $account = $email; + $name = $this->webinterface->users->getName($email); + } + $language = $this->webinterface->users->getLanguage($email); + if(!$this->yellow->text->isLanguage($language)) $language = $this->yellow->config->get("language"); + $sitename = $this->yellow->config->get("sitename"); + $prefix = "webinterface".ucfirst($action); + $message = $this->yellow->text->getText("{$prefix}Message", $language); + $message = preg_replace("/@useraccount/i", $account, $message); + $message = preg_replace("/@usershort/i", strtok($name, " "), $message); + $message = preg_replace("/@username/i", $name, $message); + $message = preg_replace("/@userlanguage/i", $language, $message); + $mailTo = mb_encode_mimeheader("$name <$email>"); + $mailSubject = mb_encode_mimeheader($this->yellow->text->getText("{$prefix}Subject", $language)); + $mailHeaders = mb_encode_mimeheader("From: $sitename <noreply>")."\r\n"; + $mailHeaders .= mb_encode_mimeheader("X-Request-Url: $serverScheme://$serverName$base")."\r\n"; + $mailHeaders .= mb_encode_mimeheader("X-Remote-Addr: $_SERVER[REMOTE_ADDR]")."\r\n"; + $mailHeaders .= "Mime-Version: 1.0\r\n"; + $mailHeaders .= "Content-Type: text/plain; charset=utf-8\r\n"; + $mailMessage = "$message\r\n\r\n$url\r\n-- \r\n$sitename"; + return mail($mailTo, $mailSubject, $mailMessage, $mailHeaders); + } + + // Check if web interface active + function isActive() + { + return $this->active; + } + + // Check if web interface has login restrictions + function isLoginRestrictions() + { + return substru($this->yellow->config->get("email"), 0, 7)=="noreply"; + } + // Check if user is logged in function isUser() { return !empty($this->userEmail); } + + // Check if user has restrictions + function isUserRestrictions() + { + return empty($this->userEmail) || $this->userRestrictions; + } - // Check if web interface request - function isActive() + // Check if user is webmaster + function isUserWebmaster() { - return $this->active; + return !empty($this->userEmail) && $this->userEmail==$this->yellow->config->get("email"); } } @@ -921,13 +1043,7 @@ class YellowUsers // Update users in file function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $pending = "", $home = "") { - if(!empty($password)) - { - $algorithm = $this->yellow->config->get("webinterfaceUserHashAlgorithm"); - $cost = $this->yellow->config->get("webinterfaceUserHashCost"); - $hash = $this->yellow->toolbox->createHash($password, $algorithm, $cost); - if(empty($hash)) $hash = "error-hash-algorithm-$algorithm"; - } + if(!empty($password)) $hash = $this->createHash($password); if($this->isExisting($email)) { $email = strreplaceu(',', '-', $email); @@ -1012,25 +1128,42 @@ class YellowUsers setcookie($cookieName, "", time()-3600, $location, "", $serverScheme=="https"); } - // Check user request - function checkUserRequest($email, $action, $expire, $id) + // Create password hash + function createHash($password) { - switch($action) - { - 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); + $algorithm = $this->yellow->config->get("webinterfaceUserHashAlgorithm"); + $cost = $this->yellow->config->get("webinterfaceUserHashCost"); + $hash = $this->yellow->toolbox->createHash($password, $algorithm, $cost); + if(empty($hash)) $hash = "error-hash-algorithm-$algorithm"; + return $hash; } - // Create user request ID - function createUserRequestId($email, $action, $expire) + // Create request ID for action + function createRequestId($email, $action, $expire) { return $this->yellow->toolbox->createHash($this->users[$email]["hash"].$action.$expire, "sha256"); } + // Return response status for action + function getResponseStatus($email, $action, $expire, $id) + { + $status = "done"; + switch($action) + { + case "confirm": $statusExpected = "unconfirmed"; break; + case "reconfirm": $statusExpected = "unconfirmed"; break; + case "approve": $statusExpected = "unapproved"; break; + default: $statusExpected = "active"; break; + } + if($this->isExisting($email) && $this->users[$email]["status"]==$statusExpected && + $this->yellow->toolbox->verifyHash($this->users[$email]["hash"].$action.$expire, "sha256", $id)) + { + $status = "ok"; + } + if($expire<=time()) $status = "expired"; + return $status; + } + // Return user hash function getHash($email = "") { @@ -1073,12 +1206,19 @@ class YellowUsers return count($this->users); } - // Check if web master exists - function isWebmaster() + // Return user data + function getData() { - return substru($this->yellow->config->get("email"), 0, 7)!="noreply"; + $data = array(); + foreach($this->users as $key=>$value) + { + $data[$key] = "$value[email] password $value[name] $value[language] $value[status]"; + if($value["home"]!="/") $data[$key] .= " restrictions"; + } + usort($data, strnatcasecmp); + return $data; } - + // Check if user exists function isExisting($email) {