mirror of
https://github.com/getgrav/grav-plugin-admin.git
synced 2026-05-07 13:25:50 +02:00
Improved tools permissions handling
This commit is contained in:
10
admin.php
10
admin.php
@@ -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;
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
---
|
||||
title: Grav Tools
|
||||
|
||||
access:
|
||||
admin.tools: true
|
||||
admin.super: true
|
||||
---
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -25,6 +25,5 @@
|
||||
{{ nonce_field('admin-form', 'admin-nonce')|raw }}
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -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"> </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"> </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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user