diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1b74659..b28fa66 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
+# v2.8.4
+## 03/20/2019
+
+1. [](#improved)
+ * Enable "brute force" protection by default [#195](https://github.com/getgrav/grav-plugin-login/pulls/195)
+ * UPdated various language translations
+1. [](#bugfix)
+ * Set security timeouts in blueprints to use `minutes` rather than `seconds` [#194](https://github.com/getgrav/grav-plugin-login/issues/194)
+ * Send "notification" email to `to` address rather than `from` [#188](https://github.com/getgrav/grav-plugin-login/pulls/188)
+
# v2.8.3
-## 01/25/2018
+## 01/25/2019
1. [](#new)
* Wrap data in `onUserLoginRegisterData` event in object to allow reference
diff --git a/README.md b/README.md
index 8b1b4f0..0e7d227 100644
--- a/README.md
+++ b/README.md
@@ -161,10 +161,10 @@ rememberme:
timeout: 604800 # Timeout in seconds. Defaults to 1 week
name: grav-rememberme # Name prefix of the session cookie
-max_pw_resets_count: 0 # Number of password resets in a specific time frame (0 = unlimited)
+max_pw_resets_count: 2 # Number of password resets in a specific time frame (0 = unlimited)
max_pw_resets_interval: 60 # Time in minutes to track password resets
-max_login_count: 0 # Number of failed login attempts in a specific time frame (0 = unlimited)
-max_login_interval: 2 # Time in minutes to track login attempts
+max_login_count: 5 # Number of failed login attempts in a specific time frame (0 = unlimited)
+max_login_interval: 10 # Time in minutes to track login attempts
user_registration:
enabled: false # Enable User Registration Process
diff --git a/blueprints.yaml b/blueprints.yaml
index e7a965f..15356fa 100644
--- a/blueprints.yaml
+++ b/blueprints.yaml
@@ -1,5 +1,5 @@
name: Login
-version: 2.8.3
+version: 2.8.4
description: Enables user authentication and login screen.
icon: sign-in
author:
@@ -372,7 +372,7 @@ form:
size: x-small
label: PLUGIN_LOGIN.MAX_RESETS_INTERVAL
help: PLUGIN_LOGIN.MAX_RESETS_INTERVAL_HELP
- append: PLUGIN_LOGIN.SECONDS
+ append: PLUGIN_LOGIN.MINUTES
validate:
type: number
min: 1
@@ -392,7 +392,7 @@ form:
size: x-small
label: PLUGIN_LOGIN.MAX_LOGINS_INTERVAL
help: PLUGIN_LOGIN.MAX_LOGINS_INTERVAL_HELP
- append: PLUGIN_LOGIN.SECONDS
+ append: PLUGIN_LOGIN.MINUTES
validate:
type: number
min: 1
diff --git a/classes/Login.php b/classes/Login.php
index c968627..6f03c3d 100755
--- a/classes/Login.php
+++ b/classes/Login.php
@@ -338,7 +338,7 @@ public function sendNotificationEmail(User $user)
$user->email,
$this->grav['base_url_absolute'],
]);
- $to = $this->config->get('plugins.email.from');
+ $to = $this->config->get('plugins.email.to');
if (empty($to)) {
throw new \RuntimeException($this->language->translate('PLUGIN_LOGIN.EMAIL_NOT_CONFIGURED'));
@@ -508,8 +508,8 @@ public function getRateLimiter($context, $maxCount = null, $interval = null)
$interval = $this->grav['config']->get('plugins.login.max_login_interval', 10);
break;
case 'pw_resets':
- $maxCount = $this->grav['config']->get('plugins.login.max_pw_resets_count', 0);
- $interval = $this->grav['config']->get('plugins.login.max_pw_resets_interval', 2);
+ $maxCount = $this->grav['config']->get('plugins.login.max_pw_resets_count', 2);
+ $interval = $this->grav['config']->get('plugins.login.max_pw_resets_interval', 60);
break;
}
$this->rateLimiters[$context] = new RateLimiter($context, $maxCount, $interval);
diff --git a/languages/en.yaml b/languages/en.yaml
index d922e26..583e4ce 100644
--- a/languages/en.yaml
+++ b/languages/en.yaml
@@ -106,6 +106,7 @@ PLUGIN_LOGIN:
MAX_LOGINS_INTERVAL_HELP: "The time interval for the login count value"
TOO_MANY_LOGIN_ATTEMPTS: "Too many failed login attempted in the configured time (%s minutes)"
SECONDS: "seconds"
+ MINUTES: "minutes"
RESETS: "resets"
ATTEMPTS: "attempts"
ROUTES: "Routes"
diff --git a/languages/ru.yaml b/languages/ru.yaml
index 7ceb1ee..fed863a 100644
--- a/languages/ru.yaml
+++ b/languages/ru.yaml
@@ -51,6 +51,7 @@ PLUGIN_LOGIN:
EMAIL_FOOTER: "GetGrav.org"
ACTIVATION_LINK_EXPIRED: "Время ссылки для активации истекло"
USER_ACTIVATED_SUCCESSFULLY: "Пользователь успешно активирован"
+ USER_ACTIVATED_SUCCESSFULLY_NOT_ENABLED: "Аккаунт пользователя активирован, но учетная запись просматривается"
INVALID_REQUEST: "Неверный запрос"
USER_REGISTRATION: "Регистрация пользователя"
USER_REGISTRATION_ENABLED_HELP: "Включить регистрацию пользователя"
@@ -127,3 +128,5 @@ PLUGIN_LOGIN:
2FA_SECRET_HELP: "Сканируйте этот QR-код в свое [Приложение аутентификации](https://learn.getgrav.org/admin-panel/2fa#apps). Также рекомендуется сохранить секрет в безопасном месте, если вам прийдется переустановить приложение. Проверьте [Grav docs](https://learn.getgrav.org/admin-panel/2fa) для дополнительной информации "
2FA_REGENERATE: "Сгенерировать повторно"
BTN_CANCEL: "Отмена"
+ MANUALLY_ENABLE: "Вручную включить"
+ MANUALLY_ENABLE_HELP: "При использовании «активации по электронной почте» и «уведомление по электронной почте» вы можете убедиться, что пользователь может самостоятельно активироваться, но пользователь требует ручного включения для входа в систему"
diff --git a/languages/uk.yaml b/languages/uk.yaml
new file mode 100644
index 0000000..fe29a38
--- /dev/null
+++ b/languages/uk.yaml
@@ -0,0 +1,132 @@
+PLUGIN_LOGIN:
+ USERNAME: "Логін"
+ EMAIL: "Email"
+ USERNAME_EMAIL: "Логін/Email"
+ PASSWORD: "Пароль"
+ ACCESS_DENIED: "Доступ заборонено..."
+ LOGIN_FAILED: "Помилка входу..."
+ LOGIN_SUCCESSFUL: "Ви успішно увійшли в систему."
+ BTN_LOGIN: "Увійти"
+ BTN_LOGOUT: "Вийти"
+ BTN_FORGOT: "Забув"
+ BTN_REGISTER: "Реєстрація"
+ BTN_RESET: "Скидання пароля"
+ BTN_SEND_INSTRUCTIONS: "Надіслати інструкції по скиданню"
+ RESET_LINK_EXPIRED: "Час посилання для скидання минув, спробуйте ще раз"
+ RESET_PASSWORD_RESET: "Пароль був скинутий"
+ RESET_INVALID_LINK: "Невірне посилання скидання, спробуйте ще раз"
+ FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Інструкції щодо скидання пароля були надіслані по електронній пошті"
+ FORGOT_FAILED_TO_EMAIL: "Не вдалося надіслати інструкції електронною поштою, повторіть спробу пізніше"
+ FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Не вдається скинути пароль для %s, адреса електронної пошти не встановлена"
+ FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Неможливо скинути пароль для %s, цей email пов'язаний з віддаленим обліковим записом"
+ FORGOT_USERNAME_DOES_NOT_EXIST: "Користувач з ім'ям %s не існує"
+ FORGOT_EMAIL_NOT_CONFIGURED: "Неможливо скинути пароль. Цей сайт не налаштований для надіслання листів"
+ FORGOT_EMAIL_SUBJECT: "%s Запит на скидання пароля"
+ FORGOT_EMAIL_BODY: "
Відновлення паролю
Шановний %1$s,
Був зроблений запит для скидання пароля від %4$s.
Нажмите, чтобы сбросить пароль
Или скопируйте следующий URL-адрес в адресную строку браузера:
%2$s
С уважением,
%3$s
"
+ SESSION: "“Запам'ятати мене”-Сесія"
+ REMEMBER_ME: "Запам'ятати мене"
+ REMEMBER_ME_HELP: "Встановлює постійний файл cookie у вашому браузері, щоб дозволити постійну аутентифікацію входу між сеансами."
+ REMEMBER_ME_STOLEN_COOKIE: "Хтось ще використовував вашу реєстраційну інформацію для доступу до цієї сторінки! Всі сеанси були відключені. Увійдіть до свого облікового запису та перевірте свої дані."
+ BUILTIN_CSS: "Використовувати вбудований CSS"
+ BUILTIN_CSS_HELP: "Використовувати CSS, наданий плагіном адміністратора."
+ ROUTE: "Шлях сторінки входу"
+ ROUTE_HELP: "Шлях до користувальницької сторінці входу, яку надає ваша тема"
+ ROUTE_REGISTER: "Шлях реєстрації"
+ ROUTE_REGISTER_HELP: "Шлях до користувальницької сторінці реєстрації. Заповніть, якщо ви хочете використовувати вбудовану сторінку реєстрації. Залиште його порожнім, якщо у вас є власна реєстраційна форма"
+ USERNAME_NOT_VALID: "Ім'я користувача має бути від 3 до 16 символів, включаючи малі літери, цифри, символи підкреслення та дефіси. Великі літери, пробіли та спеціальні символи не допускаються"
+ USERNAME_NOT_AVAILABLE: "Ім'я користувача %s вже існує, виберіть інше ім'я користувача"
+ EMAIL_NOT_AVAILABLE: "Адреса електронної пошти %s вже існує, виберіть іншу адресу електронної пошти"
+ PASSWORD_NOT_VALID: "Пароль повинен містити як мінімум одне число, одну прописну і малу літеру, і бути не менше 8 символів"
+ PASSWORDS_DO_NOT_MATCH: "Паролі не співпадають. Двічі перевірте, що ви двічі ввели той же пароль"
+ USER_NEEDS_EMAIL_FIELD: "Користувачеві потрібно поле електронної пошти"
+ EMAIL_SENDING_FAILURE: "Помилка під час надіслання листа"
+ ACTIVATION_EMAIL_SUBJECT: "Активуйте свій обліковий запис %s"
+ ACTIVATION_EMAIL_BODY: "Привіт %s, перейдіть сюди для активації вашого облікового запису %s"
+ ACTIVATION_NOTICE_MSG: "Привіт %s, ваш обліковий запис створено, будь ласка перевірте електронну пошту, щоб повністю його активувати"
+ WELCOME_EMAIL_SUBJECT: "Ласкаво просимо в %s"
+ WELCOME_EMAIL_BODY: "Привіт %s, ласкаво просимо в %s!"
+ WELCOME_NOTICE_MSG: "Привіт %s, ваш обліковий запис був успішно створений"
+ NOTIFICATION_EMAIL_SUBJECT: "Новий користувач %s"
+ NOTIFICATION_EMAIL_BODY: "Привіт, новий користувач, зареєстрований на %s. Ім'я користувача: %s, email: %s"
+ EMAIL_FOOTER: "GetGrav.org"
+ ACTIVATION_LINK_EXPIRED: "Час посилання для активації минув"
+ USER_ACTIVATED_SUCCESSFULLY: "Користувач успішно активований"
+ USER_ACTIVATED_SUCCESSFULLY_NOT_ENABLED: "Аккаунт користувача активований, але обліковий запис проглядається"
+ INVALID_REQUEST: "Невірний запит"
+ USER_REGISTRATION: "Реєстрація користувача"
+ USER_REGISTRATION_ENABLED_HELP: "Включити реєстрацію користувача"
+ VALIDATE_PASSWORD1_AND_PASSWORD2: "Подвійна перевірка введеного пароля"
+ VALIDATE_PASSWORD1_AND_PASSWORD2_HELP: "Підтвердити і порівняти два різних поля для паролів з іменами `password1` і` password2`. Увімкніть це, якщо у вас є два поля пароля в реєстраційній формі"
+ SET_USER_DISABLED: "Встановити користувача як відключений"
+ SET_USER_DISABLED_HELP: "Найкраще використовувати електронну пошту «Надіслати електронну пошту активації». Додає користувача в Grav, але встановлює його як відключений"
+ LOGIN_AFTER_REGISTRATION: "Вхід в систему після реєстрації"
+ LOGIN_AFTER_REGISTRATION_HELP: "Автоматичний вхід в систему після реєстрації. Якщо потрібна активація електронної пошти, користувач буде входити в систему відразу після активації облікового запису"
+ SEND_ACTIVATION_EMAIL: "Надіслати лист активації"
+ SEND_ACTIVATION_EMAIL_HELP: "Надіслати електронного листа користувачу для активації облікового запису. Увімкніть параметр «Встановити користувача як відключений» при використанні цієї функції, щоб користувач був відключений, і для активації облікового запису буде надіслано повідомлення електронної пошти"
+ SEND_NOTIFICATION_EMAIL: "Надіслати повідомлення по електронній пошті"
+ SEND_NOTIFICATION_EMAIL_HELP: "Повідомляє адміністратору сайту про реєстрацію нового користувача. Електронна пошта буде відправлена в поле «Кому» в конфігурації плагіна електронної пошти"
+ SEND_WELCOME_EMAIL: "Надіслати вітальний лист"
+ SEND_WELCOME_EMAIL_HELP: "Надсилає електронного листа знову зареєстрованому користувачу"
+ DEFAULT_VALUES: "Значення за замовчуванням"
+ DEFAULT_VALUES_HELP: "Список назв полів і пов'язаних значень, які будуть додані в профіль користувача (файл yaml) за замовчуванням, без налаштування користувачем. Розділіть декілька значень комою, без пробілів між значеннями"
+ ADDITIONAL_PARAM_KEY: "Параметр"
+ ADDITIONAL_PARAM_VALUE: "Значення"
+ REGISTRATION_FIELDS: "Реєстраційні поля"
+ REGISTRATION_FIELDS_HELP: "Додайте поля, які будуть додані в файл yaml користувача. Поля, не перераховані тут, не будуть додані, навіть якщо вони присутні в реєстраційній формі"
+ REGISTRATION_FIELD_KEY: "Ім'я поля"
+ REDIRECT_AFTER_LOGIN: "Перенаправлення після входу в систему"
+ REDIRECT_AFTER_LOGIN_HELP: "Призначений для користувача маршрут для перенаправлення після входу в систему"
+ REDIRECT_AFTER_LOGOUT: "Перенаправлення після виходу з системи"
+ REDIRECT_AFTER_LOGOUT_HELP: "Призначений для користувача маршрут для перенаправлення після виходу з системи"
+ REDIRECT_AFTER_REGISTRATION: "Перенаправлення після реєстрації"
+ REDIRECT_AFTER_REGISTRATION_HELP: "Призначений для користувача маршрут для перенаправлення після реєстрації"
+ OPTIONS: "Опції"
+ EMAIL_VALIDATION_MESSAGE: "Адреса ел. пошти повинна бути дійсною"
+ PASSWORD_VALIDATION_MESSAGE: "Пароль повинен містити як мінімум одне число, одну прописну і малу літеру і бути не менше 8 символів"
+ TIMEOUT_HELP: "Встановлює тайм-аут сеансу в секундах, коли функція «Запам'ятати мене» включена і встановлена користувачем. Мінімум 604800, що означає 1 тиждень"
+ GROUPS_HELP: "Список груп, в які увійде новий зареєстрований користувач"
+ SITE_ACCESS_HELP: "Список рівнів доступу до сайту, зареєстрованих користувачів. Приклад: `login` ->` true`"
+ WELCOME: "Ласкаво просимо"
+ REDIRECT_AFTER_ACTIVATION: "Перенаправлення після активації користувача"
+ REDIRECT_AFTER_ACTIVATION_HELP: "Використовується, якщо користувачеві потрібно активувати обліковий запис по електронній пошті. Після активації цей маршрут буде показаний"
+ REGISTRATION_DISABLED: "Реєстрація відключена"
+ USE_PARENT_ACL_LABEL: "Використовувати батьківські правила доступу"
+ USE_PARENT_ACL_HELP: "Перевірте правила доступу до батьків, якщо правила не визначені"
+ PROTECT_PROTECTED_PAGE_MEDIA_LABEL: "Захист захищених сторінок."
+ PROTECT_PROTECTED_PAGE_MEDIA_HELP: "Якщо цей параметр включений, то доступ до захищеної сторінці для входу в систему також захищений паролем, і його не можна побачити, якщо він не зареєстрований"
+ SECURITY_TAB: "Безпека"
+ MAX_RESETS_COUNT: "Максимальна кількість скидання пароля"
+ MAX_RESETS_COUNT_HELP: "Налаштування захисту пароля від флуду (0 - не обмежена)"
+ MAX_RESETS_INTERVAL: "Максимальний інтервал скидання пароля"
+ MAX_RESETS_INTERVAL_HELP: "Інтервал часу для максимальної кількості скидання пароля"
+ FORGOT_CANNOT_RESET_IT_IS_BLOCKED: "Неможливо скинути пароль для %s, функція скидання пароля тимчасово відключена, спробуйте пізніше (максимум %s хвилин)"
+ MAX_LOGINS_COUNT: "Максимальна кількість входів"
+ MAX_LOGINS_COUNT_HELP: "Налаштування захисту від флуду (0 - не обмежена)"
+ MAX_LOGINS_INTERVAL: "Максимальний інтервал входу"
+ MAX_LOGINS_INTERVAL_HELP: "Часовий інтервал для значення лічильника входу"
+ TOO_MANY_LOGIN_ATTEMPTS: "Занадто багато невдалих спроб входу в налаштований час (%s хвилин)"
+ SECONDS: "секунд"
+ RESETS: "скидань"
+ ATTEMPTS: "спроб"
+ ROUTES: "Маршрути"
+ ROUTE_FORGOT: "Забули пароль"
+ ROUTE_RESET: "Скидання пароля"
+ ROUTE_PROFILE: "Профілю користувача"
+ ROUTE_ACTIVATE: "Активації користувача"
+ LOGGED_OUT: "Ви успішно вийшли з системи..."
+ PAGE_RESTRICTED: "Доступ обмежений, увійдіть в систему..."
+ DYNAMIC_VISIBILITY: "Динамічна видимість сторінки"
+ DYNAMIC_VISIBILITY_HELP: "Дозволяє динамічно обробляти видимість сторінки на основі правил доступу, якщо для параметра login.visibility_requires_access встановлено значення true на сторінці"
+ USER_IS_REMOTE_ONLY: "Цей користувач аутентифікований за допомогою віддаленого сервісу, тому профіль не може бути збережений"
+ 2FA_TITLE: "2-факторна аутентифікація"
+ 2FA_INSTRUCTIONS: "##### 2-факторна аутентифікація\nУ вашому обліковому запису включена **2FA**. Будь ласка, використовуйте свою **2FA** програму для введення цього **6-значного коду** для завершення процесу входу в систему."
+ 2FA_REGEN_HINT: "Щоб відновити секрет, вам буде потрібно оновити програму для аутентифікації"
+ 2FA_FAILED: "Неприпустимий код перевірки справжності 2-факторної аутентифікації, спробуйте ще раз...."
+ 2FA_ENABLED: "2FA Включена"
+ 2FA_CODE_INPUT: "000000"
+ 2FA_SECRET: "2FA Секрет"
+ 2FA_SECRET_HELP: "Відскануйте цей QR-код у свою [Програму аутентифікації](https://learn.getgrav.org/admin-panel/2fa#apps). Також рекомендується зберегти секрет в безпечному місці, якщо вам доведеться перевстановити програму. Перевірте [Grav docs](https://learn.getgrav.org/admin-panel/2fa) для додаткової інформації "
+ 2FA_REGENERATE: "Згенерувати повторно"
+ BTN_CANCEL: "Скасування"
+ MANUALLY_ENABLE: "Вручну включити"
+ MANUALLY_ENABLE_HELP: "При використанні «активації по електронній пошті» і «повідомлення по електронній пошті» ви можете переконатися, що користувач може самостійно активуватися, але користувач вимагає ручного включення для входу в систему"
diff --git a/login.yaml b/login.yaml
index 50da400..cdddab3 100644
--- a/login.yaml
+++ b/login.yaml
@@ -20,10 +20,10 @@ rememberme:
timeout: 604800 # Timeout in seconds. Defaults to 1 week
name: grav-rememberme # Name prefix of the session cookie
-max_pw_resets_count: 0 # Number of password resets in a specific time frame (0 = unlimited)
+max_pw_resets_count: 2 # Number of password resets in a specific time frame (0 = unlimited)
max_pw_resets_interval: 60 # Time in minutes to track password resets
-max_login_count: 0 # Number of failed login attempts in a specific time frame (0 = unlimited)
-max_login_interval: 2 # Time in minutes to track login attempts
+max_login_count: 5 # Number of failed login attempts in a specific time frame (0 = unlimited)
+max_login_interval: 10 # Time in minutes to track login attempts
user_registration:
enabled: false # Enable User Registration Process