commit 168b285ea634845e899854f81ff45a4f62d61524
parent c47f6f7c8dfbb91a3a2308fff56c07a3bee4d93d
Author: markseu <mark2011@mayberg.se>
Date: Sat, 13 Aug 2016 17:48:18 +0200
System update (summer remix)
Diffstat:
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)
{