mirror of
				https://github.com/getgrav/grav-plugin-admin.git
				synced 2025-10-30 18:06:16 +01:00 
			
		
		
		
	Separate login and session handling into its own plugin
This commit is contained in:
		
							
								
								
									
										72
									
								
								admin.php
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								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 login() | ||||
|     { | ||||
|         $route = $this->config->get('plugins.admin.route'); | ||||
|         if (!$route) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $this->base = '/' . trim($route, '/'); | ||||
|         $this->uri = $this->grav['uri']; | ||||
|  | ||||
|         // Only activate admin if we're inside the admin path. | ||||
|         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() | ||||
|     { | ||||
|         $route = $this->config->get('plugins.admin.route'); | ||||
|  | ||||
|         if (!$route) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $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 ($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. | ||||
|         // Replace page service with admin. | ||||
|         $this->grav['page'] = function ($c) use ($self) { | ||||
|             $page = new Page; | ||||
|         $page->init(new \SplFileInfo(__DIR__ . "/pages/admin/{$this->template}.md")); | ||||
|         $page->slug(basename($this->template)); | ||||
|             $page->init(new \SplFileInfo(__DIR__ . "/pages/admin/{$self->template}.md")); | ||||
|             $page->slug(basename($self->template)); | ||||
|  | ||||
|         unset($grav['page']); | ||||
|         $grav['page'] = $page; | ||||
|             return $page; | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -1,2 +1,6 @@ | ||||
| enabled: true | ||||
| route: '/admin' | ||||
| login: | ||||
|   enabled: true | ||||
|   route: null | ||||
|   timeout: 1800 | ||||
|   | ||||
| @@ -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. | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| --- | ||||
| title: Configuration | ||||
|  | ||||
| access: | ||||
|     admin.configuration: true | ||||
|     admin.super: true | ||||
| --- | ||||
|   | ||||
| @@ -1,4 +1,8 @@ | ||||
| --- | ||||
| title: Dashboard | ||||
|  | ||||
| access: | ||||
|     admin.login: true | ||||
|     admin.super: true | ||||
| --- | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								pages/admin/denied.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								pages/admin/denied.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| --- | ||||
| title: Access Denied | ||||
| --- | ||||
|  | ||||
| @@ -2,6 +2,7 @@ | ||||
| title: Dashboard Login | ||||
|  | ||||
| form: | ||||
|     fields: | ||||
|         - name: username | ||||
|           type: text | ||||
|           label: Username | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| --- | ||||
| title: Error Log | ||||
|  | ||||
| access: | ||||
|     admin.logs: true | ||||
|     admin.super: true | ||||
| --- | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| --- | ||||
| title: Pages | ||||
|  | ||||
| access: | ||||
|     admin.pages: true | ||||
|     admin.super: true | ||||
| --- | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| --- | ||||
| title: Plugins | ||||
|  | ||||
| access: | ||||
|     admin.plugins: true | ||||
|     admin.super: true | ||||
| --- | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| --- | ||||
| title: Site Settings | ||||
|  | ||||
| access: | ||||
|     admin.settings: true | ||||
|     admin.super: true | ||||
| --- | ||||
|   | ||||
							
								
								
									
										7
									
								
								pages/admin/themes.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								pages/admin/themes.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| --- | ||||
| title: Grav Themes | ||||
|  | ||||
| access: | ||||
|     admin.themes: true | ||||
|     admin.super: true | ||||
| --- | ||||
| @@ -1,3 +0,0 @@ | ||||
| --- | ||||
| title: Grav Themes | ||||
| --- | ||||
| @@ -9,7 +9,7 @@ | ||||
|         {% include 'partials/messages.html.twig' %} | ||||
|  | ||||
|         <form method="post"> | ||||
|             {% for field in page.header.form %} | ||||
|             {% for field in page.header.form.fields %} | ||||
|                 {% if field.type %} | ||||
|                     <div> | ||||
|                         {% include ["forms/fields/#{field.type}/#{field.type}.html.twig", 'forms/fields/text/text.html.twig'] %} | ||||
|   | ||||
| @@ -89,7 +89,7 @@ | ||||
|  | ||||
|         {% block footer_section %} | ||||
|         <footer id="footer"> | ||||
|             <a href="http://getgrav.org">Grav</a> was made with <i class="fa fa-heart"></i> by <a href="http:/www.rockettheme.com">RocketTheme</a>. | ||||
|             <a href="http://getgrav.org">Grav</a> was made with <i class="fa fa-heart"></i> by <a href="http://www.rockettheme.com">RocketTheme</a>. | ||||
|         </footer> | ||||
|         {% endblock %} | ||||
|     </div> | ||||
|   | ||||
							
								
								
									
										13
									
								
								theme/templates/partials/theme.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								theme/templates/partials/theme.html.twig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| {% set theme = admin.themes[admin.route] %} | ||||
| {% set blueprints = theme.blueprints() %} | ||||
|  | ||||
| <h1> | ||||
|     {{ blueprints.get('name')|e }} | ||||
|     <small>{{ blueprints.get('version') ? 'v' ~ blueprints.get('version')|e }}</small> | ||||
| </h1> | ||||
|  | ||||
| {% include 'partials/messages.html.twig' %} | ||||
|  | ||||
| <p>{{ blueprints.get('description') }}</p> | ||||
|  | ||||
| {% include 'partials/blueprints.html.twig' with { data: theme } %} | ||||
| @@ -42,19 +42,7 @@ | ||||
|             </table> | ||||
|         </form> | ||||
|         {% else %} | ||||
|             {% set theme = admin.themes[admin.route] %} | ||||
|             {% set blueprints = theme.blueprints() %} | ||||
|  | ||||
|             <h1> | ||||
|                 {{ blueprints.get('name')|e }} | ||||
|                 <small>{{ blueprints.get('version') ? 'v' ~ blueprints.get('version')|e }}</small> | ||||
|             </h1> | ||||
|  | ||||
|             {% include 'partials/messages.html.twig' %} | ||||
|  | ||||
|             <p>{{ blueprints.get('description') }}</p> | ||||
|  | ||||
|             {% include 'partials/blueprints.html.twig' with { data: theme } %} | ||||
|             {% include 'partials/theme.html.twig' %} | ||||
|         {% endif %} | ||||
|  | ||||
|     </div> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user