667 lines
19 KiB
Plaintext
667 lines
19 KiB
Plaintext
/**
|
|
* The Config Class.
|
|
*
|
|
* @var Config
|
|
* @since 3.2.0
|
|
*/
|
|
protected Config $config;
|
|
|
|
/**
|
|
* The EventInterface Class.
|
|
*
|
|
* @var Event
|
|
* @since 3.2.0
|
|
*/
|
|
protected Event $event;
|
|
|
|
/**
|
|
* The Language Class.
|
|
*
|
|
* @var Language
|
|
* @since 3.2.0
|
|
*/
|
|
protected Language $language;
|
|
|
|
/**
|
|
* The Component Class.
|
|
*
|
|
* @var Component
|
|
* @since 3.2.0
|
|
*/
|
|
protected Component $component;
|
|
|
|
/**
|
|
* The Name Class.
|
|
*
|
|
* @var FieldName
|
|
* @since 3.2.0
|
|
*/
|
|
protected FieldName $fieldname;
|
|
|
|
/**
|
|
* The TypeName Class.
|
|
*
|
|
* @var TypeName
|
|
* @since 3.2.0
|
|
*/
|
|
protected TypeName $typename;
|
|
|
|
/**
|
|
* The Counter Class.
|
|
*
|
|
* @var Counter
|
|
* @since 3.2.0
|
|
*/
|
|
protected Counter $counter;
|
|
|
|
/**
|
|
* The Permission Class.
|
|
*
|
|
* @var Permission
|
|
* @since 3.2.0
|
|
*/
|
|
protected Permission $permission;
|
|
|
|
/**
|
|
* The AssetsRules Class.
|
|
*
|
|
* @var AssetsRules
|
|
* @since 3.2.0
|
|
*/
|
|
protected AssetsRules $assetsrules;
|
|
|
|
/**
|
|
* The CustomTabs Class.
|
|
*
|
|
* @var CustomTabs
|
|
* @since 3.2.0
|
|
*/
|
|
protected CustomTabs $customtabs;
|
|
|
|
/**
|
|
* The PermissionViews Class.
|
|
*
|
|
* @var PermissionViews
|
|
* @since 3.2.0
|
|
*/
|
|
protected PermissionViews $permissionviews;
|
|
|
|
/**
|
|
* The PermissionFields Class.
|
|
*
|
|
* @var PermissionFields
|
|
* @since 3.2.0
|
|
*/
|
|
protected PermissionFields $permissionfields;
|
|
|
|
/**
|
|
* The PermissionComponent Class.
|
|
*
|
|
* @var PermissionComponent
|
|
* @since 3.2.0
|
|
*/
|
|
protected PermissionComponent $permissioncomponent;
|
|
|
|
/**
|
|
* The CustomButtonPermissions Class.
|
|
*
|
|
* @var CustomButtonPermissions
|
|
* @since 3.2.0
|
|
*/
|
|
protected CustomButtonPermissions $custombuttonpermissions;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param Config $config The Config Class.
|
|
* @param Event $event The EventInterface Class.
|
|
* @param Language $language The Language Class.
|
|
* @param Component $component The Component Class.
|
|
* @param FieldName $fieldname The Name Class.
|
|
* @param TypeName $typename The TypeName Class.
|
|
* @param Counter $counter The Counter Class.
|
|
* @param Permission $permission The Permission Class.
|
|
* @param AssetsRules $assetsrules The AssetsRules Class.
|
|
* @param CustomTabs $customtabs The CustomTabs Class.
|
|
* @param PermissionViews $permissionviews The PermissionViews Class.
|
|
* @param PermissionFields $permissionfields The PermissionFields Class.
|
|
* @param PermissionComponent $permissioncomponent The PermissionComponent Class.
|
|
* @param CustomButtonPermissions $custombuttonpermissions The CustomButtonPermissions Class.
|
|
*
|
|
* @since 3.2.0
|
|
*/
|
|
public function __construct(Config $config, Event $event, Language $language,
|
|
Component $component, FieldName $fieldname,
|
|
TypeName $typename, Counter $counter,
|
|
Permission $permission, AssetsRules $assetsrules,
|
|
CustomTabs $customtabs, PermissionViews $permissionviews,
|
|
PermissionFields $permissionfields,
|
|
PermissionComponent $permissioncomponent,
|
|
CustomButtonPermissions $custombuttonpermissions)
|
|
{
|
|
$this->config = $config;
|
|
$this->event = $event;
|
|
$this->language = $language;
|
|
$this->component = $component;
|
|
$this->fieldname = $fieldname;
|
|
$this->typename = $typename;
|
|
$this->counter = $counter;
|
|
$this->permission = $permission;
|
|
$this->assetsrules = $assetsrules;
|
|
$this->customtabs = $customtabs;
|
|
$this->permissionviews = $permissionviews;
|
|
$this->permissionfields = $permissionfields;
|
|
$this->permissioncomponent = $permissioncomponent;
|
|
$this->custombuttonpermissions = $custombuttonpermissions;
|
|
}
|
|
|
|
/**
|
|
* Get Access Sections
|
|
*
|
|
* @return string
|
|
* @since 3.2.0
|
|
*/
|
|
public function get(): string
|
|
{
|
|
// access size counter
|
|
$this->counter->accessSize = 12; // ;)
|
|
|
|
// Trigger Event: jcb_ce_onBeforeBuildAccessSections
|
|
$this->event->trigger(
|
|
'jcb_ce_onBeforeBuildAccessSections'
|
|
);
|
|
|
|
// Get the default fields
|
|
$default_fields = $this->config->default_fields;
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.admin',
|
|
'title' => 'JACTION_ADMIN',
|
|
'description' => 'JACTION_ADMIN_COMPONENT_DESC'
|
|
], true);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.options',
|
|
'title' => 'JACTION_OPTIONS',
|
|
'description' => 'JACTION_OPTIONS_COMPONENT_DESC'
|
|
], true);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.manage',
|
|
'title' => 'JACTION_MANAGE',
|
|
'description' => 'JACTION_MANAGE_COMPONENT_DESC'
|
|
], true);
|
|
|
|
if ($this->config->get('add_eximport', false))
|
|
{
|
|
$exportTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Export Data', 'U');
|
|
$exportDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Export Data', 'U')
|
|
. '_DESC';
|
|
$this->language->set('bothadmin', $exportTitle, 'Export Data');
|
|
$this->language->set(
|
|
'bothadmin', $exportDesc,
|
|
' Allows users in this group to export data.'
|
|
);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.export',
|
|
'title' => $exportTitle,
|
|
'description' => $exportDesc
|
|
], true);
|
|
|
|
// the size needs increase
|
|
$this->counter->accessSize++;
|
|
$importTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Import Data', 'U');
|
|
$importDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Import Data', 'U')
|
|
. '_DESC';
|
|
$this->language->set('bothadmin', $importTitle, 'Import Data');
|
|
$this->language->set(
|
|
'bothadmin', $importDesc,
|
|
' Allows users in this group to import data.'
|
|
);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.import',
|
|
'title' => $importTitle,
|
|
'description' => $importDesc
|
|
], true);
|
|
|
|
// the size needs increase
|
|
$this->counter->accessSize++;
|
|
}
|
|
|
|
// version permission
|
|
$batchTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Use Batch', 'U');
|
|
$batchDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Use Batch', 'U') . '_DESC';
|
|
$this->language->set('bothadmin', $batchTitle, 'Use Batch');
|
|
$this->language->set(
|
|
'bothadmin', $batchDesc,
|
|
' Allows users in this group to use batch copy/update method.'
|
|
);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.batch',
|
|
'title' => $batchTitle,
|
|
'description' => $batchDesc
|
|
], true);
|
|
|
|
// version permission
|
|
$importTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Edit Versions', 'U');
|
|
$importDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Edit Versions', 'U')
|
|
. '_DESC';
|
|
$this->language->set('bothadmin', $importTitle, 'Edit Version');
|
|
$this->language->set(
|
|
'bothadmin', $importDesc,
|
|
' Allows users in this group to edit versions.'
|
|
);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.version',
|
|
'title' => $importTitle,
|
|
'description' => $importDesc
|
|
], true);
|
|
|
|
// set the defaults
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.create',
|
|
'title' => 'JACTION_CREATE',
|
|
'description' => 'JACTION_CREATE_COMPONENT_DESC'
|
|
], true);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.delete',
|
|
'title' => 'JACTION_DELETE',
|
|
'description' => 'JACTION_DELETE_COMPONENT_DESC'
|
|
], true);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.edit',
|
|
'title' => 'JACTION_EDIT',
|
|
'description' => 'JACTION_EDIT_COMPONENT_DESC'
|
|
], true);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.edit.state',
|
|
'title' => 'JACTION_EDITSTATE',
|
|
'description' => 'JACTION_ACCESS_EDITSTATE_DESC'
|
|
], true);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.edit.own',
|
|
'title' => 'JACTION_EDITOWN',
|
|
'description' => 'JACTION_EDITOWN_COMPONENT_DESC'
|
|
], true);
|
|
|
|
// set the Joomla fields
|
|
if ($this->config->get('set_joomla_fields', false))
|
|
{
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.edit.value',
|
|
'title' => 'JACTION_EDITVALUE',
|
|
'description' => 'JACTION_EDITVALUE_COMPONENT_DESC'
|
|
], true);
|
|
|
|
// the size needs increase
|
|
$this->counter->accessSize++;
|
|
}
|
|
|
|
// new custom created by permissions
|
|
$created_byTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Edit Created By', 'U');
|
|
$created_byDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Edit Created By', 'U')
|
|
. '_DESC';
|
|
$this->language->set('bothadmin', $created_byTitle, 'Edit Created By');
|
|
$this->language->set(
|
|
'bothadmin', $created_byDesc,
|
|
' Allows users in this group to edit created by.'
|
|
);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.edit.created_by',
|
|
'title' => $created_byTitle,
|
|
'description' => $created_byDesc
|
|
], true);
|
|
|
|
// new custom created date permissions
|
|
$createdTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Edit Created Date', 'U');
|
|
$createdDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe('Edit Created Date', 'U')
|
|
. '_DESC';
|
|
$this->language->set('bothadmin', $createdTitle, 'Edit Created Date');
|
|
$this->language->set(
|
|
'bothadmin', $createdDesc,
|
|
' Allows users in this group to edit created date.'
|
|
);
|
|
$this->permissioncomponent->add('->HEAD<-', [
|
|
'name' => 'core.edit.created',
|
|
'title' => $createdTitle,
|
|
'description' => $createdDesc
|
|
], true);
|
|
|
|
// set the menu controller lookup
|
|
$menuControllers = ['access', 'submenu', 'dashboard_list', 'dashboard_add'];
|
|
|
|
// set the custom admin views permissions
|
|
if ($this->component->isArray('custom_admin_views'))
|
|
{
|
|
foreach ($this->component->get('custom_admin_views') as $custom_admin_view)
|
|
{
|
|
// new custom permissions to access this view
|
|
$customAdminName = $custom_admin_view['settings']->name;
|
|
$customAdminCode = $custom_admin_view['settings']->code;
|
|
$customAdminTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe(
|
|
$customAdminName . ' Access', 'U'
|
|
);
|
|
$customAdminDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe(
|
|
$customAdminName . ' Access', 'U'
|
|
) . '_DESC';
|
|
$sortKey = StringHelper::safe(
|
|
$customAdminName . ' Access'
|
|
);
|
|
$this->language->set(
|
|
'bothadmin', $customAdminTitle, $customAdminName . ' Access'
|
|
);
|
|
$this->language->set(
|
|
'bothadmin', $customAdminDesc,
|
|
' Allows the users in this group to access '
|
|
. StringHelper::safe($customAdminName, 'w')
|
|
. '.'
|
|
);
|
|
$this->permissioncomponent->set($sortKey, [
|
|
'name' => "$customAdminCode.access",
|
|
'title' => $customAdminTitle,
|
|
'description' => $customAdminDesc
|
|
]);
|
|
|
|
// the size needs increase
|
|
$this->counter->accessSize++;
|
|
|
|
// add the custom permissions to use the buttons of this view
|
|
$this->custombuttonpermissions->add(
|
|
$custom_admin_view['settings'], $customAdminName,
|
|
$customAdminCode
|
|
);
|
|
|
|
// add menu controll view that has menus options
|
|
foreach ($menuControllers as $menuController)
|
|
{
|
|
// add menu controll view that has menus options
|
|
if (isset($custom_admin_view[$menuController])
|
|
&& $custom_admin_view[$menuController])
|
|
{
|
|
$targetView_ = 'views.';
|
|
if ($menuController === 'dashboard_add')
|
|
{
|
|
$targetView_ = 'view.';
|
|
}
|
|
|
|
// menucontroller
|
|
$menucontrollerView['action'] = $targetView_
|
|
. $menuController;
|
|
$menucontrollerView['implementation'] = '2';
|
|
if (isset($custom_admin_view['settings']->permissions)
|
|
&& ArrayHelper::check(
|
|
$custom_admin_view['settings']->permissions
|
|
))
|
|
{
|
|
array_push(
|
|
$custom_admin_view['settings']->permissions,
|
|
$menucontrollerView
|
|
);
|
|
}
|
|
else
|
|
{
|
|
$custom_admin_view['settings']->permissions
|
|
= [];
|
|
$custom_admin_view['settings']->permissions[]
|
|
= $menucontrollerView;
|
|
}
|
|
unset($menucontrollerView);
|
|
}
|
|
}
|
|
|
|
$this->permission ->set(
|
|
$custom_admin_view, $customAdminCode, $customAdminCode,
|
|
$menuControllers, 'customAdmin'
|
|
);
|
|
}
|
|
}
|
|
|
|
// set the site views permissions
|
|
if ($this->component->isArray('site_views'))
|
|
{
|
|
foreach ($this->component->get('site_views') as $site_view)
|
|
{
|
|
// new custom permissions to access this view
|
|
$siteName = $site_view['settings']->name;
|
|
$siteCode = $site_view['settings']->code;
|
|
$siteTitle = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe(
|
|
$siteName . ' Access Site', 'U'
|
|
);
|
|
$siteDesc = $this->config->lang_prefix . '_'
|
|
. StringHelper::safe(
|
|
$siteName . ' Access Site', 'U'
|
|
) . '_DESC';
|
|
$sortKey = StringHelper::safe(
|
|
$siteName . ' Access Site'
|
|
);
|
|
|
|
if (isset($site_view['access']) && $site_view['access'] == 1)
|
|
{
|
|
$this->language->set(
|
|
'bothadmin', $siteTitle, $siteName . ' (Site) Access'
|
|
);
|
|
$this->language->set(
|
|
'bothadmin', $siteDesc,
|
|
' Allows the users in this group to access site '
|
|
. StringHelper::safe($siteName, 'w')
|
|
. '.'
|
|
);
|
|
$this->permissioncomponent->set($sortKey, [
|
|
'name' => "site.$siteCode.access",
|
|
'title' => $siteTitle,
|
|
'description' => $siteDesc
|
|
]);
|
|
|
|
// the size needs increase
|
|
$this->counter->accessSize++;
|
|
|
|
// check if this site view requires access rule to default to public
|
|
if (isset($site_view['public_access'])
|
|
&& $site_view['public_access'] == 1)
|
|
{
|
|
// we use one as public group (TODO we see if we run into any issues)
|
|
$this->assetsrules->add('site', '"site.' . $siteCode
|
|
. '.access":{"1":1}');
|
|
}
|
|
}
|
|
|
|
// add the custom permissions to use the buttons of this view
|
|
$this->custombuttonpermissions->add(
|
|
$site_view['settings'], $siteName, $siteCode
|
|
);
|
|
}
|
|
}
|
|
|
|
if ($this->component->isArray('admin_views'))
|
|
{
|
|
foreach ($this->component->get('admin_views') as $view)
|
|
{
|
|
// set view name
|
|
$nameView = StringHelper::safe(
|
|
$view['settings']->name_single
|
|
);
|
|
$nameViews = StringHelper::safe(
|
|
$view['settings']->name_list
|
|
);
|
|
|
|
// add custom tab permissions if found
|
|
if (($tabs_ = $this->customtabs->get($nameView)) !== null
|
|
&& ArrayHelper::check($tabs_))
|
|
{
|
|
foreach ($tabs_ as $_customTab)
|
|
{
|
|
if (isset($_customTab['permission'])
|
|
&& $_customTab['permission'] == 1)
|
|
{
|
|
$this->permissioncomponent->set($_customTab['sortKey'], [
|
|
'name' => $_customTab['view'] . '.' . $_customTab['code'] . '.viewtab',
|
|
'title' => $_customTab['lang_permission'],
|
|
'description' => $_customTab['lang_permission_desc']
|
|
]);
|
|
|
|
// the size needs increase
|
|
$this->counter->accessSize++;
|
|
}
|
|
}
|
|
}
|
|
|
|
// add the custom permissions to use the buttons of this view
|
|
$this->custombuttonpermissions->add(
|
|
$view['settings'], $view['settings']->name_single, $nameView
|
|
);
|
|
|
|
if ($nameView != 'component')
|
|
{
|
|
// add menu controll view that has menus options
|
|
foreach ($menuControllers as $menuController)
|
|
{
|
|
// add menu controll view that has menus options
|
|
if (isset($view[$menuController])
|
|
&& $view[$menuController])
|
|
{
|
|
$targetView_ = 'views.';
|
|
if ($menuController === 'dashboard_add')
|
|
{
|
|
$targetView_ = 'view.';
|
|
}
|
|
// menucontroller
|
|
$menucontrollerView['action'] = $targetView_ . $menuController;
|
|
$menucontrollerView['implementation'] = '2';
|
|
if (isset($view['settings']->permissions)
|
|
&& ArrayHelper::check(
|
|
$view['settings']->permissions
|
|
))
|
|
{
|
|
array_push(
|
|
$view['settings']->permissions,
|
|
$menucontrollerView
|
|
);
|
|
}
|
|
else
|
|
{
|
|
$view['settings']->permissions = [];
|
|
$view['settings']->permissions[] = $menucontrollerView;
|
|
}
|
|
unset($menucontrollerView);
|
|
}
|
|
}
|
|
|
|
// check if there are fields
|
|
if (ArrayHelper::check($view['settings']->fields))
|
|
{
|
|
// field permission options
|
|
$permission_options = [1 => 'edit', 2 => 'access', 3 => 'view'];
|
|
|
|
// check the fields for their permission settings
|
|
foreach ($view['settings']->fields as $field)
|
|
{
|
|
// see if field require permissions to be set
|
|
if (isset($field['permission'])
|
|
&& ArrayHelper::check(
|
|
$field['permission']
|
|
))
|
|
{
|
|
if (ArrayHelper::check(
|
|
$field['settings']->properties
|
|
))
|
|
{
|
|
$fieldType = $this->typename->get($field);
|
|
$fieldName = $this->fieldname->get(
|
|
$field, $nameViews
|
|
);
|
|
|
|
// loop the permission options
|
|
foreach ($field['permission'] as $permission_id)
|
|
{
|
|
// set the permission key word
|
|
$permission_option = $permission_options[(int) $permission_id];
|
|
|
|
// reset the bucket
|
|
$fieldView = [];
|
|
|
|
// set the permission for this field
|
|
$fieldView['action'] = 'view.' . $permission_option . '.' . $fieldName;
|
|
$fieldView['implementation'] = '3';
|
|
|
|
// check if persmissions was already set
|
|
if (isset($view['settings']->permissions)
|
|
&& ArrayHelper::check(
|
|
$view['settings']->permissions
|
|
))
|
|
{
|
|
array_push($view['settings']->permissions, $fieldView);
|
|
}
|
|
else
|
|
{
|
|
$view['settings']->permissions = [];
|
|
$view['settings']->permissions[] = $fieldView;
|
|
}
|
|
|
|
// ensure that no default field get loaded
|
|
if (!in_array($fieldName, $default_fields))
|
|
{
|
|
// load to global field permission set
|
|
$this->permissionfields->
|
|
set("$nameView.$fieldName.$permission_option", $fieldType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$this->permission ->set(
|
|
$view, $nameView, $nameViews, $menuControllers
|
|
);
|
|
}
|
|
}
|
|
|
|
// Trigger Event: jcb_ce_onAfterBuildAccessSections
|
|
$this->event->trigger(
|
|
'jcb_ce_onAfterBuildAccessSections'
|
|
);
|
|
|
|
/// now build the section
|
|
$component = $this->permissioncomponent->build();
|
|
|
|
// add views to the component section
|
|
$component .= $this->permissionviews->build();
|
|
|
|
// remove the fix, is not needed
|
|
if ($this->counter->accessSize < 30)
|
|
{
|
|
// since we have less than 30 actions
|
|
// we do not need the fix for this component
|
|
$this->config->set('add_assets_table_fix', 0);
|
|
}
|
|
else
|
|
{
|
|
// get the worst case column size required (can be worse I know)
|
|
// access/action size x 20 characters x 8 groups
|
|
$character_length = (int) MathHelper::bc(
|
|
'mul', $this->counter->accessSize, 20, 0
|
|
);
|
|
|
|
// set worse case
|
|
$this->config->set('access_worse_case', (int) MathHelper::bc(
|
|
'mul', $character_length, 8, 0
|
|
));
|
|
}
|
|
|
|
// return the build
|
|
return $component;
|
|
}
|
|
|
|
return false;
|
|
} |