mikuli.cz

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

commit e858250e278ed831702640959cc82bebc896c146
parent c5a1f4e5ab7184eadad8395fd47ca28ae91a449f
Author: markseu <mark2011@mayberg.se>
Date:   Wed,  5 Jul 2017 12:25:25 +0200

System update (failed login attempts)

Diffstat:
Msystem/config/config.ini | 1+
Asystem/config/page-error-430.txt | 5+++++
Msystem/plugins/core.php | 81+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msystem/plugins/edit.js | 1+
Msystem/plugins/edit.php | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Msystem/plugins/language-de.txt | 6+++++-
Msystem/plugins/language-en.txt | 6+++++-
Msystem/plugins/language-fr.txt | 6+++++-
Msystem/plugins/language.php | 2+-
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);