commit e858250e278ed831702640959cc82bebc896c146
parent c5a1f4e5ab7184eadad8395fd47ca28ae91a449f
Author: markseu <mark2011@mayberg.se>
Date: Wed, 5 Jul 2017 12:25:25 +0200
System update (failed login attempts)
Diffstat:
9 files changed, 174 insertions(+), 65 deletions(-)
diff --git a/system/config/config.ini b/system/config/config.ini
@@ -61,6 +61,7 @@ EditUserHome: /
EditLoginEmail:
EditLoginPassword:
EditLoginRestrictions: 0
+EditBruteForceProtection: 25
ImageThumbnailLocation: /media/thumbnails/
ImageThumbnailDir: media/thumbnails/
ImageThumbnailJpgQuality: 80
diff --git a/system/config/page-error-430.txt b/system/config/page-error-430.txt
@@ -0,0 +1,4 @@
+---
+Title: Login failed
+---
+The email or password is incorrect. [Please try again](javascript:yellow.action('login');).
+\ No newline at end of file
diff --git a/system/plugins/core.php b/system/plugins/core.php
@@ -33,7 +33,6 @@ class YellowCore
$this->config->setDefault("language", "en");
$this->config->setDefault("timezone", "UTC");
$this->config->setDefault("theme", "default");
- $this->config->setDefault("serverUrl", "");
$this->config->setDefault("staticUrl", "");
$this->config->setDefault("staticDefaultFile", "index.html");
$this->config->setDefault("staticErrorFile", "404.html");
@@ -67,6 +66,7 @@ class YellowCore
$this->config->setDefault("errorFile", "page-error-(.*).txt");
$this->config->setDefault("robotsFile", "robots.txt");
$this->config->setDefault("faviconFile", "favicon.ico");
+ $this->config->setDefault("serverUrl", "");
$this->config->setDefault("template", "default");
$this->config->setDefault("navigation", "navigation");
$this->config->setDefault("sidebar", "sidebar");
@@ -92,32 +92,20 @@ class YellowCore
$serverVersion = $this->toolbox->getServerVersion();
echo "Datenstrom Yellow ".YellowCore::VERSION.", PHP ".PHP_VERSION.", $serverVersion<br/>\n";
}
+ $this->toolbox->timerStart($time);
$this->config->load($this->config->get("configDir").$this->config->get("configFile"));
$this->text->load($this->config->get("pluginDir").$this->config->get("textFile"));
$this->lookup->load();
$this->themes->load();
$this->plugins->load();
+ $this->toolbox->timerStop($time);
$this->startup();
- }
-
- // Handle startup
- function startup()
- {
- $tokens = explode(',', $this->config->get("startupUpdate"));
- foreach($this->plugins->plugins as $key=>$value)
- {
- if(method_exists($value["obj"], "onStartup")) $value["obj"]->onStartup(in_array($value["plugin"], $tokens));
- }
- foreach($this->themes->themes as $key=>$value)
+ if(defined("DEBUG") && DEBUG>=2)
{
- if(method_exists($value["obj"], "onStartup")) $value["obj"]->onStartup(in_array($value["theme"], $tokens));
+ $plugins = count($this->plugins->plugins);
+ $themes = count($this->themes->themes);
+ echo "YellowCore::load plugins:$plugins themes:$themes time:$time ms<br/>\n";
}
- if($this->config->get("startupUpdate")!="none")
- {
- $fileNameConfig = $this->config->get("configDir").$this->config->get("configFile");
- $this->config->update($fileNameConfig, array("startupUpdate" => "none"));
- }
- if(defined("DEBUG") && DEBUG>=2) echo "YellowCore::startup<br/>\n";
}
// Handle request
@@ -208,13 +196,17 @@ class YellowCore
{
if($statusCode>=400)
{
+ $cacheable = false;
$fileName = $this->config->get("configDir").$this->config->get("errorFile");
$fileName = strreplaceu("(.*)", $statusCode, $fileName);
- $cacheable = false;
+ $rawData = $this->toolbox->readFile($fileName);
+ if(empty($rawData)) $rawData = "---\nTitle:".$this->toolbox->getHttpStatusFormatted($statusCode, true)."\n---\n";
+ } else {
+ $rawData = $this->toolbox->readFile($fileName);
}
$this->page = new YellowPage($this);
$this->page->setRequestInformation($scheme, $address, $base, $location, $fileName);
- $this->page->parseData($this->toolbox->readFile($fileName), $cacheable, $statusCode, $pageError);
+ $this->page->parseData($rawData, $cacheable, $statusCode, $pageError);
$this->text->setLanguage($this->page->get("language"));
$this->page->parseContent();
return $fileName;
@@ -306,6 +298,25 @@ class YellowCore
return $statusCode;
}
+ // Handle startup
+ function startup()
+ {
+ $tokens = explode(',', $this->config->get("startupUpdate"));
+ foreach($this->plugins->plugins as $key=>$value)
+ {
+ if(method_exists($value["obj"], "onStartup")) $value["obj"]->onStartup(in_array($value["plugin"], $tokens));
+ }
+ foreach($this->themes->themes as $key=>$value)
+ {
+ if(method_exists($value["obj"], "onStartup")) $value["obj"]->onStartup(in_array($value["theme"], $tokens));
+ }
+ if($this->config->get("startupUpdate")!="none")
+ {
+ $fileNameConfig = $this->config->get("configDir").$this->config->get("configFile");
+ $this->config->update($fileNameConfig, array("startupUpdate" => "none"));
+ }
+ }
+
// Handle shutdown
function shutdown()
{
@@ -317,7 +328,6 @@ class YellowCore
{
if(method_exists($value["obj"], "onShutdown")) $value["obj"]->onShutdown();
}
- if(defined("DEBUG") && DEBUG>=2) echo "YellowCore::shutdown<br/>\n";
}
// Parse snippet
@@ -754,6 +764,12 @@ class YellowPage
{
return $this->yellow->pages->getChildren($this->location, $showInvisible);
}
+
+ // Return page collection with sub pages of current page
+ function getChildrenRecursive($showInvisible = false, $levelMax = 0)
+ {
+ return $this->yellow->pages->getChildrenRecursive($this->location, $showInvisible, $levelMax);
+ }
// Return page collection with media files for current page
function getFiles($showInvisible = false)
@@ -1837,27 +1853,29 @@ class YellowConfig
// Update configuration in file
function update($fileName, $config)
{
+ $configNew = new YellowDataCollection();
foreach($config as $key=>$value)
{
- if(empty($key) || strempty($value)) { unset($config[$key]); continue; }
- $this->set($key, $value);
+ if(!empty($key) && !strempty($value))
+ {
+ $this->set($key, $value);
+ $configNew[$key] = $value;
+ }
}
$this->modified = time();
$fileData = $this->yellow->toolbox->readFile($fileName);
foreach($this->yellow->toolbox->getTextLines($fileData) as $line)
{
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
- $keySearch = lcfirst($matches[1]); $keyFound = "";
- foreach($config as $key=>$value) if(lcfirst($key)==$keySearch) { $keyFound = $key; break; }
- if(!empty($keyFound))
+ if(!empty($matches[1]) && !is_null($configNew[$matches[1]]))
{
- $fileDataNew .= "$matches[1]: $config[$keyFound]\n";
- unset($config[$keyFound]);
+ $fileDataNew .= "$matches[1]: ".$configNew[$matches[1]]."\n";
+ unset($configNew[$matches[1]]);
} else {
$fileDataNew .= $line;
}
}
- foreach($config as $key=>$value)
+ foreach($configNew as $key=>$value)
{
$fileDataNew .= ucfirst($key).": $value\n";
}
@@ -2860,6 +2878,7 @@ class YellowToolbox
case 403: $text = "Forbidden"; break;
case 404: $text = "Not found"; break;
case 424: $text = "Not existing"; break;
+ case 430: $text = "Login failed"; break;
case 500: $text = "Server error"; break;
case 503: $text = "Service unavailable"; break;
default: $text = "Error $statusCode";
@@ -3080,7 +3099,7 @@ class YellowToolbox
$lines = array();
$split = preg_split("/(\R)/u", $text, -1, PREG_SPLIT_DELIM_CAPTURE);
for($i=0; $i<count($split)-1; $i+=2) array_push($lines, $split[$i].$split[$i+1]);
- if($split[$i]!='') array_push($lines, $split[$i]);
+ if($split[$i]!="") array_push($lines, $split[$i]."\n");
return $lines;
}
diff --git a/system/plugins/edit.js b/system/plugins/edit.js
@@ -32,6 +32,7 @@ yellow.edit =
case "signup": this.showPane("yellow-pane-signup", action, status); break;
case "confirm": this.showPane("yellow-pane-signup", action, status); break;
case "approve": this.showPane("yellow-pane-signup", action, status); break;
+ case "reactivate": this.showPane("yellow-pane-settings", 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;
diff --git a/system/plugins/edit.php b/system/plugins/edit.php
@@ -5,7 +5,7 @@
class YellowEdit
{
- const VERSION = "0.7.1";
+ const VERSION = "0.7.2";
var $yellow; //access to API
var $response; //web response
var $users; //user accounts
@@ -29,6 +29,7 @@ class YellowEdit
$this->yellow->config->setDefault("editLoginEmail", "");
$this->yellow->config->setDefault("editLoginPassword", "");
$this->yellow->config->setDefault("editLoginRestrictions", "0");
+ $this->yellow->config->setDefault("editBruteForceProtection", "25");
$this->users->load($this->yellow->config->get("configDir").$this->yellow->config->get("editUserFile"));
}
@@ -189,6 +190,7 @@ class YellowEdit
case "signup": $statusCode = $this->processRequestSignup($scheme, $address, $base, $location, $fileName); break;
case "confirm": $statusCode = $this->processRequestConfirm($scheme, $address, $base, $location, $fileName); break;
case "approve": $statusCode = $this->processRequestApprove($scheme, $address, $base, $location, $fileName); break;
+ case "reactivate": $statusCode = $this->processRequestReactivate($scheme, $address, $base, $location, $fileName); break;
case "recover": $statusCode = $this->processRequestRecover($scheme, $address, $base, $location, $fileName); break;
case "settings": $statusCode = $this->processRequestSettings($scheme, $address, $base, $location, $fileName); break;
case "reconfirm": $statusCode = $this->processRequestReconfirm($scheme, $address, $base, $location, $fileName); break;
@@ -207,11 +209,12 @@ class YellowEdit
case "signup": $statusCode = $this->processRequestSignup($scheme, $address, $base, $location, $fileName); break;
case "confirm": $statusCode = $this->processRequestConfirm($scheme, $address, $base, $location, $fileName); break;
case "approve": $statusCode = $this->processRequestApprove($scheme, $address, $base, $location, $fileName); break;
+ case "reactivate": $statusCode = $this->processRequestReactivate($scheme, $address, $base, $location, $fileName); break;
case "recover": $statusCode = $this->processRequestRecover($scheme, $address, $base, $location, $fileName); break;
case "reconfirm": $statusCode = $this->processRequestReconfirm($scheme, $address, $base, $location, $fileName); break;
case "change": $statusCode = $this->processRequestChange($scheme, $address, $base, $location, $fileName); break;
}
- if($this->response->action=="fail") $this->yellow->page->error(500, "Login failed, <a href=\"javascript:yellow.action('login');\">please log in</a>!");
+ if($this->response->action=="fail") $this->processFail($scheme, $address, $base);
}
return $statusCode;
}
@@ -242,17 +245,24 @@ class YellowEdit
// Process request for user login
function processRequestLogin($scheme, $address, $base, $location, $fileName)
{
- $statusCode = 0;
- $home = $this->users->getHome($this->response->userEmail);
- if(substru($location, 0, strlenu($home))==$home)
+ $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("editUserFile");
+ if($this->users->update($fileNameUser, $this->response->userEmail))
{
- $statusCode = 303;
- $location = $this->yellow->lookup->normaliseUrl($scheme, $address, $base, $location);
- $this->yellow->sendStatus($statusCode, $location);
+ $home = $this->users->getHome($this->response->userEmail);
+ if(substru($location, 0, strlenu($home))==$home)
+ {
+ $statusCode = 303;
+ $location = $this->yellow->lookup->normaliseUrl($scheme, $address, $base, $location);
+ $this->yellow->sendStatus($statusCode, $location);
+ } else {
+ $statusCode = 302;
+ $location = $this->yellow->lookup->normaliseUrl($scheme, $address, $base, $home);
+ $this->yellow->sendStatus($statusCode, $location);
+ }
} else {
- $statusCode = 302;
- $location = $this->yellow->lookup->normaliseUrl($scheme, $address, $base, $home);
- $this->yellow->sendStatus($statusCode, $location);
+ $statusCode = 500;
+ $this->yellow->processRequest($scheme, $address, $base, $location, $fileName, false);
+ $this->yellow->page->error($statusCode, "Can't write file '$fileNameUser'!");
}
return $statusCode;
}
@@ -341,6 +351,23 @@ class YellowEdit
$statusCode = $this->yellow->processRequest($scheme, $address, $base, $location, $fileName, false);
return $statusCode;
}
+
+ // Process request to reactivate account
+ function processRequestReactivate($scheme, $address, $base, $location, $fileName)
+ {
+ $this->response->action = "reactivate";
+ $this->response->status = "ok";
+ $email = $_REQUEST["email"];
+ $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("editUserFile");
+ $this->response->status = $this->users->update($fileNameUser, $email, "", "", "", "active") ? "done" : "error";
+ if($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
+ }
+ $statusCode = $this->yellow->processRequest($scheme, $address, $base, $location, $fileName, false);
+ return $statusCode;
+ }
// Process request to recover password
function processRequestRecover($scheme, $address, $base, $location, $fileName)
@@ -401,15 +428,16 @@ class YellowEdit
if($this->response->status=="ok" && $email!=$emailSource)
{
$pending = $emailSource;
+ $home = $this->users->getHome($emailSource);
$fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("editUserFile");
- $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, $home) ? "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("editUserFile");
- $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")
@@ -464,7 +492,7 @@ class YellowEdit
return $statusCode;
}
- // Process request to change settings
+ // Process request to change account
function processRequestChange($scheme, $address, $base, $location, $fileName)
{
$this->response->action = "change";
@@ -674,6 +702,34 @@ class YellowEdit
return $statusCode;
}
+ // Process login failed
+ function processFail($scheme, $address, $base)
+ {
+ $email = $this->response->email;
+ if($this->users->isExisting($email))
+ {
+ $modified = $this->users->getModified($email);
+ $errors = $this->users->getErrors($email)+1;
+ $fileNameUser = $this->yellow->config->get("configDir").$this->yellow->config->get("editUserFile");
+ $status = $this->users->update($fileNameUser, $email, "", "", "", "", $modified, $errors) ? "ok" : "error";
+ if($status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
+ if($errors==$this->yellow->config->get("editBruteForceProtection"))
+ {
+ if($status=="ok")
+ {
+ $status = $this->users->update($fileNameUser, $email, "", "", "", "inactive", $modified, $errors) ? "ok" : "error";
+ if($status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
+ }
+ if($status=="ok")
+ {
+ $status = $this->response->sendMail($scheme, $address, $base, $email, "reactivate") ? "done" : "error";
+ if($status=="error") $this->yellow->page->error(500, "Can't send email on this server!");
+ }
+ }
+ }
+ $this->yellow->page->error(430);
+ }
+
// Check request
function checkRequest($location)
{
@@ -696,6 +752,7 @@ class YellowEdit
$this->response->userRestrictions = $this->getUserRestrictions($email, $location, $fileName);
$this->response->language = $this->getUserLanguage($email);
} else {
+ $this->response->email = $email;
$this->response->action = "fail";
}
} else if(isset($_COOKIE["login"])) {
@@ -706,6 +763,7 @@ class YellowEdit
$this->response->userRestrictions = $this->getUserRestrictions($email, $location, $fileName);
$this->response->language = $this->getUserLanguage($email);
} else {
+ $this->response->email = $email;
$this->response->action = "fail";
}
}
@@ -772,6 +830,7 @@ class YellowResponse
var $rawDataSource; //raw data of page for comparison
var $rawDataEdit; //raw data of page for editing
var $rawDataOutput; //raw data of dynamic output
+ var $email; //response email
var $language; //response language
var $action; //response action
var $status; //response status
@@ -1129,8 +1188,9 @@ class YellowUsers
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
if(!empty($matches[1]) && !empty($matches[2]))
{
- list($hash, $name, $language, $status, $modified, $pending, $home) = explode(',', $matches[2]);
- $this->set($matches[1], $hash, $name, $language, $status, $modified, $pending, $home);
+ list($hash, $name, $language, $status, $modified, $errors, $pending, $home) = explode(',', $matches[2]);
+ if($errors=="none") { $home=$pending; $pending=$errors; $errors="0"; } //TODO: remove later, converts old file format
+ $this->set($matches[1], $hash, $name, $language, $status, $modified, $errors, $pending, $home);
if(defined("DEBUG") && DEBUG>=3) echo "YellowUsers::load email:$matches[1]<br/>\n";
}
}
@@ -1145,11 +1205,12 @@ class YellowUsers
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
if(!empty($matches[1]) && !empty($matches[2]))
{
- list($hash, $name, $language, $status, $modified, $pending, $home) = explode(',', $matches[2]);
+ list($hash, $name, $language, $status, $modified, $errors, $pending, $home) = explode(',', $matches[2]);
+ if($errors=="none") { $home=$pending; $pending=$errors; $errors="0"; } //TODO: remove later, converts old file format
if($status=="active" || $status=="inactive")
{
$pending = "none";
- $fileDataNew .= "$matches[1]: $hash,$name,$language,$status,$modified,$pending,$home\n";
+ $fileDataNew .= "$matches[1]: $hash,$name,$language,$status,$modified,$errors,$pending,$home\n";
}
} else {
$fileDataNew .= $line;
@@ -1159,7 +1220,7 @@ class YellowUsers
}
// Update users in file
- function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $modified = "", $pending = "", $home = "")
+ function update($fileName, $email, $password = "", $name = "", $language = "", $status = "", $modified = "", $errors = "", $pending = "", $home = "")
{
if(!empty($password)) $hash = $this->createHash($password);
if($this->isExisting($email))
@@ -1170,6 +1231,7 @@ class YellowUsers
$language = strreplaceu(',', '-', empty($language) ? $this->users[$email]["language"] : $language);
$status = strreplaceu(',', '-', empty($status) ? $this->users[$email]["status"] : $status);
$modified = strreplaceu(',', '-', empty($modified) ? time() : $modified);
+ $errors = strreplaceu(',', '-', empty($errors) ? "0" : $errors);
$pending = strreplaceu(',', '-', empty($pending) ? $this->users[$email]["pending"] : $pending);
$home = strreplaceu(',', '-', empty($home) ? $this->users[$email]["home"] : $home);
} else {
@@ -1179,28 +1241,29 @@ class YellowUsers
$language = strreplaceu(',', '-', empty($language) ? $this->yellow->config->get("language") : $language);
$status = strreplaceu(',', '-', empty($status) ? $this->yellow->config->get("editUserStatus") : $status);
$modified = strreplaceu(',', '-', empty($modified) ? time() : $modified);
+ $errors = strreplaceu(',', '-', empty($errors) ? "0" : $errors);
$pending = strreplaceu(',', '-', empty($pending) ? "none" : $pending);
$home = strreplaceu(',', '-', empty($home) ? $this->yellow->config->get("editUserHome") : $home);
}
- $this->set($email, $hash, $name, $language, $status, $modified, $pending, $home);
+ $this->set($email, $hash, $name, $language, $status, $modified, $errors, $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,$modified,$pending,$home\n";
+ $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$errors,$pending,$home\n";
$found = true;
} else {
$fileDataNew .= $line;
}
}
- if(!$found) $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$pending,$home\n";
+ if(!$found) $fileDataNew .= "$email: $hash,$name,$language,$status,$modified,$errors,$pending,$home\n";
return $this->yellow->toolbox->createFile($fileName, $fileDataNew);
}
// Set user data
- function set($email, $hash, $name, $language, $status, $modified, $pending, $home)
+ function set($email, $hash, $name, $language, $status, $modified, $errors, $pending, $home)
{
$this->users[$email] = array();
$this->users[$email]["email"] = $email;
@@ -1209,6 +1272,7 @@ class YellowUsers
$this->users[$email]["language"] = $language;
$this->users[$email]["status"] = $status;
$this->users[$email]["modified"] = $modified;
+ $this->users[$email]["errors"] = $errors;
$this->users[$email]["pending"] = $pending;
$this->users[$email]["home"] = $home;
}
@@ -1264,6 +1328,7 @@ class YellowUsers
case "confirm": $statusExpected = "unconfirmed"; break;
case "reconfirm": $statusExpected = "unconfirmed"; break;
case "approve": $statusExpected = "unapproved"; break;
+ case "reactivate": $statusExpected = "inactive"; break;
default: $statusExpected = "active"; break;
}
if($this->isExisting($email) && $this->users[$email]["status"]==$statusExpected &&
@@ -1276,43 +1341,49 @@ class YellowUsers
}
// Return user hash
- function getHash($email = "")
+ function getHash($email)
{
return $this->isExisting($email) ? $this->users[$email]["hash"] : "";
}
// Return user name
- function getName($email = "")
+ function getName($email)
{
return $this->isExisting($email) ? $this->users[$email]["name"] : "";
}
// Return user language
- function getLanguage($email = "")
+ function getLanguage($email)
{
return $this->isExisting($email) ? $this->users[$email]["language"] : "";
}
// Return user status
- function getStatus($email = "")
+ function getStatus($email)
{
return $this->isExisting($email) ? $this->users[$email]["status"] : "";
}
// Return user modified
- function getModified($email = "")
+ function getModified($email)
{
return $this->isExisting($email) ? $this->users[$email]["modified"] : "";
}
+ // Return user errors
+ function getErrors($email)
+ {
+ return $this->isExisting($email) ? $this->users[$email]["errors"] : "";
+ }
+
// Return user pending
- function getPending($email = "")
+ function getPending($email)
{
return $this->isExisting($email) ? $this->users[$email]["pending"] : "";
}
// Return user home
- function getHome($email = "")
+ function getHome($email)
{
return $this->isExisting($email) ? $this->users[$email]["home"] : "";
}
diff --git a/system/plugins/language-de.txt b/system/plugins/language-de.txt
@@ -3,7 +3,7 @@
Language: de
LanguageDescription: Deutsch
LanguageTranslator: David Fehrmann
-LanguageVersion: 0.7.1
+LanguageVersion: 0.7.2
BlogBy: von
BlogFilter: Blog:
@@ -66,6 +66,10 @@ EditApproveSubject: Benutzerkonto genehmigen
EditApproveMessage: Hallo @usershort, bitte genehmige ein neues Benutzerkonto für @useraccount. Klicke auf den folgenden Link.
EditApproveStatusDone: Benutzerkonto wurde genehmigt. Vielen Dank!
EditApproveStatusExpired: Benutzerkonto kann nicht genehmigt werden. Link ist abgelaufen!
+EditReactivateSubject: Benutzerkonto reaktivieren
+EditReactivateMessage: Hallo @usershort, bitte reaktiviere dein Benutzerkonto. Es gab zu viele fehlgeschlagene Anmeldeversuche. Klicke auf den folgenden Link.
+EditReactivateStatusDone: Benutzerkonto wurde reaktiviert. Vielen Dank!
+EditReactivateStatusExpired: Benutzerkonto kann nicht reaktiviert werden. Link ist abgelaufen!
EditRecoverSubject: Benutzerkonto wiederherstellen
EditRecoverMessage: Hallo @usershort, bitte bestätige, dass du dein Kennwort vergessen hast. Klicke auf den folgenden Link.
EditRecoverStatusDone: Benutzerkonto wurde wiederhergestellt. Vielen Dank!
diff --git a/system/plugins/language-en.txt b/system/plugins/language-en.txt
@@ -3,7 +3,7 @@
Language: en
LanguageDescription: English
LanguageTranslator: Mark Seuffert
-LanguageVersion: 0.7.1
+LanguageVersion: 0.7.2
BlogBy: by
BlogFilter: Blog:
@@ -66,6 +66,10 @@ EditApproveSubject: Approve user account
EditApproveMessage: Hi @usershort, please approve a new user account for @useraccount. Click the following link.
EditApproveStatusDone: User account approved. Thank you!
EditApproveStatusExpired: User account can not be approved. Link has expired!
+EditReactivateSubject: Reactivate user account
+EditReactivateMessage: Hi @usershort, please reactivate your user account. There were too many failed login attempts. Click the following link.
+EditReactivateStatusDone: User account reactivated. Thank you!
+EditReactivateStatusExpired: User account can not be reactivated. Link has expired!
EditRecoverSubject: Recover user account
EditRecoverMessage: Hi @usershort, please confirm that you forgot your password. Click the following link.
EditRecoverStatusDone: User account recovered. Thank you!
diff --git a/system/plugins/language-fr.txt b/system/plugins/language-fr.txt
@@ -3,7 +3,7 @@
Language: fr
LanguageDescription: Français
LanguageTranslator: Juh Nibreh
-LanguageVersion: 0.7.1
+LanguageVersion: 0.7.2
BlogBy: par
BlogFilter: Blog:
@@ -66,6 +66,10 @@ EditApproveSubject: Approuver un nouvel utilisateur
EditApproveMessage: Bonjour @usershort, veuillez approuver la création d'un nouveau compte utilisateur pour @useraccount. Cliquez sur le lien suivant.
EditApproveStatusDone: Compte utilisateur approuvé. Merci!
EditApproveStatusExpired: Le compte ne peut pas être approuvé. Le lien de confirmation a expiré!
+EditReactivateSubject: Réactivation d'un compte utilisateur
+EditReactivateMessage: Bonjour @usershort, veuillez réactivér votre compte utilisateur. Il y a eu trop de tentatives de connexion échouées. Cliquez sur le lien suivant.
+EditReactivateStatusDone: Compte d'utilisateur réactivé. Merci!
+EditReactivateStatusExpired: Le compte ne peut pas être réctivé. Le lien de confirmation a expiré!
EditRecoverSubject: Restauration d'un compte utilisateur
EditRecoverMessage: Bonjour @usershort, veuillez confirmer que vous avez oublié votre mot de passe. Cliquez sur le lien suivant.
EditRecoverStatusDone: Compte utilisateur restauré. Merci!
diff --git a/system/plugins/language.php b/system/plugins/language.php
@@ -5,7 +5,7 @@
class YellowLanguage
{
- const VERSION = "0.7.1";
+ const VERSION = "0.7.2";
}
$yellow->plugins->register("language", "YellowLanguage", YellowLanguage::VERSION);