From 64a88c916cb048896582ae7433293bb82728131f Mon Sep 17 00:00:00 2001 From: Flavio Copes Date: Thu, 7 Jul 2016 18:47:48 +0200 Subject: [PATCH] Feature: Ability to Login with Email Thanks to @gsumpster for https://github.com/getgrav/grav-plugin-admin/pull/685 * implemented email-login, close #674 * changed placeholder text * Fix Utils namespace thing * Drop use * Cleanup styling --- classes/admin.php | 11 ++++++++++- classes/utils.php | 36 ++++++++++++++++++++++++++++++++++++ languages/en.yaml | 5 +++-- pages/admin/login.md | 2 +- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 classes/utils.php diff --git a/classes/admin.php b/classes/admin.php index e8b98e9e..8c79ca41 100644 --- a/classes/admin.php +++ b/classes/admin.php @@ -14,6 +14,7 @@ use Grav\Common\Themes; use Grav\Common\Uri; use Grav\Common\User\User; use Grav\Common\Utils; +use Grav\Plugin\Admin\Utils as AdminUtils; use RocketTheme\Toolbox\File\File; use RocketTheme\Toolbox\File\JsonFile; use RocketTheme\Toolbox\ResourceLocator\UniformResourceIterator; @@ -105,6 +106,9 @@ class Admin $this->user = $this->grav['user']; $this->permissions = []; $language = $this->grav['language']; + + // Load utility class + require_once __DIR__ . '/utils.php'; if ($language->enabled()) { $this->multilang = true; @@ -175,7 +179,12 @@ class Admin public function authenticate($data, $post) { if (!$this->user->authenticated && isset($data['username']) && isset($data['password'])) { - $user = User::load($data['username']); + // Perform RegEX check on submitted username to check for emails + if (filter_var($data['username'], FILTER_VALIDATE_EMAIL)) { + $user = AdminUtils::findUserbyEmail($data['username']); + } else { + $user = User::load($data['username']); + } //default to english if language not set if (empty($user->language)) { diff --git a/classes/utils.php b/classes/utils.php new file mode 100644 index 00000000..e7aa299c --- /dev/null +++ b/classes/utils.php @@ -0,0 +1,36 @@ +findResource('account://'); + $files = array_diff(scandir($account_dir), ['.', '..']); + + foreach ($files as $file) { + if (strpos($file, '.yaml') !== false) { + $user = User::load(trim(substr($file, 0, -5))); + if ($user['email'] == $email) { + return $user; + } + } + } + + // If a User with the provided email cannot be found, then load user with that email as the username + return User::load($email); + } +} diff --git a/languages/en.yaml b/languages/en.yaml index d115784e..c01ea61c 100644 --- a/languages/en.yaml +++ b/languages/en.yaml @@ -171,7 +171,8 @@ PLUGIN_ADMIN: LAST_BACKUP: "Last Backup" FULL_NAME: "Full name" USERNAME: "Username" - EMAIL: "Email" + EMAIL: "Email" + USERNAME_EMAIL: "Username or Email" PASSWORD: "Password" PASSWORD_CONFIRM: "Confirm Password" TITLE: "Title" @@ -577,4 +578,4 @@ PLUGIN_ADMIN: FROM: "from" TO: "to" RELEASE_DATE: "Release Date" - SORT_BY: "Sort By" \ No newline at end of file + SORT_BY: "Sort By" diff --git a/pages/admin/login.md b/pages/admin/login.md index 554d59d1..102b3827 100644 --- a/pages/admin/login.md +++ b/pages/admin/login.md @@ -9,7 +9,7 @@ form: fields: - name: username type: text - placeholder: PLUGIN_ADMIN.USERNAME + placeholder: PLUGIN_ADMIN.USERNAME_EMAIL autofocus: true validate: required: true