diff options
Diffstat (limited to 'modules-available/baseconfig')
-rw-r--r-- | modules-available/baseconfig/api.inc.php | 23 | ||||
-rw-r--r-- | modules-available/baseconfig/config.json | 7 | ||||
-rw-r--r-- | modules-available/baseconfig/lang/de/permissions.json | 4 | ||||
-rw-r--r-- | modules-available/baseconfig/lang/en/permissions.json | 4 | ||||
-rw-r--r-- | modules-available/baseconfig/page.inc.php | 42 | ||||
-rw-r--r-- | modules-available/baseconfig/permissions/permissions.json | 8 | ||||
-rw-r--r-- | modules-available/baseconfig/templates/_page.html | 11 |
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&user={{userid}}&module={{target_module}}&value={{field_value}}&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]'); |