Improved tools permissions handling

This commit is contained in:
Andy Miller
2019-02-08 13:53:11 -07:00
parent 6da094cc8f
commit 536898f41b
12 changed files with 171 additions and 166 deletions

View File

@@ -373,11 +373,11 @@ class AdminPlugin extends Plugin
public function onAdminTools(Event $event)
{
$event['tools'] = array_merge($event['tools'], [
'backups' => $this->grav['language']->translate('PLUGIN_ADMIN.BACKUPS'),
'scheduler' => $this->grav['language']->translate('PLUGIN_ADMIN.SCHEDULER'),
'logs' => $this->grav['language']->translate('PLUGIN_ADMIN.LOGS'),
'reports' => $this->grav['language']->translate('PLUGIN_ADMIN.REPORTS'),
'direct-install' => $this->grav['language']->translate('PLUGIN_ADMIN.DIRECT_INSTALL'),
'backups' => [['admin.maintenance', 'admin.super'], $this->grav['language']->translate('PLUGIN_ADMIN.BACKUPS')],
'scheduler' => [['admin.super'], $this->grav['language']->translate('PLUGIN_ADMIN.SCHEDULER')],
'logs' => [['admin.super'], $this->grav['language']->translate('PLUGIN_ADMIN.LOGS')],
'reports' => [['admin.super'], $this->grav['language']->translate('PLUGIN_ADMIN.REPORTS')],
'direct-install' => [['admin.super'], $this->grav['language']->translate('PLUGIN_ADMIN.DIRECT_INSTALL')],
]);
return $event;

View File

@@ -226,6 +226,18 @@ class Admin
return $tools;
}
public static function toolsPermissions()
{
$tools = static::tools();
$perms = [];
foreach ($tools as $tool) {
$perms = array_merge($perms, $tool[0]);
}
return array_unique($perms);
}
/**
* Return the languages available in the site
*

View File

@@ -1,7 +1,3 @@
---
title: Grav Tools
access:
admin.tools: true
admin.super: true
---

View File

@@ -76,7 +76,7 @@
</a>
</li>
{% endif %}
{% if authorize(['admin.tools', 'admin.super']) %}
{% if authorize(admin.toolsPermissions) %}
<li class="{{ (location == 'tools') ? 'selected' : '' }}">
<a href="{{ base_url_relative }}/tools">
<i class="fa fa-fw fa-briefcase"></i>

View File

@@ -3,5 +3,5 @@
{% include 'partials/backups-button.html.twig' %}
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SAVE"|tu }}</button>
</div>
<h1><i class="fa fa-fw fa-life-saver"></i> {{ "PLUGIN_ADMIN.TOOLS"|tu }} - {{ "PLUGIN_ADMIN.BACKUPS"|tu }}</h1>
<h1><i class="fa fa-fw fa-briefcase"></i> {{ "PLUGIN_ADMIN.TOOLS"|tu }} - {{ "PLUGIN_ADMIN.BACKUPS"|tu }}</h1>

View File

@@ -1,79 +1,76 @@
<div class="backups-content">
{% if authorize(['admin.configuration_backups', 'admin.super']) %}
{% set data = admin.data('config/backups') %}
{% set backups = grav.backups.getAvailableBackups() %}
{% set profiles = grav.backups.getBackupProfiles() %}
{% set purge_config = grav.backups.getPurgeConfig() %}
{% set newest_date = (backups|first).date %}
{% set newest_backup = newest_date ? newest_date|nicetime(false, false) : 'none' %}
{% set oldest_date = (backups|last).date %}
{% set oldest_backup = oldest_date ? oldest_date|nicetime(false, false) : 'none' %}
{% set data = admin.data('config/backups') %}
{% set backups = grav.backups.getAvailableBackups() %}
{% set profiles = grav.backups.getBackupProfiles() %}
{% set purge_config = grav.backups.getPurgeConfig() %}
{% set newest_date = (backups|first).date %}
{% set newest_backup = newest_date ? newest_date|nicetime(false, false) : 'none' %}
{% set oldest_date = (backups|last).date %}
{% set oldest_backup = oldest_date ? oldest_date|nicetime(false, false) : 'none' %}
{% switch purge_config.trigger %}
{% case 'number' %}
{% set count = backups|count %}
{% set percent_used = count == 0 ? 0 : 100 - (count / purge_config.max_backups_count * 100) %}
{% set bar_msg = "PLUGIN_ADMIN.BACKUPS_PURGE_NUMBER"|tu([count, purge_config.max_backups_count]) %}
{% case 'time' %}
{% set last = backups|last %}
{% set days = last == null ? 0 : (date('now')).diff(last.time).days %}
{% set percent_used = days == 0 ? 0 : 100 - (days / purge_config.max_backups_time * 100) %}
{% set bar_msg = "PLUGIN_ADMIN.BACKUPS_PURGE_TIME"|tu([(purge_config.max_backups_time - days)]) %}
{% default %}
{% set space_used = grav.backups.getTotalBackupsSize() %}
{% set space_available = purge_config.max_backups_space * 1024 * 1024 * 1024 %}
{% set percent_used = space_used == 0 ? 0 : 100 - (space_used / space_available * 100) %}
{% set bar_msg = "PLUGIN_ADMIN.BACKUPS_PURGE_SPACE"|tu([space_used|nicefilesize, space_available|nicefilesize]) %}
{% endswitch %}
{% switch purge_config.trigger %}
{% case 'number' %}
{% set count = backups|count %}
{% set percent_used = count == 0 ? 0 : 100 - (count / purge_config.max_backups_count * 100) %}
{% set bar_msg = "PLUGIN_ADMIN.BACKUPS_PURGE_NUMBER"|tu([count, purge_config.max_backups_count]) %}
{% case 'time' %}
{% set last = backups|last %}
{% set days = last == null ? 0 : (date('now')).diff(last.time).days %}
{% set percent_used = days == 0 ? 0 : 100 - (days / purge_config.max_backups_time * 100) %}
{% set bar_msg = "PLUGIN_ADMIN.BACKUPS_PURGE_TIME"|tu([(purge_config.max_backups_time - days)]) %}
{% default %}
{% set space_used = grav.backups.getTotalBackupsSize() %}
{% set space_available = purge_config.max_backups_space * 1024 * 1024 * 1024 %}
{% set percent_used = space_used == 0 ? 0 : 100 - (space_used / space_available * 100) %}
{% set bar_msg = "PLUGIN_ADMIN.BACKUPS_PURGE_SPACE"|tu([space_used|nicefilesize, space_available|nicefilesize]) %}
{% endswitch %}
<div id="admin-dashboard">
<div id="backups-stats" class="dashboard-item">
<div class="primary-accent default-box-shadow">
<h1>{{ "PLUGIN_ADMIN.BACKUPS_STATS"|tu }}</h1>
<div class="admin-statistics-chart">
<div class="stats-info">
<div id="admin-dashboard">
<div id="backups-stats" class="dashboard-item">
<div class="primary-accent default-box-shadow">
<h1>{{ "PLUGIN_ADMIN.BACKUPS_STATS"|tu }}</h1>
<div class="admin-statistics-chart">
<div class="stats-info">
<div id="backups-usage">
<div class="backups-usage-wrapper">
{% if percent_used >= 100 %}
<div class="usage full"></div>
{% else %}
<div class="usage" style="width:{{ percent_used }}%"></div>
{% endif %}
</div>
<h1>{{ bar_msg }}</h1>
<div id="backups-usage">
<div class="backups-usage-wrapper">
{% if percent_used >= 100 %}
<div class="usage full"></div>
{% else %}
<div class="usage" style="width:{{ percent_used }}%"></div>
{% endif %}
</div>
<h1>{{ bar_msg }}</h1>
</div>
</div>
<div class="flush-bottom button-bar stats-bar">
<span class="stat">
<b>{{ backups|length }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_COUNT"|tu }}</i>
</span>
<span class="stat">
<b>{{ profiles|count }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_PROFILES_COUNT"|tu }}</i>
</span>
<span class="stat">
<b>{{ newest_backup }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_NEWEST"|tu }}</i>
</span>
<span class="stat">
<b>{{ oldest_backup }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_OLDEST"|tu }}</i>
</span>
</div>
</div>
<div class="flush-bottom button-bar stats-bar">
<span class="stat">
<b>{{ backups|length }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_COUNT"|tu }}</i>
</span>
<span class="stat">
<b>{{ profiles|count }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_PROFILES_COUNT"|tu }}</i>
</span>
<span class="stat">
<b>{{ newest_backup }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_NEWEST"|tu }}</i>
</span>
<span class="stat">
<b>{{ oldest_backup }}</b>
<i>{{ "PLUGIN_ADMIN.BACKUPS_OLDEST"|tu }}</i>
</span>
</div>
</div>
</div>
</div>
</div>
{% include 'partials/blueprints.html.twig' with { blueprints: data.blueprints, data: data } %}
{% include 'partials/blueprints.html.twig' with { blueprints: data.blueprints, data: data } %}
{% include 'partials/modal-changes-detected.html.twig' %}
{% include 'partials/modal-changes-detected.html.twig' %}
{% endif %}
</div>

View File

@@ -25,6 +25,5 @@
{{ nonce_field('admin-form', 'admin-nonce')|raw }}
</form>
</div>

View File

@@ -15,7 +15,6 @@
{% import _self as macro %}
{% if authorize(['admin.super']) %}
{% set file = grav.uri.query('log') ?: 'grav' %}
{% set verbose = grav.uri.query('verbose') == 'true' ? true : false %}
{% set lines = grav.uri.query('lines') ?: 20 %}
@@ -24,57 +23,56 @@
<div class="logs-output">
<form id="logs-form">
<div class="block block-select">
<div class="form-field">
<div class="form-data">
{% set log_files = config.plugins.admin.log_viewer_files|default(['grav','email']) %}
{% set lines_list = {10:'10 entries', 25:'25 entries', 50:'50 entries', 100:'100 entries', 200:'200 entries', 500:'500 entries'} %}
<form id="logs-form">
<div class="block block-select">
<div class="form-field">
<div class="form-data">
{% set log_files = config.plugins.admin.log_viewer_files|default(['grav','email']) %}
{% set lines_list = {10:'10 entries', 25:'25 entries', 50:'50 entries', 100:'100 entries', 200:'200 entries', 500:'500 entries'} %}
{{ macro.render_select('log', log_files, file, true) }}
{{ macro.render_select('verbose', {'false':'Essential Output', 'true':'Verbose Output'}, verbose) }}
{{ macro.render_select('lines', lines_list, lines) }}
</div>
{{ macro.render_select('log', log_files, file, true) }}
{{ macro.render_select('verbose', {'false':'Essential Output', 'true':'Verbose Output'}, verbose) }}
{{ macro.render_select('lines', lines_list, lines) }}
</div>
</div>
</form>
</div>
</form>
<h1>{{ file|titleize }} Log File</h1>
<h3>Display the {{ lines }} most recent entries...</h3>
<table class="noflex">
<thead>
<tr>
<th class="date">Date</th>
<th class="level">Level</th>
<th class="message">Message</th>
</tr>
</thead>
<tbody>
{% for log in logs %}
<tr>
<td class="date">{{ log.date|date }}</td>
<td class="level"><span class="badge {{ log.level|lower }}">{{ log.level }}</span></td>
<td class="message">{{ log.message }}</td>
{% if verbose %}
</tr>
<tr class="trace">
<td colspan="2">&nbsp;</td>
<td>
<div class="overflow">
<ol>
{% for tracerow in log.trace %}
<li><code>{{ tracerow }}</code></li>
{% endfor %}
</ol>
</div>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
<h1>{{ file|titleize }} Log File</h1>
<h3>Display the {{ lines }} most recent entries...</h3>
<table class="noflex">
<thead>
<tr>
<th class="date">Date</th>
<th class="level">Level</th>
<th class="message">Message</th>
</tr>
</thead>
<tbody>
{% for log in logs %}
<tr>
<td class="date">{{ log.date|date }}</td>
<td class="level"><span class="badge {{ log.level|lower }}">{{ log.level }}</span></td>
<td class="message">{{ log.message }}</td>
{% if verbose %}
</tr>
<tr class="trace">
<td colspan="2">&nbsp;</td>
<td>
<div class="overflow">
<ol>
{% for tracerow in log.trace %}
<li><code>{{ tracerow }}</code></li>
{% endfor %}
</ol>
</div>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</div>

View File

@@ -1,16 +1,15 @@
<div class="reports-content">
{% if authorize(['admin.configuration_reports', 'admin.super']) %}
{% set reports = admin.generateReports() %}
{% set reports = admin.generateReports() %}
<div class="report-output">
{% for title, report in reports %}
<h1>{{ title }}</h1>
{{ report|raw }}
{% endfor %}
</div>
<div class="report-output">
{% for title, report in reports %}
<h1>{{ title }}</h1>
{{ report|raw }}
{% endfor %}
</div>
{% include 'partials/modal-changes-detected.html.twig' %}
{% include 'partials/modal-changes-detected.html.twig' %}
{% endif %}
</div>

View File

@@ -2,5 +2,5 @@
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SAVE"|tu }}</button>
</div>
<h1><i class="fa fa-fw fa-clock-o"></i> {{ "PLUGIN_ADMIN.TOOLS"|tu }} - {{ "PLUGIN_ADMIN.SCHEDULER"|tu }}</h1>
<h1><i class="fa fa-fw fa-briefcase"></i> {{ "PLUGIN_ADMIN.TOOLS"|tu }} - {{ "PLUGIN_ADMIN.SCHEDULER"|tu }}</h1>

View File

@@ -1,37 +1,33 @@
<div class="scheduler-content">
{% set data = admin.data('config/scheduler') %}
{% set cron_status = grav.scheduler.isCrontabSetup()%}
{% if authorize(['admin.configuration_scheduler', 'admin.super']) %}
{% set cron_status = grav.scheduler.isCrontabSetup()%}
{% if cron_status == 1 %}
<div class="alert notice secondary-accent">
<div id="show-instructions" class="button button-small"><i class="fa fa-clock-o"></i> {{ "PLUGIN_ADMIN.SCHEDULER_INSTALL_INSTRUCTIONS"|tu }}</div>
<i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SCHEDULER_INSTALLED_READY"|tu }}
</div>
{% elseif cron_status == 2 %}
<div class="alert warning"> {{ "PLUGIN_ADMIN.SCHEDULER_CRON_NA"|tu }}</div>
{% else %}
<div class="alert warning"> {{ "PLUGIN_ADMIN.SCHEDULER_NOT_ENABLED"|tu }}</div>
{% endif %}
<div id="cron-install" class="form-border overlay {{ cron_status == 1 ? 'hide' : ''}}">
<pre><code>{{- grav.scheduler.getCronCommand()|trim -}}</code></pre>
<p>{{ "PLUGIN_ADMIN.SCHEDULER_POST_INSTRUCTIONS"|tu|raw }}</p>
{% if cron_status == 1 %}
<div class="alert notice secondary-accent">
<div id="show-instructions" class="button button-small"><i class="fa fa-clock-o"></i> {{ "PLUGIN_ADMIN.SCHEDULER_INSTALL_INSTRUCTIONS"|tu }}</div>
<i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SCHEDULER_INSTALLED_READY"|tu }}
</div>
{% include 'partials/blueprints.html.twig' with { blueprints: data.blueprints, data: data } %}
{% include 'partials/modal-changes-detected.html.twig' %}
<script>
$('#show-instructions').click(function() {
$('#cron-install').toggleClass( "hide" );
});
</script>
{% elseif cron_status == 2 %}
<div class="alert warning"> {{ "PLUGIN_ADMIN.SCHEDULER_CRON_NA"|tu }}</div>
{% else %}
<div class="alert warning"> {{ "PLUGIN_ADMIN.SCHEDULER_NOT_ENABLED"|tu }}</div>
{% endif %}
<div id="cron-install" class="form-border overlay {{ cron_status == 1 ? 'hide' : ''}}">
<pre><code>{{- grav.scheduler.getCronCommand()|trim -}}</code></pre>
<p>{{ "PLUGIN_ADMIN.SCHEDULER_POST_INSTRUCTIONS"|tu|raw }}</p>
</div>
{% include 'partials/blueprints.html.twig' with { blueprints: data.blueprints, data: data } %}
{% include 'partials/modal-changes-detected.html.twig' %}
<script>
$('#show-instructions').click(function() {
$('#cron-install').toggleClass( "hide" );
});
</script>
</div>

View File

@@ -25,9 +25,13 @@
<div class="form-tabs">
<div class="tabs-nav">
{% for slug,tool in tools %}
{% set perms = tool|first %}
{% set name = tool|last %}
{% if authorize(perms) %}
<a href="{{ base_url_relative }}/tools/{{slug|hyphenize}}" {% if tools_slug == slug|hyphenize %}class="active"{% endif %}>
{{ tool|tu|capitalize }}
{{ name|tu|capitalize }}
</a>
{% endif %}
{% endfor %}
</div>
</div>
@@ -35,8 +39,12 @@
{% endblock %}
{% block content %}
{% if authorize(['admin.tools', 'admin.super']) %}
{% set perms = tools[tools_slug]|first %}
{% if authorize(perms) %}
{% include 'partials/tools-' ~ tools_slug ~ '.html.twig' ignore missing %}
{% else %}
<h1>Unauthorized</h1>
{% endif %}
{% endblock %}