summaryrefslogtreecommitdiffstats
path: root/modules/baseconfig
diff options
context:
space:
mode:
authorJonathan Bauer2016-04-01 16:50:13 +0200
committerJonathan Bauer2016-04-01 16:50:13 +0200
commitdbc0d9614421e064cc62aacf116ebb783c83f2f3 (patch)
tree091844b8578ff1d9ac18edfd3cee3e63210133d7 /modules/baseconfig
parent[ldapauth] Add homedir conf to ldap wizard (diff)
downloadslx-admin-dbc0d9614421e064cc62aacf116ebb783c83f2f3.tar.gz
slx-admin-dbc0d9614421e064cc62aacf116ebb783c83f2f3.tar.xz
slx-admin-dbc0d9614421e064cc62aacf116ebb783c83f2f3.zip
[merge] merging c3sl / fr - initial commit
Diffstat (limited to 'modules/baseconfig')
-rw-r--r--modules/baseconfig/config.json4
-rw-r--r--modules/baseconfig/module.inc.php127
-rw-r--r--modules/baseconfig/templates/_page.html186
3 files changed, 317 insertions, 0 deletions
diff --git a/modules/baseconfig/config.json b/modules/baseconfig/config.json
new file mode 100644
index 00000000..93209f62
--- /dev/null
+++ b/modules/baseconfig/config.json
@@ -0,0 +1,4 @@
+{
+ "category":"settings",
+ "enabled":"true"
+}
diff --git a/modules/baseconfig/module.inc.php b/modules/baseconfig/module.inc.php
new file mode 100644
index 00000000..3d187d30
--- /dev/null
+++ b/modules/baseconfig/module.inc.php
@@ -0,0 +1,127 @@
+<?php
+
+class Page_BaseConfig extends Page
+{
+ private $qry_extra = array();
+
+ protected function doPreprocess()
+ {
+ User::load();
+
+ // Determine if we're setting global, distro or pool
+ if (isset($_REQUEST['distroid'])) {
+ // TODO: Everything
+ $this->qry_extra[] = array(
+ 'name' => 'distroid',
+ 'value' => (int)$_REQUEST['distroid'],
+ 'table' => 'setting_distro',
+ );
+ if (isset($_REQUEST['poolid'])) {
+ $this->qry_extra[] = array(
+ 'name' => 'poolid',
+ 'value' => (int)$_REQUEST['poolid'],
+ 'table' => 'setting_pool',
+ );
+ }
+ }
+
+ if (isset($_POST['setting']) && is_array($_POST['setting'])) {
+ if (User::hasPermission('superadmin')) {
+ // Build variables for specific sub-settings
+ $qry_insert = '';
+ $qry_values = '';
+ foreach ($this->qry_extra as $item) {
+ $qry_insert = ', ' . $item['name'];
+ $qry_values = ', :' . $item['name'];
+ }
+ // Load all existing config options to validate input
+ $res = Database::simpleQuery('SELECT setting, validator FROM setting');
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $key = $row['setting'];
+ $validator = $row['validator'];
+ $displayValue = (isset($_POST['setting'][$key]) ? $_POST['setting'][$key] : '');
+ // Validate data first!
+ $mangledValue = Validator::validate($validator, $displayValue);
+ if ($mangledValue === false) {
+ Message::addWarning('value-invalid', $key, $displayValue);
+ continue;
+ }
+ // Now put into DB
+ Database::exec("INSERT INTO setting_global (setting, value, displayvalue $qry_insert)
+ VALUES (:key, :value, :displayvalue $qry_values)
+ ON DUPLICATE KEY UPDATE value = :value, displayvalue = :displayvalue",
+ $this->qry_extra + array(
+ 'key' => $key,
+ 'value' => $mangledValue,
+ 'displayvalue' => $displayValue
+ )
+ );
+ }
+ Message::addSuccess('settings-updated');
+ Util::redirect('?do=BaseConfig');
+ }
+ }
+ }
+
+ protected function doRender()
+ {
+ if (!User::hasPermission('superadmin')) {
+ Message::addError('no-permission');
+ Util::redirect('?do=Main');
+ }
+ // Build left joins for specific settings
+ $joins = '';
+ foreach ($this->qry_extra as $item) {
+ $joins .= " LEFT JOIN {$item['table']} ";
+ }
+ // List global config option
+ $settings = array();
+ $res = Database::simpleQuery('SELECT cat_setting.catid, setting.setting, setting.defaultvalue, setting.permissions, setting.validator, tbl.displayvalue
+ FROM setting
+ INNER JOIN cat_setting USING (catid)
+ LEFT JOIN setting_global AS tbl USING (setting)
+ ORDER BY cat_setting.sortval ASC, setting.setting ASC');
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $row['description'] = Util::markup(Dictionary::translate('settings/setting', $row['setting']));
+ if (is_null($row['displayvalue'])) $row['displayvalue'] = $row['defaultvalue'];
+ $row['item'] = $this->makeInput($row['validator'], $row['setting'], $row['displayvalue']);
+ $settings[$row['catid']]['settings'][] = $row;
+ $settings[$row['catid']]['category_name'] = Dictionary::translate('settings/cat_setting', 'cat_' . $row['catid']);
+ $settings[$row['catid']]['category_id'] = $row['catid'];
+ }
+ Render::addTemplate('_page', array(
+ 'categories' => array_values($settings)
+ ));
+ }
+
+ /**
+ * Create html snippet for setting, based on given validator
+ * @param type $validator
+ * @return boolean
+ */
+ private function makeInput($validator, $setting, $current)
+ {
+ $parts = explode(':', $validator, 2);
+ if ($parts[0] === 'list') {
+ $items = explode('|', $parts[1]);
+ $ret = '<select name="setting[' . $setting . ']" class="form-control">';
+ foreach ($items as $item) {
+ if ($item === $current) {
+ $ret .= '<option selected="selected">' . $item . '</option>';
+ } else {
+ $ret .= '<option>' . $item . '</option>';
+ }
+ }
+ return $ret . '</select>';
+ }
+ // Password field guessing
+ if (stripos($validator, 'password') !== false) {
+ $type = Property::getPasswordFieldType();
+ } else {
+ $type = 'text';
+ }
+ // Fallback: single line input
+ return '<input type="' . $type . '" name="setting[' . $setting . ']" class="form-control" size="30" value="' . $current . '">';
+ }
+
+}
diff --git a/modules/baseconfig/templates/_page.html b/modules/baseconfig/templates/_page.html
new file mode 100644
index 00000000..c72f0a5e
--- /dev/null
+++ b/modules/baseconfig/templates/_page.html
@@ -0,0 +1,186 @@
+<h1>{{lang_basicConfiguration}}</h1>
+<p>{{lang_clientRelatedConfig}}</p>
+<form action="?do=BaseConfig" method="post">
+ <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
+ <input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="display:none;">
+ <input type="password" name="password_fake" id="password_fake" value="" style="display:none;">
+ {{#categories}}
+ <div class="panel panel-default">
+ <div class="panel-heading" role="tab" id="heading{{category_id}}">
+ <a data-toggle="collapse" data-parent="#accordion" href="#collapse{{category_id}}" aria-expanded="false" aria-controls="collapse{{category_id}}">
+ {{category_name}}
+ </a>
+ </div>
+ <div id="collapse{{category_id}}" class="accordion-body collapse" role="tabpanel" aria-labelledby="heading{{category_id}}">
+ <div class="panel-body">
+ <div class="list-group">
+ {{#settings}}
+ <div class="list-group-item {{class}}">
+ <div class="row">
+ <div class="col-md-1" style="width:118px;">
+ <input type="checkbox" name="switch[{{setting}}]" {{checked}}>
+ </div>
+ <div class="col-md-4">
+ {{setting}}
+ <div class="slx-default">{{defaultvalue}}</div>
+ </div>
+ <div class="col-md-4">
+ {{{item}}}
+ </div>
+ <div class="col-md-2">
+ <a class="btn btn-default" data-toggle="modal" data-target="#help-{{setting}}"><span class="glyphicon glyphicon-question-sign"></span></a>
+ </div>
+ </div>
+ </div>
+ <div class="modal fade" id="help-{{setting}}" tabindex="-1" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">{{setting}}</div>
+ <div class="modal-body">{{{description}}}</div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
+ </div>
+ </div>
+ </div>
+ {{/settings}}
+ </div>
+ <div id="cat-extra-{{category_id}}">
+
+ </div>
+ </div>
+ </div>
+ </div>
+ {{/categories}}
+
+
+
+ <!-- User Managment Section -->
+ <div class="panel panel-default">
+ <div class="panel-heading" role="tab" id="headingUsers">
+ <a data-toggle="collapse" data-parent="#accordion" href="#collapseUsers" aria-expanded="false" aria-controls="collapseUsers">
+ {{lang_catUser}}
+ </a>
+ <span style="display:inline-block; float: right; margin-top: -7px;">
+ <a class="btn btn-default " data-toggle="modal" data-target="#add-user">
+ <span class="glyphicon glyphicon-plus"></span>
+ </a>
+ </span>
+ </div>
+ <div id="collapseUsers" class="accordion-body collapse" role="tabpanel" aria-labelledby="headingUsers">
+ <div class="panel-body">
+ <div class="list-group">
+ {{#users}}
+ <div class="list-group-item">
+ <div class="row">
+ <div class="col-md-5">
+ <input name="user-{{id}}-name" type="text" class="form-control" size="30" value="{{name}}" />
+ </div>
+ <div class="col-md-5">
+ <input name="user-{{id}}-password" type="text" class="form-control" size="30" placeholder="{{lang_userPasswd}}" />
+ </div>
+ <div class="col-md-2">
+ <a class="btn btn-danger" href="?do=BaseConfig&deleteUser={{id}}&token={{token}}" ><span class="glyphicon glyphicon-trash"></span> {{lang_delete}}</a>
+ </div>
+ </div>
+ </div>
+ {{/users}}
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <input type="hidden" name="token" value="{{token}}">
+ <button class="btn btn-lg btn-primary" type="submit">{{lang_save}}</button>
+ <button class="btn btn-lg btn-primary" type="reset">{{lang_reset}}</button>
+ <a class="btn btn-lg btn-primary" href="api.php?do=getconfig">Download</a>
+</form>
+<p>
+ <form method="post" action="?do=BaseConfig">
+ <input type="hidden" name="token" value="{{token}}">
+ <input type="hidden" name="action" value="reset">
+ <button class="btn btn-default" type="submit" onclick="return confirm('{{lang_resetConfirm}}');">{{lang_resetDefault}}</button>
+ </form>
+</p>
+<!-- Create User Window -->
+<form action="?do=BaseConfig" method="post">
+ <div class="modal fade" id="add-user" tabindex="-1" role="dialog">
+ <div class="modal-dialog">
+
+ <div class="modal-content">
+ <div class="modal-header">{{lang_newUser}}</div>
+ <div class="modal-body">
+
+ <p>
+ <input name="new-user-name" placeholder="{{lang_userName}}" class="form-control" type="text">
+ </p>
+ <p>
+ <input name="new-user-passwd" placeholder="{{lang_userPasswd}}" class="form-control" type="password">
+ </p>
+ <input type="submit" class="btn btn-primary" value="{{lang_create}}">
+ </div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
+ </div>
+ </div>
+ </div>
+ <input type="hidden" name="action" value="new_user">
+ <input type="hidden" name="token" value="{{token}}">
+</form>
+<!-- Create Partition Window -->
+<form action="?do=BaseConfig" method="post">
+ <div class="modal fade" id="add-partition" tabindex="-1" role="dialog">
+ <div class="modal-dialog">
+
+ <div class="modal-content">
+ <div class="modal-header">{{lang_newPartition}}</div>
+ <div class="modal-body">
+
+ <div class="input-group">
+ <span class="input-group-addon">{{lang_partitionId}}</span>
+ <input name="new-partition-id" class="form-control" type="text">
+ </div>
+ <p class="help-block">{{lang_helpId}}</p>
+ <div class="input-group">
+ <span class="input-group-addon">{{lang_partitionSize}}</span>
+ <input name="new-partition-size" class="form-control" type="text">
+ </div>
+ <p class="help-block">{{lang_helpSize}}</p>
+ <div class="input-group">
+ <span class="input-group-addon">{{lang_partitionMountPoint}}</span>
+ <input name="new-partition-mount-point" class="form-control" type="text">
+ </div>
+ <p class="help-block">{{lang_helpMountPoint}}</p>
+ <div class="input-group">
+ <span class="input-group-addon">{{lang_partitionOptions}}</span>
+ <input name="new-partition-options" class="form-control" type="text">
+ </div>
+ <p class="help-block">{{lang_helpOptions}}</p>
+ <input type="submit" class="btn btn-primary" value="{{lang_create}}">
+ </div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
+ </div>
+ </div>
+ </div>
+ <input type="hidden" name="action" value="new_partition">
+ <input type="hidden" name="token" value="{{token}}">
+</form>
+<script type="text/javascript">
+document.getElementById("cat-extra-6").innerHTML = "<div class='list-group'> <div class='list-group-item' style='background-color:#f5f5f5;color:#428bca;'> " +
+"{{lang_catPartition}} <span style='display:inline-block; float: right; margin-top: -7px;'> <a class='btn btn-default ' data-toggle='modal' " +
+"data-target='#add-partition'> <span class='glyphicon glyphicon-plus'></span> </a> </span> </div> {{#partitions}} <div class='list-group-item'> " +
+"<div class='row'> <div class='col-md-1'> <input name='partition-{{id}}-partition_id' type='text' class='form-control' size='30' value='{{partition_id}}'" +
+" placeholder='{{lang_partitionId}}' /> </div> <div class='col-md-1'> <input name='partition-{{id}}-size' type='text' class='form-control' size='30' " +
+"value='{{size}}' placeholder='{{lang_partitionSize}}'/> </div> <div class='col-md-4'> <input name='partition-{{id}}-mount_point' type='text' " +
+"class='form-control' size='30' value='{{mount_point}}' placeholder='{{lang_partitionMountPoint}}'/> </div> <div class='col-md-4'> <input " +
+"name='partition-{{id}}-options' type='text' class='form-control' size='30' value='{{options}}' placeholder='{{lang_partitionOptions}}'/> </div> " +
+"<div class='col-md-2'> <a class='btn btn-danger' href='?do=BaseConfig&deletePartition={{id}}&token={{token}}' ><span class='glyphicon glyphicon-trash'>" +
+"</span> {{lang_delete}}</a> </div> </div> </div> {{/partitions}} </div> </div>";
+
+function saveConfig(){
+ if(confirm('{{lang_confirm}}'))
+ window.location = 'api.php?do=getconfig&user={{user}}&save=true';
+ else
+ window.location = 'api.php?do=getconfig&user={{user}}';
+}
+
+$("[name^='switch']").bootstrapSwitch();
+
+</script>