Merge branch 'feature/login-separation' of bitbucket.org:rockettheme/grav-plugin-admin into feature/redesign

Conflicts:
	admin.php
	admin.yaml
	pages/admin/login.md
	pages/admin/themes.md
This commit is contained in:
Matias Griese
2014-09-09 07:57:53 +03:00
21 changed files with 235 additions and 120 deletions

134
admin.php
View File

@@ -47,7 +47,7 @@ class AdminPlugin extends Plugin
*/ */
public static function getSubscribedEvents() { public static function getSubscribedEvents() {
return [ return [
'onPluginsInitialized' => ['onPluginsInitialized', 1000], 'onPluginsInitialized' => [['login', 100000], ['onPluginsInitialized', 1000]],
'onShutdown' => ['onShutdown', 1000] 'onShutdown' => ['onShutdown', 1000]
]; ];
} }
@@ -57,21 +57,45 @@ class AdminPlugin extends Plugin
* *
* Disables system cache. * Disables system cache.
*/ */
public function onPluginsInitialized() public function login()
{ {
// Check for Pro version and disable this plugin if found // Check for Pro version and disable this plugin if found
// if (file_exists(PLUGINS_DIR . 'admin_pro/admin_pro.php')) { // if (file_exists(PLUGINS_DIR . 'admin_pro/admin_pro.php')) {
// $this->enabled = false; // $this->enabled = false;
// return; // return;
// } // }
// echo "<h1>Admin Free</h1>"; $route = $this->config->get('plugins.admin.route');
// if (!$route) {
require_once PLUGINS_DIR . 'admin/classes/popularity.php'; return;
$this->popularity = new Popularity(); }
$this->initializeAdmin(); $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()
{
// Only activate admin if we're inside the admin path.
if ($this->active) {
$this->initializeAdmin();
}
} }
/** /**
@@ -88,17 +112,6 @@ class AdminPlugin extends Plugin
$this->grav['admin']->routes = $pages->routes(); $this->grav['admin']->routes = $pages->routes();
$pages->dispatch('/', true)->route($home); $pages->dispatch('/', true)->route($home);
}
/**
* Main administration controller.
*/
public function onPageInitialized()
{
// Set page if user hasn't been authorised.
if (!$this->admin->authorise()) {
$this->template = $this->admin->user ? 'denied' : 'login';
}
// Make local copy of POST. // Make local copy of POST.
$post = !empty($_POST) ? $_POST : array(); $post = !empty($_POST) ? $_POST : array();
@@ -116,16 +129,16 @@ class AdminPlugin extends Plugin
exit(); exit();
} }
/** @var Grav $grav */ $self = $this;
$grav = $this->grav;
// Finally create admin page. // Replace page service with admin.
$page = new Page; $this->grav['page'] = function ($c) use ($self) {
$page->init(new \SplFileInfo(__DIR__ . "/pages/admin/{$this->template}.md")); $page = new Page;
$page->slug(basename($this->template)); $page->init(new \SplFileInfo(__DIR__ . "/pages/admin/{$self->template}.md"));
$page->slug(basename($self->template));
unset($grav['page']); return $page;
$grav['page'] = $page; };
} }
/** /**
@@ -181,52 +194,41 @@ class AdminPlugin extends Plugin
protected function initializeAdmin() protected function initializeAdmin()
{ {
$this->route = $this->config->get('plugins.admin.route'); $this->enable([
'onPagesInitialized' => ['onPagesInitialized', 1000],
'onTwigTemplatePaths' => ['onTwigTemplatePaths', 1000],
'onTwigSiteVariables' => ['onTwigSiteVariables', 1000]
]);
if (!$this->route) { require_once PLUGINS_DIR . 'admin/classes/popularity.php';
return; $this->popularity = new Popularity();
}
$this->uri = $this->grav['uri']; // Disable system caching.
$base = '/' . trim($this->route, '/'); $this->config->set('system.cache.enabled', false);
// Only activate admin if we're inside the admin path. // Change login behavior.
if (substr($this->uri->route(), 0, strlen($base)) == $base) { $this->config->set('plugins.login', $this->config->get('plugins.admin.login'));
$this->active = true;
$this->enable([
'onPagesInitialized' => ['onPagesInitialized', 1000],
'onPageInitialized' => ['onPageInitialized', 1000],
'onTwigTemplatePaths' => ['onTwigTemplatePaths', 1000],
'onTwigSiteVariables' => ['onTwigSiteVariables', 1000]
]);
// Disable system caching. // Decide admin template and route.
$this->config->set('system.cache.enabled', false); $path = trim(substr($this->uri->route(), strlen($this->base)), '/');
$this->template = 'dashboard';
// Decide admin template and route. if ($path) {
$path = trim(substr($this->uri->route(), strlen($base)), '/'); $array = explode('/', $path, 2);
$this->template = 'dashboard'; $this->template = array_shift($array);
$this->route = array_shift($array);
if ($path) { // Set path for new page.
$array = explode('/', $path, 2); if ($this->uri->param('new')) {
$this->template = array_shift($array); $this->route .= '/new';
$this->route = array_shift($array);
// Set path for new page.
if ($this->uri->param('new')) {
$this->route .= '/new';
}
} }
// Initialize admin class.
require_once PLUGINS_DIR . 'admin/classes/admin.php';
$this->admin = new Admin($this->grav, $base, $this->template, $this->route);
// And store the class into DI container.
$this->grav['admin'] = $this->admin;
} }
// Initialize admin class.
require_once __DIR__ . '/classes/admin.php';
$this->admin = new Admin($this->grav, $this->base, $this->template, $this->route);
// And store the class into DI container.
$this->grav['admin'] = $this->admin;
} }
} }

View File

@@ -1,5 +1,10 @@
enabled: true enabled: true
route: '/admin' route: '/admin'
theme: grav
login:
enabled: true
route: null
timeout: 1800
popularity: popularity:
enabled: true enabled: true
ignore: ['/test*','/modular'] ignore: ['/test*','/modular']
@@ -7,4 +12,3 @@ popularity:
daily: 7 daily: 7
monthly: 12 monthly: 12
visitors: 20 visitors: 20
theme: grav

View File

@@ -2,7 +2,6 @@
namespace Grav\Plugin; namespace Grav\Plugin;
use Grav\Common\User\User; use Grav\Common\User\User;
use Grav\Common\User\Authentication;
use Grav\Common\Filesystem\File; use Grav\Common\Filesystem\File;
use Grav\Common\Grav; use Grav\Common\Grav;
use Grav\Common\Plugins; use Grav\Common\Plugins;
@@ -40,11 +39,6 @@ class Admin
*/ */
protected $blueprints; protected $blueprints;
/**
* @var string
*/
public $message;
/** /**
* @var string * @var string
*/ */
@@ -61,7 +55,7 @@ class Admin
public $route; public $route;
/** /**
* @var array * @var User
*/ */
public $user; public $user;
@@ -81,17 +75,9 @@ class Admin
$this->location = $location; $this->location = $location;
$this->route = $route; $this->route = $route;
/** @var Uri uri */
$this->uri = $this->grav['uri']; $this->uri = $this->grav['uri'];
$this->session = $this->grav['session'];
// TODO: add session timeout into configuration $this->user = $this->grav['user'];
$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;
}
} }
/** /**
@@ -112,12 +98,8 @@ class Admin
*/ */
public function setMessage($msg, $type = 'info') public function setMessage($msg, $type = 'info')
{ {
if (!isset($this->session->messages)) {
$this->session->messages = new Session\Message;
}
/** @var Session\Message $messages */ /** @var Session\Message $messages */
$messages = $this->session->messages; $messages = $this->grav['messages'];
$messages->add($msg, $type); $messages->add($msg, $type);
} }
@@ -125,14 +107,13 @@ class Admin
* Fetch and delete messages from the session queue. * Fetch and delete messages from the session queue.
* *
* @param string $type * @param string $type
* @return array
*/ */
public function messages($type = null) public function messages($type = null)
{ {
if (!isset($this->session->messages)) { /** @var Session\Message $messages */
$this->session->messages = new Session\Message; $messages = $this->grav['messages'];
} return $messages->fetch($type);
return $this->session->messages->fetch($type);
} }
/** /**
@@ -143,10 +124,11 @@ class Admin
*/ */
public function authenticate($form) 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); $file = File\Yaml::instance(ACCOUNTS_DIR . $form['username'] . YAML_EXT);
if ($file->exists()) { if ($file->exists()) {
$user = new User($file->content()); $user = new User($file->content());
$user->authenticated = true;
// Authenticate user. // Authenticate user.
$result = $user->authenticate($form['password']); $result = $user->authenticate($form['password']);
@@ -172,7 +154,7 @@ class Admin
*/ */
public function authorise($action = 'admin.login') public function authorise($action = 'admin.login')
{ {
return isset($this->user) && $this->user->authorise($action); return $this->user->authorise($action);
} }
/** /**
@@ -409,9 +391,7 @@ class Admin
$page->filePath($parent->path().'/'.$slug.'/'.$page->name()); $page->filePath($parent->path().'/'.$slug.'/'.$page->name());
$page->header(); $page->header();
// Attach page to parent and add routing information. // Add routing information.
// FIXME:
$parent->{$slug} = $page;
$pages->addPage($page, $path); $pages->addPage($page, $path);
// Determine page type. // Determine page type.

View File

@@ -1,3 +1,7 @@
--- ---
title: Configuration title: Configuration
access:
admin.configuration: true
admin.super: true
--- ---

View File

@@ -1,5 +1,9 @@
--- ---
title: Dashboard title: Dashboard
access:
admin.login: true
admin.super: true
--- ---
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod

4
pages/admin/denied.md Normal file
View File

@@ -0,0 +1,4 @@
---
title: Access Denied
---

7
pages/admin/installer.md Normal file
View File

@@ -0,0 +1,7 @@
---
title: Users
access:
admin.users: true
admin.super: true
---

View File

@@ -2,12 +2,13 @@
title: Dashboard Login title: Dashboard Login
form: form:
- name: username fields:
type: text - name: username
placeholder: Username type: text
placeholder: Username
- name: password - name: password
type: password type: password
placeholder: Password placeholder: Password
--- ---

View File

@@ -1,3 +1,7 @@
--- ---
title: Error Log title: Error Log
access:
admin.logs: true
admin.super: true
--- ---

View File

@@ -1,3 +1,7 @@
--- ---
title: Pages title: Pages
access:
admin.pages: true
admin.super: true
--- ---

View File

@@ -1,3 +1,7 @@
--- ---
title: Plugins title: Plugins
access:
admin.plugins: true
admin.super: true
--- ---

View File

@@ -1,3 +1,7 @@
--- ---
title: Site Settings title: Site Settings
access:
admin.settings: true
admin.super: true
--- ---

View File

@@ -0,0 +1,7 @@
---
title: Installer
access:
admin.install: true
admin.super: true
---

7
pages/admin/users.md Normal file
View File

@@ -0,0 +1,7 @@
---
title: Plugins
access:
admin.plugins: true
admin.super: true
---

View File

@@ -9,7 +9,7 @@
{% include 'partials/messages.html.twig' %} {% include 'partials/messages.html.twig' %}
<form method="post"> <form method="post">
{% for field in page.header.form %} {% for field in page.header.form.fields %}
{% if field.type %} {% if field.type %}
<div> <div>
{% include ["forms/fields/#{field.type}/#{field.type}.html.twig", 'forms/fields/text/text.html.twig'] %} {% include ["forms/fields/#{field.type}/#{field.type}.html.twig", 'forms/fields/text/text.html.twig'] %}

View File

@@ -89,7 +89,7 @@
{% block footer_section %} {% block footer_section %}
<footer id="footer"> <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> </footer>
{% endblock %} {% endblock %}
</div> </div>

View File

@@ -42,19 +42,7 @@
</table> </table>
</form> </form>
{% else %} {% else %}
{% set theme = admin.themes[admin.route] %} {% include 'partials/theme.html.twig' %}
{% 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 } %}
{% endif %} {% endif %}
</div> </div>

View File

@@ -0,0 +1,14 @@
{% extends 'partials/base.html.twig' %}
{% block content %}
<div class="admin-block">
<h1>
Users
</h1>
{% include 'partials/messages.html.twig' %}
</div>
{% endblock %}

View 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 } %}

View File

@@ -0,0 +1,14 @@
{% extends 'partials/base.html.twig' %}
{% block content %}
<div class="admin-block">
<h1>
Users
</h1>
{% include 'partials/messages.html.twig' %}
</div>
{% endblock %}

View File

@@ -0,0 +1,50 @@
{% extends 'partials/base.html.twig' %}
{% block content %}
<div class="admin-block">
{% if not admin.route %}
<h1>
Plugins
</h1>
{% include 'partials/messages.html.twig' %}
<table>
{% for plugin in admin.plugins %}
{% set blueprints = plugin.blueprints() %}
<tr>
<td>
<a href="{{ base_url_relative }}/plugins/{{ blueprints.name|url_encode }}">{{ blueprints.get('name') }}</a>
</td>
<td>
<form action="{{ base_url_relative }}/plugins/{{ blueprints.name }}" method="post">
<input type="hidden" name="enabled" value="{{ plugin.get('enabled') ? 0 : 1 }}" />
<input type="hidden" name="_redirect" value="plugins" />
<button class="button" name="task" value="enable"{{ blueprints.name == 'admin' ? ' disabled="disabled"' }}>
{{ plugin.get('enabled') ? 'Enabled' : 'Disabled' }}
</button>
</form>
</td>
</tr>
{% endfor %}
</table>
{% else %}
{% set plugin = admin.plugins[admin.route] %}
{% set blueprints = plugin.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: plugin } %}
{% endif %}
</div>
{% endblock %}