System update (software update)

This commit is contained in:
markseu 2016-08-16 10:16:13 +02:00
parent 119d173abe
commit a461c117c3
9 changed files with 171 additions and 49 deletions

View file

@ -3,4 +3,4 @@ Title: About
---
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna pizza. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
[yellow server]
This website is made with [yellow]

View file

@ -5,7 +5,7 @@
// Command line plugin
class YellowCommandline
{
const VERSION = "0.6.14";
const VERSION = "0.6.15";
var $yellow; //access to API
var $files; //number of files
var $errors; //number of errors
@ -66,7 +66,7 @@ class YellowCommandline
$this->files = 0; $this->errors = 1;
$fileName = $this->yellow->config->get("configDir").$this->yellow->config->get("configFile");
echo "ERROR building files: Please configure ServerScheme, ServerName, ServerBase, ServerTime in file '$fileName'!\n";
echo "ERROR building files: To see your web server configuration, open your website in a web browser!\n";
echo "ERROR building files: Open your website in a web browser, if you want to see your server settings!\n";
}
echo "Yellow $command: $this->files file".($this->files!=1 ? 's' : '');
echo ", $this->errors error".($this->errors!=1 ? 's' : '');
@ -319,7 +319,7 @@ class YellowCommandline
{
echo "$key $value\n";
} else {
echo "$key $value - Update available\n";
echo "$key $dataLatest[$key] - Update available\n";
++$updates;
}
}

View file

@ -3,7 +3,7 @@
Language: de
LanguageDescription: Deutsch
LanguageAuthor: David Fehrmann
LanguageVersion: 0.6.7
LanguageVersion: 0.6.8
BlogBy: von
BlogFilter: Blog:
@ -58,7 +58,7 @@ 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.
WebinterfaceSettingsStatusTaken: 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
@ -85,11 +85,11 @@ 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. Du kannst dich jetzt anmelden.
WebinterfaceUpdateTitle: Aktualisierung
WebinterfaceUpdateCheck: Nach Aktualisierung suchen
WebinterfaceUpdateStatusNone: Nach Aktualisierung suchen…
WebinterfaceUpdateStatusEmpty: Keine Aktualisierung verfügbar.
WebinterfaceUpdateButton: Aktualisieren
WebinterfaceVersionTitle: Über diese Webseite
WebinterfaceVersionStatusNone: Nach Aktualiserung suchen…
WebinterfaceVersionStatusLatest: Keine Aktualisierung verfügbar.
WebinterfaceVersionStatusUpdates: Aktualiserung verfügbar, bitte an den Webmaster wenden.
WebinterfaceVersionUpdate: Aktualisieren
WebinterfaceOkButton: Ok
WebinterfaceCancelButton: Abbruch
WebinterfaceCreateButton: Erzeugen

View file

@ -3,7 +3,7 @@
Language: en
LanguageDescription: English
LanguageAuthor: Mark Seuffert
LanguageVersion: 0.6.7
LanguageVersion: 0.6.8
BlogBy: by
BlogFilter: Blog:
@ -58,7 +58,7 @@ 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.
WebinterfaceSettingsStatusTaken: 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
@ -85,11 +85,11 @@ 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. You can now log in.
WebinterfaceUpdateTitle: Updates
WebinterfaceUpdateCheck: Check for updates
WebinterfaceUpdateStatusNone: Checking for updates…
WebinterfaceUpdateStatusEmpty: No updates available.
WebinterfaceUpdateButton: Update
WebinterfaceVersionTitle: About this website
WebinterfaceVersionStatusNone: Checking for updates…
WebinterfaceVersionStatusLatest: No updates available.
WebinterfaceVersionStatusUpdates: Updates available, please contact the webmaster.
WebinterfaceVersionUpdate: Update
WebinterfaceOkButton: Ok
WebinterfaceCancelButton: Cancel
WebinterfaceCreateButton: Create

View file

@ -3,7 +3,7 @@
Language: fr
LanguageDescription: Français
LanguageAuthor: Juh Nibreh
LanguageVersion: 0.6.7
LanguageVersion: 0.6.8
BlogBy: par
BlogFilter: Blog:
@ -58,7 +58,7 @@ WebinterfaceRecoverStatusWeak: S'il vous plaît, choisissez un mot de passe diff
WebinterfaceRecoverStatusNext: Votre compte est à nouveau disponible, vérifiez vos emails.
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.
WebinterfaceSettingsStatusTaken: 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
@ -85,11 +85,11 @@ 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é. 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
WebinterfaceVersionTitle: A propos de ce site
WebinterfaceVersionStatusNone: Vérification des mises à jour…
WebinterfaceVersionStatusLatest: Aucune mise à jour disponible.
WebinterfaceVersionStatusUpdates: Mises à jour disponibles, s'il vous plaît contacter le webmestre.
WebinterfaceVersionUpdate: Mettre à jour
WebinterfaceOkButton: Ok
WebinterfaceCancelButton: Annuler
WebinterfaceCreateButton: Créer

View file

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

View file

@ -1,4 +1,4 @@
/* Yellow web interface 0.6.11 */
/* Yellow web interface 0.6.12 */
.yellow-bar { position:relative; overflow:hidden; height:2em; margin-bottom:10px; }
.yellow-bar-left { display:block; float:left; }
@ -109,6 +109,13 @@
#yellow-pane-settings-fields { width:15em; text-align:left; margin:0 auto; }
#yellow-pane-settings-buttons { margin-top:-0.5em; }
#yellow-pane-version { text-align:center; white-space:nowrap; }
#yellow-pane-version h1 { margin:0 1em; font-size:2em; }
#yellow-pane-version .yellow-btn { width:15em; margin:1em 1em 0.5em 0; }
#yellow-pane-version-status { margin:0.5em 0; display:inline-block; }
#yellow-pane-version-fields { width:20em; text-align:left; margin:0 auto; }
#yellow-pane-version-buttons { margin-top:-0.5em; }
#yellow-pane-edit { }
#yellow-pane-edit h1 { margin:0 0 10px 0; font-size:1.5em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
#yellow-pane-edit-page { padding:5px; outline:none; resize:none; }

View file

@ -4,7 +4,7 @@
// Yellow API
var yellow =
{
version: "0.6.11",
version: "0.6.12",
action: function(action) { yellow.webinterface.action(action, "none"); },
onLoad: function() { yellow.webinterface.loadInterface(); },
onClick: function(e) { yellow.webinterface.hidePanesOnClick(yellow.toolbox.getEventElement(e)); },
@ -36,6 +36,8 @@ yellow.webinterface =
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 "version": this.showPane("yellow-pane-version", action, status); break;
case "update": this.sendPane("yellow-pane-version", action); 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;
@ -134,7 +136,7 @@ yellow.webinterface =
"<form method=\"post\">"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+
"<h1>"+this.getText("SignupTitle")+"</h1>"+
"<div id=\"yellow-pane-signup-status\" class=\""+paneStatus+"\">"+this.getText(paneAction+"Status", "webinterface", paneStatus)+"</div>"+
"<div id=\"yellow-pane-signup-status\" class=\""+paneStatus+"\">"+this.getText(paneAction+"Status", "", paneStatus)+"</div>"+
"<div id=\"yellow-pane-signup-fields\">"+
"<input type=\"hidden\" name=\"action\" value=\"signup\" />"+
"<p><label for=\"yellow-pane-signup-name\">"+this.getText("SignupName")+"</label><br /><input class=\"yellow-form-control\" name=\"name\" id=\"yellow-pane-signup-name\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("name"))+"\" /></p>"+
@ -152,7 +154,7 @@ yellow.webinterface =
"<form method=\"post\">"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+
"<h1>"+this.getText("RecoverTitle")+"</h1>"+
"<div id=\"yellow-pane-recover-status\" class=\""+paneStatus+"\">"+this.getText("RecoverStatus", "", paneStatus)+"</div>"+
"<div id=\"yellow-pane-recover-status\" class=\""+paneStatus+"\">"+this.getText(paneAction+"Status", "", paneStatus)+"</div>"+
"<div id=\"yellow-pane-recover-fields-first\">"+
"<input type=\"hidden\" name=\"action\" value=\"recover\" />"+
"<p><label for=\"yellow-pane-recover-email\">"+this.getText("RecoverEmail")+"</label><br /><input class=\"yellow-form-control\" name=\"email\" id=\"yellow-pane-recover-email\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("email"))+"\" /></p>"+
@ -172,7 +174,7 @@ yellow.webinterface =
"<form method=\"post\">"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+
"<h1 id=\"yellow-pane-settings-title\">"+this.getText("SettingsTitle")+"</h1>"+
"<div id=\"yellow-pane-settings-status\" class=\""+paneStatus+"\">"+this.getText(paneAction+"Status", "webinterface", paneStatus)+"</div>"+
"<div id=\"yellow-pane-settings-status\" class=\""+paneStatus+"\">"+this.getText(paneAction+"Status", "", paneStatus)+"</div>"+
"<div id=\"yellow-pane-settings-fields\">"+
"<input type=\"hidden\" name=\"action\" value=\"settings\" />"+
"<p><label for=\"yellow-pane-settings-name\">"+this.getText("SignupName")+"</label><br /><input class=\"yellow-form-control\" name=\"name\" id=\"yellow-pane-settings-name\" maxlength=\"64\" value=\""+yellow.toolbox.encodeHtml(this.getRequest("name"))+"\" /></p>"+
@ -185,6 +187,24 @@ yellow.webinterface =
"</div>"+
"</form>";
break;
case "yellow-pane-version":
elementDiv.innerHTML =
"<form method=\"post\">"+
"<a href=\"#\" onclick=\"yellow.action('close'); return false;\" class=\"yellow-close\">x</a>"+
"<h1 id=\"yellow-pane-version-title\">"+yellow.toolbox.encodeHtml(yellow.config.serverVersion)+"</h1>"+
"<div id=\"yellow-pane-version-status\" class=\""+paneStatus+"\">"+this.getText("VersionStatus", "", paneStatus)+"</div>"+
"<div id=\"yellow-pane-version-fields\">"+
"<p>"+yellow.page.rawDataOutput+"</p><hr />"+
"<p>ServerScheme: "+yellow.toolbox.encodeHtml(yellow.config.serverScheme)+"<br />"+
"ServerName: "+yellow.toolbox.encodeHtml(yellow.config.serverName)+"<br />"+
"ServerBase: "+yellow.toolbox.encodeHtml(yellow.config.serverBase)+"<br />"+
"ServerTime: "+yellow.toolbox.encodeHtml(yellow.config.serverTime)+"</p>"+
"</div>"+
"<div id=\"yellow-pane-version-buttons\">"+
"<p><input class=\"yellow-btn\" type=\"button\" onclick=\"yellow.action('close'); return false;\" value=\""+this.getText("OkButton")+"\" /></p>"+
"</div>"+
"</form>";
break;
case "yellow-pane-edit":
elementDiv.innerHTML =
"<form method=\"post\">"+
@ -246,12 +266,24 @@ yellow.webinterface =
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-status").innerHTML = "<a href=\"#\" onclick=\"yellow.action('version'); return false;\">"+yellow.toolbox.encodeHtml(yellow.config.serverVersion)+"</a>";
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;
case "yellow-pane-version":
if(paneStatus=="none")
{
document.getElementById("yellow-pane-version-status").innerHTML = this.getText("VersionStatus", "", paneStatus);
document.getElementById("yellow-pane-version-fields").innerHTML = "";
setTimeout("yellow.action('send');", 100);
}
if(paneStatus=="updates" && yellow.config.userWebmaster)
{
document.getElementById("yellow-pane-version-status").innerHTML = "<a href=\"#\" onclick=\"yellow.action('update'); return false;\">"+this.getText("VersionUpdate")+"</a>";
}
break;
case "yellow-pane-edit":
if(init)
{
@ -295,6 +327,7 @@ yellow.webinterface =
case "yellow-pane-signup":
case "yellow-pane-recover":
case "yellow-pane-settings":
case "yellow-pane-version":
yellow.toolbox.setOuterTop(document.getElementById(paneId), paneTop);
yellow.toolbox.setOuterWidth(document.getElementById(paneId), paneWidth);
break;

View file

@ -5,7 +5,7 @@
// Web interface plugin
class YellowWebinterface
{
const VERSION = "0.6.11";
const VERSION = "0.6.12";
var $yellow; //access to API
var $response; //web interface response
var $users; //web interface users
@ -188,6 +188,8 @@ class YellowWebinterface
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 "version": $statusCode = $this->processRequestVersion($serverScheme, $serverName, $base, $location, $fileName); break;
case "update": $statusCode = $this->processRequestUpdate($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;
@ -277,7 +279,7 @@ class YellowWebinterface
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" && $this->users->isTaken($email)) $this->response->status = "next";
if($this->response->status=="ok")
{
$fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile");
@ -393,19 +395,19 @@ class YellowWebinterface
{
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 && $this->users->isTaken($email)) $this->response->status = "taken";
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";
$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";
$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")
@ -443,7 +445,7 @@ class YellowWebinterface
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->users->getStatus($emailSource)!="active") $this->response->status = "done";
}
if($this->response->status=="ok")
{
@ -498,6 +500,59 @@ class YellowWebinterface
return $statusCode;
}
// Process request to show version
function processRequestVersion($serverScheme, $serverName, $base, $location, $fileName)
{
$this->response->action = "version";
$this->response->status = "ok";
if($this->yellow->plugins->isExisting("update"))
{
list($statusCode, $dataCurrent) = $this->yellow->plugins->get("update")->getSoftwareVersion();
list($statusCode, $dataLatest) = $this->yellow->plugins->get("update")->getSoftwareVersion(true);
foreach($dataCurrent as $key=>$value)
{
if(strnatcasecmp($dataCurrent[$key], $dataLatest[$key])<0)
{
if(!empty($this->response->rawDataOutput)) $this->response->rawDataOutput .= "<br />\n";
$this->response->rawDataOutput .= "$key $dataLatest[$key]";
++$updates;
++$count; if($count>=4) { $this->response->rawDataOutput .= ""; break; }
}
}
$this->response->status = $updates ? "updates" : "latest";
if($statusCode!=200)
{
$this->yellow->page->statusCode = 500;
$this->yellow->page->set("pageError", "Can't check for updates on this server!");
$this->response->status = "error";
}
}
$statusCode = $this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false);
return $statusCode;
}
// Process request to update software
function processRequestUpdate($serverScheme, $serverName, $base, $location, $fileName)
{
$statusCode = 0;
if($this->response->isUserWebmaster())
{
$statusCode = $this->yellow->command("update");
if($statusCode==200)
{
$statusCode = 303;
$location = $this->yellow->lookup->normaliseUrl($serverScheme, $serverName, $base, $location);
$this->yellow->sendStatus($statusCode, $location);
} else {
$statusCode = 500;
$this->yellow->page->statusCode = 500;
$this->yellow->page->set("pageError", "Can't install updates on this server!");
$this->yellow->processRequest($serverScheme, $serverName, $base, $location, $fileName, false);
}
}
return $statusCode;
}
// Process request to create page
function processRequestCreate($serverScheme, $serverName, $base, $location, $fileName)
{
@ -689,6 +744,7 @@ class YellowResponse
var $active; //web interface is active? (boolean)
var $rawDataSource; //raw data of page for comparison
var $rawDataEdit; //raw data of page for editing
var $rawDataOutput; //raw data of dynamic output
var $language; //response language
var $action; //response action
var $status; //response status
@ -734,6 +790,7 @@ class YellowResponse
preg_match("/^([\d\-\_\.]*)(.*)$/", $page->get("title"), $matches);
if(preg_match("/\d$/", $matches[1])) $matches[1] .= '-';
$page->fileName = $this->yellow->lookup->findFilePageNew($fileName, $matches[1]);
$page->location = $this->yellow->lookup->findLocationFromFile($page->fileName);
}
if($this->webinterface->getUserRestrictions($this->userEmail, $page->location, $page->fileName))
{
@ -789,6 +846,7 @@ class YellowResponse
$data["rawDataSource"] = $this->rawDataSource;
$data["rawDataEdit"] = $this->rawDataEdit;
$data["rawDataNew"] = $this->getRawDataNew();
$data["rawDataOutput"] = strval($this->rawDataOutput);
$data["pageFile"] = $this->yellow->page->get("pageFile");
$data["parserSafeMode"] = $this->yellow->page->parserSafeMode;
}
@ -1009,9 +1067,10 @@ class YellowUsers
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
if(!empty($matches[1]) && !empty($matches[2]))
{
list($hash, $name, $language, $status, $pending, $home) = explode(',', $matches[2]);
list($hash, $name, $language, $status, $modified, $pending, $home) = explode(',', $matches[2]);
if(!is_numeric($modified)) { $home = $pending; $pending = $modified; $modified = 946684800; } //TODO: remove later, converts old file format
$home = empty($home) ? $pending : $home; //TODO: remove later, converts old file format
$this->set($matches[1], $hash, $name, $language, $status, $pending, $home);
$this->set($matches[1], $hash, $name, $language, $status, $modified, $pending, $home);
if(defined("DEBUG") && DEBUG>=3) echo "YellowUsers::load email:$matches[1]<br/>\n";
}
}
@ -1026,12 +1085,13 @@ class YellowUsers
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
if(!empty($matches[1]) && !empty($matches[2]))
{
list($hash, $name, $language, $status, $pending, $home) = explode(',', $matches[2]);
list($hash, $name, $language, $status, $modified, $pending, $home) = explode(',', $matches[2]);
if($status=="active" || $status=="inactive")
{
if(!is_numeric($modified)) { $home = $pending; $pending = $modified; $modified = 946684800; } //TODO: remove later, converts old file format
$home = empty($home) ? $pending : $home; //TODO: remove later, converts old file format
$pending = $this->yellow->config->get("webinterfaceUserPending");
$fileDataNew .= "$matches[1]: $hash,$name,$language,$status,$pending,$home\n";
$fileDataNew .= "$matches[1]: $hash,$name,$language,$status,$modified,$pending,$home\n";
}
} else {
$fileDataNew .= $line;
@ -1041,7 +1101,7 @@ class YellowUsers
}
// Update users in file
function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $pending = "", $home = "")
function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $modified = "", $pending = "", $home = "")
{
if(!empty($password)) $hash = $this->createHash($password);
if($this->isExisting($email))
@ -1051,6 +1111,7 @@ class YellowUsers
$name = strreplaceu(',', '-', empty($name) ? $this->users[$email]["name"] : $name);
$language = strreplaceu(',', '-', empty($language) ? $this->users[$email]["language"] : $language);
$status = strreplaceu(',', '-', empty($status) ? $this->users[$email]["status"] : $status);
$modified = strreplaceu(',', '-', empty($modified) ? time() : $modified);
$pending = strreplaceu(',', '-', empty($pending) ? $this->users[$email]["pending"] : $pending);
$home = strreplaceu(',', '-', empty($home) ? $this->users[$email]["home"] : $home);
} else {
@ -1059,28 +1120,29 @@ class YellowUsers
$name = strreplaceu(',', '-', empty($name) ? $this->yellow->config->get("sitename") : $name);
$language = strreplaceu(',', '-', empty($language) ? $this->yellow->config->get("language") : $language);
$status = strreplaceu(',', '-', empty($status) ? $this->yellow->config->get("webinterfaceUserStatus") : $status);
$modified = strreplaceu(',', '-', empty($modified) ? time() : $modified);
$pending = strreplaceu(',', '-', empty($pending) ? $this->yellow->config->get("webinterfaceUserPending") : $pending);
$home = strreplaceu(',', '-', empty($home) ? $this->yellow->config->get("webinterfaceUserHome") : $home);
}
$this->set($email, $hash, $name, $language, $status, $pending, $home);
$this->set($email, $hash, $name, $language, $status, $modified, $pending, $home);
$fileData = $this->yellow->toolbox->readFile($fileName);
foreach($this->yellow->toolbox->getTextLines($fileData) as $line)
{
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
if(!empty($matches[1]) && $matches[1]==$email)
{
$fileDataNew .= "$email: $hash,$name,$language,$status,$pending,$home\n";
$fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$pending,$home\n";
$found = true;
} else {
$fileDataNew .= $line;
}
}
if(!$found) $fileDataNew .= "$email: $hash,$name,$language,$status,$pending,$home\n";
if(!$found) $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$pending,$home\n";
return $this->yellow->toolbox->createFile($fileName, $fileDataNew);
}
// Set user data
function set($email, $hash, $name, $language, $status, $pending, $home)
function set($email, $hash, $name, $language, $status, $modified, $pending, $home)
{
$this->users[$email] = array();
$this->users[$email]["email"] = $email;
@ -1088,6 +1150,7 @@ class YellowUsers
$this->users[$email]["name"] = $name;
$this->users[$email]["language"] = $language;
$this->users[$email]["status"] = $status;
$this->users[$email]["modified"] = $modified;
$this->users[$email]["pending"] = $pending;
$this->users[$email]["home"] = $home;
}
@ -1125,7 +1188,7 @@ class YellowUsers
{
$serverScheme = $this->yellow->config->get("webinterfaceServerScheme");
$location = $this->yellow->config->get("serverBase").$this->yellow->config->get("webinterfaceLocation");
setcookie($cookieName, "", time()-3600, $location, "", $serverScheme=="https");
setcookie($cookieName, "", time()-60*60, $location, "", $serverScheme=="https");
}
// Create password hash
@ -1188,6 +1251,12 @@ class YellowUsers
return $this->isExisting($email) ? $this->users[$email]["status"] : "";
}
// Return user modified
function getModified($email = "")
{
return $this->isExisting($email) ? $this->users[$email]["modified"] : "";
}
// Return user pending
function getPending($email = "")
{
@ -1218,7 +1287,20 @@ class YellowUsers
usort($data, strnatcasecmp);
return $data;
}
// Check if user is taken
function isTaken($email)
{
$taken = false;
if($this->isExisting($email))
{
$status = $this->users[$email]["status"];
$reserved = $this->users[$email]["modified"] + 60*60*24;
if($status=="active" || $status=="inactive" || $reserved>time()) $taken = true;
}
return $taken;
}
// Check if user exists
function isExisting($email)
{