diff --git a/admin.php b/admin.php index 190350e0..3fdd014d 100644 --- a/admin.php +++ b/admin.php @@ -40,7 +40,7 @@ class AdminPlugin extends Plugin */ public static function getSubscribedEvents() { return [ - 'onPluginsInitialized' => ['onPluginsInitialized', 1000] + 'onPluginsInitialized' => [['login', 100000], ['onPluginsInitialized', 1000]] ]; } @@ -49,22 +49,39 @@ class AdminPlugin extends Plugin * * Disables system cache. */ - public function onPluginsInitialized() + public function login() { $route = $this->config->get('plugins.admin.route'); - if (!$route) { return; } + $this->base = '/' . trim($route, '/'); $this->uri = $this->grav['uri']; - $base = '/' . trim($route, '/'); // Only activate admin if we're inside the admin path. - if (substr($this->uri->route(), 0, strlen($base)) == $base) { + if (substr($this->uri->route(), 0, strlen($this->base)) == $this->base) { + // Disable system caching. + $this->config->set('system.cache.enabled', false); + + // Change login behavior. + $this->config->set('plugins.login', $this->config->get('plugins.admin.login')); + + $this->active = true; + } + } + + /** + * Initialize administration plugin if admin path matches. + * + * Disables system cache. + */ + public function onPluginsInitialized() + { + // Only activate admin if we're inside the admin path. + if ($this->active) { $this->enable([ 'onPagesInitialized' => ['onPagesInitialized', 1000], - 'onPageInitialized' => ['onPageInitialized', 1000], 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 1000], 'onTwigSiteVariables' => ['onTwigSiteVariables', 1000] ]); @@ -72,8 +89,11 @@ class AdminPlugin extends Plugin // Disable system caching. $this->config->set('system.cache.enabled', false); + // Change login behavior. + $this->config->set('plugins.login', $this->config->get('plugins.admin.login')); + // Decide admin template and route. - $path = trim(substr($this->uri->route(), strlen($base)), '/'); + $path = trim(substr($this->uri->route(), strlen($this->base)), '/'); $this->template = 'dashboard'; if ($path) { @@ -89,7 +109,7 @@ class AdminPlugin extends Plugin // Initialize admin class. require_once __DIR__ . '/classes/admin.php'; - $this->admin = new Admin($this->grav, $base, $this->template, $this->route); + $this->admin = new Admin($this->grav, $this->base, $this->template, $this->route); // And store the class into DI container. $this->grav['admin'] = $this->admin; @@ -107,18 +127,12 @@ class AdminPlugin extends Plugin /** @var Pages $pages */ $pages = $this->grav['pages']; $pages->dispatch('/', true)->route($home); - } - /** - * Main administration controller. - */ - public function onPageInitialized() - { // Set page if user hasn't been authorised. - if (!$this->admin->authorise()) { +/* if (!$this->admin->authorise()) { $this->template = $this->admin->user ? 'denied' : 'login'; } - +*/ // Make local copy of POST. $post = !empty($_POST) ? $_POST : array(); @@ -135,16 +149,16 @@ class AdminPlugin extends Plugin exit(); } - /** @var Grav $grav */ - $grav = $this->grav; + $self = $this; - // Finally create admin page. - $page = new Page; - $page->init(new \SplFileInfo(__DIR__ . "/pages/admin/{$this->template}.md")); - $page->slug(basename($this->template)); + // Replace page service with admin. + $this->grav['page'] = function ($c) use ($self) { + $page = new Page; + $page->init(new \SplFileInfo(__DIR__ . "/pages/admin/{$self->template}.md")); + $page->slug(basename($self->template)); - unset($grav['page']); - $grav['page'] = $page; + return $page; + }; } /** diff --git a/admin.yaml b/admin.yaml index 6ae77200..29cfd4b6 100644 --- a/admin.yaml +++ b/admin.yaml @@ -1,2 +1,6 @@ enabled: true route: '/admin' +login: + enabled: true + route: null + timeout: 1800 diff --git a/classes/admin.php b/classes/admin.php index 1a83426b..0b33cea3 100644 --- a/classes/admin.php +++ b/classes/admin.php @@ -2,7 +2,6 @@ namespace Grav\Plugin; use Grav\Common\User\User; -use Grav\Common\User\Authentication; use Grav\Common\Filesystem\File; use Grav\Common\Grav; use Grav\Common\Plugins; @@ -40,11 +39,6 @@ class Admin */ protected $blueprints; - /** - * @var string - */ - public $message; - /** * @var string */ @@ -61,7 +55,7 @@ class Admin public $route; /** - * @var array + * @var User */ public $user; @@ -80,17 +74,9 @@ class Admin $this->location = $location; $this->route = $route; - /** @var Uri uri */ $this->uri = $this->grav['uri']; - - // TODO: add session timeout into configuration - $this->session = new Session\Session(1800, $this->uri->rootUrl(false) . $base); - $this->session->start(); - - // Get current user from the session. - if (isset($this->session->user)) { - $this->user = $this->session->user; - } + $this->session = $this->grav['session']; + $this->user = $this->grav['user']; } /** @@ -111,12 +97,8 @@ class Admin */ public function setMessage($msg, $type = 'info') { - if (!isset($this->session->messages)) { - $this->session->messages = new Session\Message; - } - /** @var Session\Message $messages */ - $messages = $this->session->messages; + $messages = $this->grav['messages']; $messages->add($msg, $type); } @@ -124,14 +106,13 @@ class Admin * Fetch and delete messages from the session queue. * * @param string $type + * @return array */ public function messages($type = null) { - if (!isset($this->session->messages)) { - $this->session->messages = new Session\Message; - } - - return $this->session->messages->fetch($type); + /** @var Session\Message $messages */ + $messages = $this->grav['messages']; + return $messages->fetch($type); } /** @@ -142,11 +123,11 @@ class Admin */ public function authenticate($form) { - if (!$this->session->user && isset($form['username']) && isset($form['password'])) { + if (!$this->user->authenticated && isset($form['username']) && isset($form['password'])) { $file = File\Yaml::instance(ACCOUNTS_DIR . $form['username'] . YAML_EXT); if ($file->exists()) { $user = new User($file->content()); - print_r($user); + $user->authenticated = true; // Authenticate user. $result = $user->authenticate($form['password']); @@ -172,7 +153,7 @@ class Admin */ public function authorise($action = 'admin.login') { - return isset($this->user) && $this->user->authorise($action); + return $this->user->authorise($action); } /** @@ -352,9 +333,7 @@ class Admin $page->filePath($parent->path().'/'.$slug.'/'.$page->name()); $page->header(); - // Attach page to parent and add routing information. - // FIXME: - $parent->{$slug} = $page; + // Add routing information. $pages->addPage($page, $path); // Determine page type. diff --git a/pages/admin/configuration.md b/pages/admin/configuration.md index 460f7639..f38e9b84 100644 --- a/pages/admin/configuration.md +++ b/pages/admin/configuration.md @@ -1,3 +1,7 @@ --- title: Configuration + +access: + admin.configuration: true + admin.super: true --- diff --git a/pages/admin/dashboard.md b/pages/admin/dashboard.md index 79f0eb57..8a50aa19 100644 --- a/pages/admin/dashboard.md +++ b/pages/admin/dashboard.md @@ -1,4 +1,8 @@ --- title: Dashboard + +access: + admin.login: true + admin.super: true --- diff --git a/pages/admin/denied.md b/pages/admin/denied.md new file mode 100644 index 00000000..1dc329d0 --- /dev/null +++ b/pages/admin/denied.md @@ -0,0 +1,4 @@ +--- +title: Access Denied +--- + diff --git a/pages/admin/login.md b/pages/admin/login.md index cf7fd7c0..28be25f0 100644 --- a/pages/admin/login.md +++ b/pages/admin/login.md @@ -2,12 +2,13 @@ title: Dashboard Login form: - - name: username - type: text - label: Username + fields: + - name: username + type: text + label: Username - - name: password - type: password - label: Password + - name: password + type: password + label: Password --- diff --git a/pages/admin/logs.md b/pages/admin/logs.md index 33f07c62..58d64350 100644 --- a/pages/admin/logs.md +++ b/pages/admin/logs.md @@ -1,3 +1,7 @@ --- title: Error Log + +access: + admin.logs: true + admin.super: true --- diff --git a/pages/admin/pages.md b/pages/admin/pages.md index da761cbf..b1f7fc40 100644 --- a/pages/admin/pages.md +++ b/pages/admin/pages.md @@ -1,3 +1,7 @@ --- title: Pages + +access: + admin.pages: true + admin.super: true --- diff --git a/pages/admin/plugins.md b/pages/admin/plugins.md index 298ff164..d61155fc 100644 --- a/pages/admin/plugins.md +++ b/pages/admin/plugins.md @@ -1,3 +1,7 @@ --- title: Plugins + +access: + admin.plugins: true + admin.super: true --- diff --git a/pages/admin/settings.md b/pages/admin/settings.md index 05c8d0e9..699bf794 100644 --- a/pages/admin/settings.md +++ b/pages/admin/settings.md @@ -1,3 +1,7 @@ --- title: Site Settings + +access: + admin.settings: true + admin.super: true --- diff --git a/pages/admin/themes.md b/pages/admin/themes.md new file mode 100644 index 00000000..57d6217a --- /dev/null +++ b/pages/admin/themes.md @@ -0,0 +1,7 @@ +--- +title: Grav Themes + +access: + admin.themes: true + admin.super: true +--- diff --git a/pages/admin/themes/themes.md b/pages/admin/themes/themes.md deleted file mode 100644 index 7f15885b..00000000 --- a/pages/admin/themes/themes.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Grav Themes ---- diff --git a/theme/templates/login.html.twig b/theme/templates/login.html.twig index fd2a7a97..9f37ccf3 100644 --- a/theme/templates/login.html.twig +++ b/theme/templates/login.html.twig @@ -9,7 +9,7 @@ {% include 'partials/messages.html.twig' %}
{% else %} - {% set theme = admin.themes[admin.route] %} - {% set blueprints = theme.blueprints() %} - -{{ blueprints.get('description') }}
- - {% include 'partials/blueprints.html.twig' with { data: theme } %} + {% include 'partials/theme.html.twig' %} {% endif %}