summaryrefslogtreecommitdiffstats
path: root/modules-available/baseconfig
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/baseconfig')
-rw-r--r--modules-available/baseconfig/api.inc.php23
-rw-r--r--modules-available/baseconfig/config.json7
-rw-r--r--modules-available/baseconfig/lang/de/permissions.json4
-rw-r--r--modules-available/baseconfig/lang/en/permissions.json4
-rw-r--r--modules-available/baseconfig/page.inc.php42
-rw-r--r--modules-available/baseconfig/permissions/permissions.json8
-rw-r--r--modules-available/baseconfig/templates/_page.html11
7 files changed, 78 insertions, 21 deletions
diff --git a/modules-available/baseconfig/api.inc.php b/modules-available/baseconfig/api.inc.php
index a4024c5e..bc834930 100644
--- a/modules-available/baseconfig/api.inc.php
+++ b/modules-available/baseconfig/api.inc.php
@@ -16,6 +16,8 @@ class ConfigHolder
private static $context = '';
+ private static $postHooks = [];
+
public static function setContext($name)
{
self::$context = $name;
@@ -54,8 +56,26 @@ class ConfigHolder
return self::$config[$key][0]['value'];
}
+ /**
+ * @param callable $func
+ */
+ public static function addPostHook($func)
+ {
+ self::$postHooks[] = array('context' => self::$context, 'function' => $func);
+ }
+
+ public static function applyPostHooks()
+ {
+ foreach (self::$postHooks as $hook) {
+ self::$context = $hook['context'] . ':post';
+ $hook['function']();
+ }
+ self::$postHooks = [];
+ }
+
public static function getConfig()
{
+ self::applyPostHooks();
$ret = [];
foreach (self::$config as $key => $list) {
if ($list[0]['value'] === false)
@@ -67,6 +87,7 @@ class ConfigHolder
public static function outputConfig()
{
+ self::applyPostHooks();
foreach (self::$config as $key => $list) {
echo '##', $key, "\n";
foreach ($list as $pos => $item) {
@@ -119,7 +140,7 @@ foreach (glob('modules/*/baseconfig/getconfig.inc.php') as $file) {
$mod = Module::get($out[1]);
if ($mod === false)
continue;
- $mod->activate();
+ $mod->activate(1, false);
foreach ($mod->getDependencies() as $dep) {
$depFile = 'modules/' . $dep . '/baseconfig/getconfig.inc.php';
if (file_exists($depFile) && Module::isAvailable($dep)) {
diff --git a/modules-available/baseconfig/config.json b/modules-available/baseconfig/config.json
index e4d906e1..357a117e 100644
--- a/modules-available/baseconfig/config.json
+++ b/modules-available/baseconfig/config.json
@@ -1,4 +1,7 @@
{
"category": "main.settings-client",
- "dependencies" : ["js_selectize", "bootstrap_multiselect"]
-}
+ "dependencies": [
+ "js_selectize",
+ "bootstrap_multiselect"
+ ]
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/lang/de/permissions.json b/modules-available/baseconfig/lang/de/permissions.json
new file mode 100644
index 00000000..a010cebe
--- /dev/null
+++ b/modules-available/baseconfig/lang/de/permissions.json
@@ -0,0 +1,4 @@
+{
+ "edit": "Konfigurationsvariablen bearbeiten",
+ "view": "Konfigurationsvariablen anzeigen"
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/lang/en/permissions.json b/modules-available/baseconfig/lang/en/permissions.json
new file mode 100644
index 00000000..9fe69752
--- /dev/null
+++ b/modules-available/baseconfig/lang/en/permissions.json
@@ -0,0 +1,4 @@
+{
+ "edit": "Edit config variables",
+ "view": "Show config variables"
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/page.inc.php b/modules-available/baseconfig/page.inc.php
index 426d3fdd..97fb6072 100644
--- a/modules-available/baseconfig/page.inc.php
+++ b/modules-available/baseconfig/page.inc.php
@@ -13,19 +13,25 @@ class Page_BaseConfig extends Page
protected function doPreprocess()
{
User::load();
+ if (!User::isLoggedIn()) {
+ Message::addError('main.no-permission');
+ Util::redirect('?do=Main');
+ }
// Determine if we're setting global or module specific
$this->getModuleSpecific();
$newValues = Request::post('setting');
if (is_array($newValues)) {
- if (!User::hasPermission('superadmin')) {
- Message::addError('main.no-permission');
- Util::redirect('?do=baseconfig');
+ if ($this->targetModule === 'locations') {
+ User::assertPermission('edit', $this->qry_extra['field_value']);
+ } else {
+ User::assertPermission('edit', 0);
}
// Build variables for specific sub-settings
if ($this->targetModule === false) {
- // We're editing global settings - use the 'enabled' field
+ // We're editing global settings
+ // use the 'enabled' field
$qry_insert = ', enabled';
$qry_values = ', :enabled';
$qry_update = ', enabled = :enabled';
@@ -115,10 +121,6 @@ class Page_BaseConfig extends Page
protected function doRender()
{
- if (!User::hasPermission('superadmin')) {
- Message::addError('main.no-permission');
- Util::redirect('?do=Main');
- }
// Check if valid submodule mode, store name if any
if ($this->targetModule !== false) {
$this->qry_extra['subheading'] = $this->getCurrentModuleName();
@@ -127,6 +129,13 @@ class Page_BaseConfig extends Page
Util::redirect('?do=BaseConfig');
}
}
+ if ($this->targetModule === 'locations') {
+ User::assertPermission('view', $this->qry_extra['field_value']);
+ $editForbidden = !User::hasPermission('edit', $this->qry_extra['field_value']);
+ } else {
+ User::assertPermission('view', 0);
+ $editForbidden = !User::hasPermission('edit', 0);
+ }
// Get stuff that's set in DB already
if ($this->targetModule === false) {
$fields = ', enabled';
@@ -183,15 +192,13 @@ class Page_BaseConfig extends Page
if (!isset($settings[$var['catid']]['settings'][$key]['shadows'])) {
$settings[$var['catid']]['settings'][$key]['shadows'] = isset($var['shadows']) ? $var['shadows'] : null;
}
- //echo "<pre>";
- //var_dump($settings[$var['catid']]['settings'][$key]);
- //echo "</pre>";
$settings[$var['catid']]['settings'][$key] += array(
'item' => $this->makeInput(
$var['validator'],
$key,
$settings[$var['catid']]['settings'][$key]['displayvalue'],
- $settings[$var['catid']]['settings'][$key]['shadows']
+ $settings[$var['catid']]['settings'][$key]['shadows'],
+ $editForbidden
),
'description' => Util::markup(Dictionary::translateFileModule($var['module'], 'config-variables', $key)),
'setting' => $key,
@@ -218,6 +225,7 @@ class Page_BaseConfig extends Page
'override' => $this->targetModule !== false,
'categories' => array_values($settings),
'target_module' => $this->targetModule,
+ 'edit_disabled' => $editForbidden ? 'disabled' : '',
) + $this->qry_extra);
Module::isAvailable('bootstrap_switch');
}
@@ -296,13 +304,16 @@ class Page_BaseConfig extends Page
* @param string $validator
* @return boolean
*/
- private function makeInput($validator, $setting, $current, $shadows)
+ private function makeInput($validator, $setting, $current, $shadows, $disabled)
{
/* for the html snippet we need: */
$args = array('class' => 'form-control', 'name' => "setting[$setting]", 'id' => $setting);
if (!empty($shadows)) {
$args['data-shadows'] = json_encode($shadows);
}
+ if ($disabled) {
+ $args['disabled'] = true;
+ }
$inner = "";
/* -- */
@@ -360,10 +371,13 @@ class Page_BaseConfig extends Page
$output = "<$tag ";
foreach ($args as $key => $val) {
+ if ($val === true) {
+ $output .= $key . ' ';
+ }
$output .= "$key=\"" . htmlspecialchars($val) . '" ';
}
if (empty($inner)) {
- $output .= '/>';
+ $output .= '>';
} else {
$output .= '>' . $inner . "</$tag>";
}
diff --git a/modules-available/baseconfig/permissions/permissions.json b/modules-available/baseconfig/permissions/permissions.json
new file mode 100644
index 00000000..9edefdfb
--- /dev/null
+++ b/modules-available/baseconfig/permissions/permissions.json
@@ -0,0 +1,8 @@
+{
+ "view": {
+ "location-aware": true
+ },
+ "edit": {
+ "location-aware": true
+ }
+} \ No newline at end of file
diff --git a/modules-available/baseconfig/templates/_page.html b/modules-available/baseconfig/templates/_page.html
index 89caf9f2..110ee5ec 100644
--- a/modules-available/baseconfig/templates/_page.html
+++ b/modules-available/baseconfig/templates/_page.html
@@ -29,7 +29,7 @@
{{#defaultvalue}}{{lang_defaultValue}}:{{/defaultvalue}}
{{defaultvalue}}
</div>
- <input class="bs-switch" name="override[{{setting}}]" id="CB_{{setting}}" type="checkbox" {{checked}}>
+ <input class="bs-switch" name="override[{{setting}}]" id="CB_{{setting}}" type="checkbox" {{checked}} {{edit_disabled}}>
<label for="CB_{{setting}}">
{{#override}}{{lang_enableOverride}}{{/override}}
{{^override}}{{lang_settingActive}}{{/override}}
@@ -73,7 +73,7 @@
{{#override}}
<a class="btn btn-default" href="api.php?do=baseconfig&amp;user={{userid}}&amp;module={{target_module}}&amp;value={{field_value}}&amp;force=1">Download</a>
{{/override}}
- <button class="btn btn-primary" type="submit"><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
+ <button class="btn btn-primary" type="submit" {{edit_disabled}}><span class="glyphicon glyphicon-floppy-disk"></span> {{lang_save}}</button>
</div>
<br/>
@@ -86,6 +86,8 @@ function updateShadows(e) {
if (!rules) return;
var currentValue = $(e).val();
for (var triggerVal in rules) {
+ if (!rules.hasOwnProperty(triggerVal))
+ continue;
var targets = rules[triggerVal];
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
@@ -95,11 +97,11 @@ function updateShadows(e) {
if (currentValue === triggerVal) {
inp.prop('disabled', true);
if (selitem) selitem.disable();
- $('#' + target + '.multilist').multiselect('disable');
+ inp.filter('.multiselect').multiselect('disable');
} else {
inp.prop('disabled', false);
if (selitem) selitem.enable();
- $('#' + target + '.multilist').multiselect('enable');
+ inp.filter('.multiselect').multiselect('enable');
}
}
}
@@ -125,6 +127,7 @@ document.addEventListener("DOMContentLoaded", function () {
buttonWidth: '100%',
buttonClass: 'form-control'
});
+ $('select.multiselect').filter(':disabled').multiselect('disable');
/* data-shadowing bindings */
var $allShadowingFields = $('[data-shadows]');