System update (failed login attempts)

This commit is contained in:
markseu 2017-07-05 12:25:25 +02:00
parent c5a1f4e5ab
commit e858250e27
9 changed files with 173 additions and 65 deletions

View file

@ -61,6 +61,7 @@ EditUserHome: /
EditLoginEmail:
EditLoginPassword:
EditLoginRestrictions: 0
EditBruteForceProtection: 25
ImageThumbnailLocation: /media/thumbnails/
ImageThumbnailDir: media/thumbnails/
ImageThumbnailJpgQuality: 80

View file

@ -0,0 +1,4 @@
---
Title: Login failed
---
The email or password is incorrect. [Please try again](javascript:yellow.action('login');).

View file

@ -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(defined("DEBUG") && DEBUG>=2)
{
if(method_exists($value["obj"], "onStartup")) $value["obj"]->onStartup(in_array($value["plugin"], $tokens));
$plugins = count($this->plugins->plugins);
$themes = count($this->themes->themes);
echo "YellowCore::load plugins:$plugins themes:$themes time:$time ms<br/>\n";
}
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"));
}
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;
}

View file

@ -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;

View file

@ -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"] : "";
}

View file

@ -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!

View file

@ -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!

View file

@ -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!

View file

@ -5,7 +5,7 @@
class YellowLanguage
{
const VERSION = "0.7.1";
const VERSION = "0.7.2";
}
$yellow->plugins->register("language", "YellowLanguage", YellowLanguage::VERSION);