235 lines
14 KiB
PHP
235 lines
14 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @package Joomla.Site
|
|
* @subpackage Layout
|
|
*
|
|
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Access\Access;
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\HTML\HTMLHelper;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\Layout\LayoutHelper;
|
|
use Joomla\CMS\Router\Route;
|
|
use Joomla\CMS\Session\Session;
|
|
|
|
extract($displayData);
|
|
|
|
// Get some system objects.
|
|
$document = Factory::getDocument();
|
|
|
|
/**
|
|
* Layout variables
|
|
* -----------------
|
|
* @var string $autocomplete Autocomplete attribute for the field.
|
|
* @var boolean $autofocus Is autofocus enabled?
|
|
* @var string $class Classes for the input.
|
|
* @var string $description Description of the field.
|
|
* @var boolean $disabled Is this field disabled?
|
|
* @var string $group Group the field belongs to. <fields> section in form XML.
|
|
* @var boolean $hidden Is this field hidden in the form?
|
|
* @var string $hint Placeholder for the field.
|
|
* @var string $id DOM id of the field.
|
|
* @var string $label Label of the field.
|
|
* @var string $labelclass Classes to apply to the label.
|
|
* @var boolean $multiple Does this field support multiple values?
|
|
* @var string $name Name of the input field.
|
|
* @var array $options Options available for this field.
|
|
* @var array $groups Available user groups.
|
|
* @var array $actions Actions for the asset.
|
|
* @var integer $assetId Access parameters.
|
|
* @var string $component The component.
|
|
* @var string $section The section.
|
|
* @var boolean $isGlobalConfig Current view is global config?
|
|
* @var boolean $newItem The new item.
|
|
* @var object $assetRules Rules for asset.
|
|
* @var integer $parentAssetId To calculate permissions.
|
|
* @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output
|
|
* @var array $dataAttributes Miscellaneous data attributes for eg, data-*.
|
|
*/
|
|
|
|
// Add Javascript for permission change
|
|
HTMLHelper::_('form.csrf');
|
|
Factory::getDocument()->getWebAssetManager()
|
|
->useStyle('webcomponent.field-permissions')
|
|
->useScript('webcomponent.field-permissions')
|
|
->useStyle('webcomponent.joomla-tab')
|
|
->useScript('webcomponent.joomla-tab');
|
|
|
|
// Load JavaScript message titles
|
|
Text::script('ERROR');
|
|
Text::script('WARNING');
|
|
Text::script('NOTICE');
|
|
Text::script('MESSAGE');
|
|
|
|
// Add strings for JavaScript error translations.
|
|
Text::script('JLIB_JS_AJAX_ERROR_CONNECTION_ABORT');
|
|
Text::script('JLIB_JS_AJAX_ERROR_NO_CONTENT');
|
|
Text::script('JLIB_JS_AJAX_ERROR_OTHER');
|
|
Text::script('JLIB_JS_AJAX_ERROR_PARSE');
|
|
Text::script('JLIB_JS_AJAX_ERROR_TIMEOUT');
|
|
|
|
// Ajax request data.
|
|
$ajaxUri = Route::_('index.php?option=com_config&task=application.store&format=json&' . Session::getFormToken() . '=1');
|
|
?>
|
|
|
|
<?php // Description ?>
|
|
<details>
|
|
<summary class="rule-notes">
|
|
<?php echo Text::_('JLIB_RULES_SETTINGS_DESC'); ?>
|
|
</summary>
|
|
<div class="rule-notes">
|
|
<?php
|
|
if ($section === 'component' || !$section) {
|
|
echo Text::alt('JLIB_RULES_SETTING_NOTES', $component);
|
|
} else {
|
|
echo Text::alt('JLIB_RULES_SETTING_NOTES_ITEM', $component . '_' . $section);
|
|
}
|
|
?>
|
|
</div>
|
|
</details>
|
|
<?php // Begin tabs ?>
|
|
<joomla-field-permissions class="row mb-2" data-uri="<?php echo $ajaxUri; ?>" <?php echo $dataAttribute; ?>>
|
|
<joomla-tab orientation="vertical" id="permissions-sliders" recall breakpoint="728">
|
|
<?php // Initial Active Pane ?>
|
|
<?php foreach ($groups as $group) : ?>
|
|
<?php $active = (int) $group->value === 1 ? ' active' : ''; ?>
|
|
<joomla-tab-element class="tab-pane" <?php echo $active; ?> name="<?php echo htmlentities(LayoutHelper::render('joomla.html.treeprefix', ['level' => $group->level + 1]), ENT_COMPAT, 'utf-8') . $group->text; ?>" id="permission-<?php echo $group->value; ?>">
|
|
<table class="table respTable">
|
|
<thead>
|
|
<tr>
|
|
<th class="actions w-30" id="actions-th<?php echo $group->value; ?>">
|
|
<span class="acl-action"><?php echo Text::_('JLIB_RULES_ACTION'); ?></span>
|
|
</th>
|
|
|
|
<th class="settings w-40" id="settings-th<?php echo $group->value; ?>">
|
|
<span class="acl-action"><?php echo Text::_('JLIB_RULES_SELECT_SETTING'); ?></span>
|
|
</th>
|
|
|
|
<th class="w-30" id="aclaction-th<?php echo $group->value; ?>">
|
|
<span class="acl-action"><?php echo Text::_('JLIB_RULES_CALCULATED_SETTING'); ?></span>
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
|
|
<?php // Check if this group has super user permissions ?>
|
|
<?php $isSuperUserGroup = Access::checkGroup($group->value, 'core.admin'); ?>
|
|
<?php foreach ($actions as $action) : ?>
|
|
<tr>
|
|
<td class="oddCol" data-label="<?php echo Text::_('JLIB_RULES_ACTION'); ?>" headers="actions-th<?php echo $group->value; ?>">
|
|
<label for="<?php echo $id; ?>_<?php echo $action->name; ?>_<?php echo $group->value; ?>">
|
|
<?php echo Text::_($action->title); ?>
|
|
</label>
|
|
<?php if (!empty($action->description)) : ?>
|
|
<div role="tooltip" id="tip-<?php echo $id; ?>">
|
|
<?php echo htmlspecialchars(Text::_($action->description)); ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</td>
|
|
<td data-label="<?php echo Text::_('JLIB_RULES_SELECT_SETTING'); ?>" headers="settings-th<?php echo $group->value; ?>">
|
|
<div class="d-flex align-items-center">
|
|
<select data-onchange-task="permissions.apply"
|
|
class="form-select novalidate"
|
|
name="<?php echo $name; ?>[<?php echo $action->name; ?>][<?php echo $group->value; ?>]"
|
|
id="<?php echo $id; ?>_<?php echo $action->name; ?>_<?php echo $group->value; ?>" >
|
|
<?php
|
|
/**
|
|
* Possible values:
|
|
* null = not set means inherited
|
|
* false = denied
|
|
* true = allowed
|
|
*/
|
|
|
|
// Get the actual setting for the action for this group. ?>
|
|
<?php $assetRule = $newItem === false ? $assetRules->allow($action->name, $group->value) : null;?>
|
|
|
|
<?php // Build the dropdowns for the permissions sliders
|
|
// The parent group has "Not Set", all children can rightly "Inherit" from that.?>
|
|
<option value="" <?php echo ($assetRule === null ? ' selected="selected"' : ''); ?>>
|
|
<?php echo Text::_(empty($group->parent_id) && $isGlobalConfig ? 'JLIB_RULES_NOT_SET' : 'JLIB_RULES_INHERITED'); ?></option>
|
|
<option value="1" <?php echo ($assetRule === true ? ' selected="selected"' : ''); ?>>
|
|
<?php echo Text::_('JLIB_RULES_ALLOWED'); ?></option>
|
|
<option value="0" <?php echo ($assetRule === false ? ' selected="selected"' : ''); ?>>
|
|
<?php echo Text::_('JLIB_RULES_DENIED'); ?></option>
|
|
|
|
</select> 
|
|
<span id="icon_<?php echo $id; ?>_<?php echo $action->name; ?>_<?php echo $group->value; ?>"></span>
|
|
</div>
|
|
</td>
|
|
|
|
<td data-label="<?php echo Text::_('JLIB_RULES_CALCULATED_SETTING'); ?>" headers="aclaction-th<?php echo $group->value; ?>">
|
|
<?php $result = []; ?>
|
|
<?php // Get the group, group parent id, and group global config recursive calculated permission for the chosen action. ?>
|
|
<?php $inheritedGroupRule = Access::checkGroup((int) $group->value, $action->name, $assetId);
|
|
$inheritedGroupParentAssetRule = !empty($parentAssetId) ? Access::checkGroup($group->value, $action->name, $parentAssetId) : null;
|
|
$inheritedParentGroupRule = !empty($group->parent_id) ? Access::checkGroup($group->parent_id, $action->name, $assetId) : null;
|
|
|
|
// Current group is a Super User group, so calculated setting is "Allowed (Super User)".
|
|
if ($isSuperUserGroup) {
|
|
$result['class'] = 'badge bg-success';
|
|
$result['text'] = '<span class="icon-lock icon-white" aria-hidden="true"></span>' . Text::_('JLIB_RULES_ALLOWED_ADMIN');
|
|
} else {
|
|
// First get the real recursive calculated setting and add (Inherited) to it.
|
|
|
|
// If recursive calculated setting is "Denied" or null. Calculated permission is "Not Allowed (Inherited)".
|
|
if ($inheritedGroupRule === null || $inheritedGroupRule === false) {
|
|
$result['class'] = 'badge bg-danger';
|
|
$result['text'] = Text::_('JLIB_RULES_NOT_ALLOWED_INHERITED');
|
|
} else {
|
|
// If recursive calculated setting is "Allowed". Calculated permission is "Allowed (Inherited)".
|
|
$result['class'] = 'badge bg-success';
|
|
$result['text'] = Text::_('JLIB_RULES_ALLOWED_INHERITED');
|
|
}
|
|
|
|
// Second part: Overwrite the calculated permissions labels if there is an explicit permission in the current group.
|
|
|
|
/**
|
|
* @todo: incorrect info
|
|
* If a component has a permission that doesn't exists in global config (ex: frontend editing in com_modules) by default
|
|
* we get "Not Allowed (Inherited)" when we should get "Not Allowed (Default)".
|
|
*/
|
|
|
|
// If there is an explicit permission "Not Allowed". Calculated permission is "Not Allowed".
|
|
if ($assetRule === false) {
|
|
$result['class'] = 'badge bg-danger';
|
|
$result['text'] = Text::_('JLIB_RULES_NOT_ALLOWED');
|
|
} elseif ($assetRule === true) {
|
|
// If there is an explicit permission is "Allowed". Calculated permission is "Allowed".
|
|
$result['class'] = 'badge bg-success';
|
|
$result['text'] = Text::_('JLIB_RULES_ALLOWED');
|
|
}
|
|
|
|
// Third part: Overwrite the calculated permissions labels for special cases.
|
|
|
|
// Global configuration with "Not Set" permission. Calculated permission is "Not Allowed (Default)".
|
|
if (empty($group->parent_id) && $isGlobalConfig === true && $assetRule === null) {
|
|
$result['class'] = 'badge bg-danger';
|
|
$result['text'] = Text::_('JLIB_RULES_NOT_ALLOWED_DEFAULT');
|
|
} elseif ($inheritedGroupParentAssetRule === false || $inheritedParentGroupRule === false) {
|
|
/**
|
|
* Component/Item with explicit "Denied" permission at parent Asset (Category, Component or Global config) configuration.
|
|
* Or some parent group has an explicit "Denied".
|
|
* Calculated permission is "Not Allowed (Locked)".
|
|
*/
|
|
$result['class'] = 'badge bg-danger';
|
|
$result['text'] = '<span class="icon-lock icon-white" aria-hidden="true"></span>' . Text::_('JLIB_RULES_NOT_ALLOWED_LOCKED');
|
|
}
|
|
}
|
|
?>
|
|
<output><span class="<?php echo $result['class']; ?>"><?php echo $result['text']; ?></span></output>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</joomla-tab-element>
|
|
<?php endforeach; ?>
|
|
</joomla-tab>
|
|
</joomla-field-permissions>
|