summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2013-10-29 20:02:30 +0100
committerSimon Rettberg2013-10-29 20:02:30 +0100
commit010656745dd6f7db6b09ec501ad3bb1e202b9a96 (patch)
tree2900c8daafe4b0b79cd6766348eb6db0b763bc54
parentDB-Support, add user functionality (diff)
downloadslx-admin-010656745dd6f7db6b09ec501ad3bb1e202b9a96.tar.gz
slx-admin-010656745dd6f7db6b09ec501ad3bb1e202b9a96.tar.xz
slx-admin-010656745dd6f7db6b09ec501ad3bb1e202b9a96.zip
First version of basic minilinux configuration
-rw-r--r--DB_SCRIBBLE69
-rw-r--r--inc/message.inc.php2
-rw-r--r--inc/permission.inc.php25
-rw-r--r--inc/user.inc.php6
-rw-r--r--inc/util.inc.php10
-rw-r--r--index.php1
-rw-r--r--modules/adduser.inc.php3
-rw-r--r--modules/baseconfig.inc.php41
-rw-r--r--style/default.css1
-rw-r--r--templates/main-menu.html14
-rw-r--r--templates/page-baseconfig.html25
-rw-r--r--templates/page-login.html2
-rw-r--r--templates/page-main.html2
13 files changed, 191 insertions, 10 deletions
diff --git a/DB_SCRIBBLE b/DB_SCRIBBLE
new file mode 100644
index 00000000..07e00ebf
--- /dev/null
+++ b/DB_SCRIBBLE
@@ -0,0 +1,69 @@
+CREATE DATABASE openslx;
+CREATE USER openslx@localhost;
+SET PASSWORD FOR openslx@localhost = Password('geheim');
+GRANT ALL ON openslx.* TO openslx@localhost;
+
+
+
+CREATE TABLE IF NOT EXISTS `permission` (
+ `mask` int(10) unsigned NOT NULL,
+ `identifier` varchar(32) NOT NULL,
+ `description` text NOT NULL,
+ PRIMARY KEY (`mask`),
+ UNIQUE KEY `identifier` (`identifier`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+INSERT INTO `permission` (`mask`, `identifier`, `description`) VALUES
+(1, 'superadmin', 'SuperAdmin - Dieser Benutzer darf alle Einstellungen sehen und ändern, unabhängig davon, ob ihr die Rechte dafür explizit gewährt wurden.'),
+(2, 'baseconfig_global', 'Basiskonfiguration global und für jeden Poolraum ändern.'),
+(4, 'baseconfig_local', 'Basiskonfiguration für dem Benutzer zugewiesene Poolräume ändern.');
+
+
+
+CREATE TABLE IF NOT EXISTS `setting` (
+ `setting` varchar(28) NOT NULL,
+ `defaultvalue` text NOT NULL,
+ `permissions` int(10) unsigned NOT NULL,
+ `description` text NOT NULL,
+ PRIMARY KEY (`setting`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+INSERT INTO `setting` (`setting`, `defaultvalue`, `permissions`, `description`) VALUES
+('SLX_BIOS_CLOCK', 'off', 2, 'Legt fest, ob und wie die interne Uhr des Rechners im Bezug auf die Systemzeit des /MiniLinux/ gesetzt werden soll.\r\n*off* = Die interne Uhr des Rechners wird nicht verändert.\r\n*local* = Die interne Uhr wird auf die Lokalzeit gesetzt. Bevorzugt wenn z.B. noch eine native Windows-Installation auf dem PC vorhanden ist.\r\n*utc* = Die interne Uhr wird auf die /Koordinierte Weltzeit/ gesetzt. Dies ist die gängige Einstellung in einem reinen Linux-Umfeld.'),
+('SLX_NET_DOMAIN', '', 2, 'DNS-Domäne, in die sich die Clients eingliedern, sofern der DHCP Server keine solche vorgibt.'),
+('SLX_NTP_SERVER', '0.de.pool.ntp.org 1.de.pool.ntp.org', 2, 'Adresse des NTP-Zeitservers. Es können mehrere Server mit Leerzeichen getrennt angegeben werden.\r\nDie Server werden der Reihe nach angefragt, bis ein antwortender Server gefunden wird.'),
+('SLX_PROXY_BLACKLIST', '', 2, 'Adressen bzw. Adressbereiche, für die der Proxyserver nicht verwendet werden soll (z.B. der Adressbereich der Einrichtung). Gültige Angaben sind einzelne IP-Adressen, sowie IP-Bereiche in CIDR-Notation (z.B. 1.2.0.0/16). Mehrere Angaben können durch Leerzeichen getrennt werden.'),
+('SLX_PROXY_IP', '', 2, 'Die Adresse des zu verwendenden Proxy Servers.'),
+('SLX_PROXY_MODE', 'off', 2, 'Legt fest, ob zum Zugriff aufs Internet ein Proxy-Server benötigt wird.\r\n*off* = keinen Proxy benutzen.\r\n*on* = Proxy immer benutzen.\r\n*auto* = Proxy nur benutzen, wenn sich der Client-PC in einem privaten Adressbereich befindet.'),
+('SLX_PROXY_PORT', '', 2, 'Der Port des zu verwendenden Proxy Servers.'),
+('SLX_PROXY_TYPE', 'socks5', 2, 'Art des Proxys.\r\n*socks4*, *socks5*,\r\n*http-connect* (HTTP Proxy mit Unterstützung der CONNECT-Methode),\r\n*http-relay* (Klassischer HTTP Proxy)'),
+('SLX_VM_NFS', '', 2, 'Serveradresse und mount point des NFS Servers, auf dem die virtuellen Maschinen liegen.\r\nBeispiel: *vm-store.example.com:/data/images*');
+
+
+
+CREATE TABLE IF NOT EXISTS `setting_distro` (
+ `distroid` int(10) unsigned NOT NULL,
+ `setting` varchar(28) NOT NULL,
+ `value` text NOT NULL,
+ PRIMARY KEY (`distroid`,`setting`),
+ KEY `setting` (`setting`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `setting_global` (
+ `setting` varchar(28) NOT NULL,
+ `value` text NOT NULL,
+ PRIMARY KEY (`setting`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `user` (
+ `userid` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `login` varchar(100) NOT NULL,
+ `passwd` varchar(150) NOT NULL,
+ `fullname` varchar(100) DEFAULT NULL,
+ `phone` varchar(100) DEFAULT NULL,
+ `email` varchar(100) DEFAULT NULL,
+ `permissions` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`userid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
diff --git a/inc/message.inc.php b/inc/message.inc.php
index b24bf2a1..b90ed630 100644
--- a/inc/message.inc.php
+++ b/inc/message.inc.php
@@ -8,6 +8,8 @@ $error_text = array(
'password-mismatch' => 'Passwort und Passwortbestätigung stimmen nicht überein',
'empty-field' => 'Ein benötigtes Feld wurde nicht ausgefüllt',
'adduser-success' => 'Benutzer erfolgreich hinzugefügt',
+ 'no-permission' => 'Keine ausreichenden Rechte, um auf diese Seite zuzugreifen',
+ 'settings-updated' => 'Einstellungen wurden aktualisiert',
);
class Message
diff --git a/inc/permission.inc.php b/inc/permission.inc.php
new file mode 100644
index 00000000..b63e9d45
--- /dev/null
+++ b/inc/permission.inc.php
@@ -0,0 +1,25 @@
+<?php
+
+class Permission
+{
+ private static $permissions = false;
+
+ public static function get($permission)
+ {
+ self::init();
+ if (!isset(self::$permissions[$permission])) Util::traceError('Invalid permission: ' . $permission);
+ return self::$permissions[$permission];
+ }
+
+ private static function init()
+ {
+ if (self::$permissions !== false) return;
+ self::$permissions = array();
+ $res = Database::simpleQuery('SELECT mask, identifier FROM permission');
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ self::$permissions[$row['identifier']] = $row['mask'];
+ }
+ }
+
+}
+
diff --git a/inc/user.inc.php b/inc/user.inc.php
index b988bbeb..38e57e33 100644
--- a/inc/user.inc.php
+++ b/inc/user.inc.php
@@ -17,6 +17,12 @@ class User
return self::$user['fullname'];
}
+ public static function hasPermission($permission)
+ {
+ if (self::$user === false) return false;
+ return (self::$user['permissions'] & Permission::get($permission)) != 0;
+ }
+
public static function load()
{
if (Session::load()) {
diff --git a/inc/util.inc.php b/inc/util.inc.php
index b4a0036e..0d85b989 100644
--- a/inc/util.inc.php
+++ b/inc/util.inc.php
@@ -32,5 +32,15 @@ class Util
Message::addError('token');
return false;
}
+
+ function markup($string)
+ {
+ $string = htmlspecialchars($string);
+ $string = preg_replace('#(^|[\n \-_/\.])\*(.+?)\*($|[ \-_/\.\!\?,])#is', '$1<b>$2</b>$3', $string);
+ $string = preg_replace('#(^|[\n \-\*/\.])_(.+?)_($|[ \-\*/\.\!\?,])#is', '$1<u>$2</u>$3', $string);
+ $string = preg_replace('#(^|[\n \-_\*\.])/(.+?)/($|[ \-_\*\.\!\?,])#is', '$1<i>$2</i>$3', $string);
+ return nl2br($string);
+ }
+
}
diff --git a/index.php b/index.php
index 5e4262c4..aa88db53 100644
--- a/index.php
+++ b/index.php
@@ -8,6 +8,7 @@ require_once('inc/menu.inc.php');
require_once('inc/util.inc.php');
require_once('inc/message.inc.php');
require_once('inc/db.inc.php');
+require_once('inc/permission.inc.php');
if (empty($_REQUEST['do'])) {
// No specific module - set default
diff --git a/modules/adduser.inc.php b/modules/adduser.inc.php
index 7e03b040..3e49a78a 100644
--- a/modules/adduser.inc.php
+++ b/modules/adduser.inc.php
@@ -27,10 +27,13 @@ if (isset($_POST['action']) && $_POST['action'] === 'adduser') {
function render_module()
{
+ // A user was added. Show success message and bail out
if (isset($adduser_success)) {
Message::addInfo('adduser-success');
return;
}
+ // No user was added, check if current user is allowed to add a new user
+ // Currently you can only add users if there is no user yet. :)
if (Database::queryFirst('SELECT userid FROM user LIMIT 1') !== false) {
Message::addError('adduser-disabled');
} else {
diff --git a/modules/baseconfig.inc.php b/modules/baseconfig.inc.php
new file mode 100644
index 00000000..9d581624
--- /dev/null
+++ b/modules/baseconfig.inc.php
@@ -0,0 +1,41 @@
+<?php
+
+User::load();
+
+if (isset($_POST['setting']) && is_array($_POST['setting'])) {
+ if (User::hasPermission('superadmin')) {
+ if (Util::verifyToken()) {
+ foreach ($_POST['setting'] as $key => $value) {
+ Database::exec('UPDATE setting_global SET setting_global.value = :value WHERE setting_global.setting = :key LIMIT 1', array(
+ 'key' => $key,
+ 'value' => $value,
+ ));
+ }
+ Message::addSuccess('settings-updated');
+ }
+ }
+}
+
+function render_module()
+{
+ if (!User::hasPermission('superadmin')) {
+ Message::addError('no-permission');
+ return;
+ }
+ // List global config option
+ $rows = array();
+ $res = Database::simpleQuery('SELECT setting.setting, setting_global.value, setting.permissions, setting.description
+ FROM setting
+ INNER JOIN setting_global USING (setting)
+ ORDER BY setting.setting ASC');
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $row['description'] = Util::markup($row['description']);
+ $row['big'] = false;
+ $rows[] = $row;
+ }
+ Render::addTemplate('page-baseconfig', array(
+ 'settings' => $rows,
+ 'token' => Session::get('token'),
+ ));
+}
+
diff --git a/style/default.css b/style/default.css
index f90d96de..af46eff2 100644
--- a/style/default.css
+++ b/style/default.css
@@ -1,5 +1,6 @@
body {
padding-top: 70px;
+ padding-bottom: 10px;
}
.form-signin {
diff --git a/templates/main-menu.html b/templates/main-menu.html
index 0b2cdd7f..d3d88d0f 100644
--- a/templates/main-menu.html
+++ b/templates/main-menu.html
@@ -11,14 +11,14 @@
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
- <li class="active"><a href="?do=main">Startseite</a></li>
- <li><a href="#about">About</a></li>
- <li><a href="#contact">Contact</a></li>
+ <li class="active"><a href="?do=main">Start</a></li>
+ <li><a href="#about">Hilfe</a></li>
<li class="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown<b class="caret"></b></a>
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Einstellungen<b class="caret"></b></a>
<ul class="dropdown-menu">
- <li><a href="#">Format C:</a></li>
- <li><a href="#">Kompaliere Kernel</a></li>
+ <li><a href="?do=baseconfig">Basis</a></li>
+ <li><a href="?do=authconfig">Authentifizierung</a></li>
+ <li><a href="?do=printconfig">Drucken</a></li>
<li class="divider"></li>
<li class="dropdown-header">Nav header</li>
<li><a href="#">1</a></li>
@@ -26,8 +26,6 @@
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
- <li><a href="http://www.openslx.org/">OpenSLX</a></li>
- <li><a href="http://mltk.boot.openslx.org/">mltk</a></li>
{{{loginPanel}}}
</ul>
</div>
diff --git a/templates/page-baseconfig.html b/templates/page-baseconfig.html
new file mode 100644
index 00000000..468be7cb
--- /dev/null
+++ b/templates/page-baseconfig.html
@@ -0,0 +1,25 @@
+<div class="container">
+ <h1>Basiskonfiguration</h1>
+ <form action="?do=baseconfig" method="post">
+ {{#settings}}
+ <div class="row well well-sm">
+ <div class="col-md-3">{{setting}}</div>
+ <div class="col-md-3">
+ {{#big}}
+ <textarea name="setting[{{setting}}]" class="form-control" cols="30" rows="3">{{value}}</textarea>
+ {{/big}}
+ {{^big}}
+ <input type="text" name="setting[{{setting}}]" class="form-control" size="30" value="{{value}}">
+ {{/big}}
+ </div>
+ <div class="col-md-6">
+ <a class="btn btn-default" data-toggle="collapse" data-target="#help-{{setting}}">Hilfe &raquo;</a>
+ <div class="collapse" id="help-{{setting}}">{{{description}}}</div>
+ </div>
+ </div>
+ {{/settings}}
+ <input type="hidden" name="token" value="{{token}}">
+ <button class="btn btn-lg btn-primary" type="submit">Speichern</button>
+ <button class="btn btn-lg btn-primary" type="reset">Zurücksetzen</button>
+ </form>
+</div>
diff --git a/templates/page-login.html b/templates/page-login.html
index 8fad084d..c09db8ae 100644
--- a/templates/page-login.html
+++ b/templates/page-login.html
@@ -7,7 +7,7 @@
<input type="checkbox" name="remember" value="remember-me"> Angemeldet bleiben
</label>
<button class="btn btn-lg btn-primary btn-block" type="submit">Anmelden</button>
- <a class="btn btn-lg btn-primary btn-block" href="">Registrieren</a>
+ <a class="btn btn-lg btn-primary btn-block" href="?do=adduser">Registrieren</a>
<input type="hidden" name="action" value="login">
</form>
</div>
diff --git a/templates/page-main.html b/templates/page-main.html
index f7c0bfa3..7ccf43eb 100644
--- a/templates/page-main.html
+++ b/templates/page-main.html
@@ -1,6 +1,6 @@
<div class="jumbotron">
<h1>Willkommen, {{user}}</h1>
- <p>Du hast es geschafft. dich einzuloggen. Starker Typ!</p>
+ <p>Du hast es geschafft, dich einzuloggen. Starker Typ!</p>
<p>Du bist der Beste! Du bist der Größte! Ein Hoch auf {{user}}!</p>
</div>