diff options
-rw-r--r-- | DB_SCRIBBLE | 69 | ||||
-rw-r--r-- | inc/message.inc.php | 2 | ||||
-rw-r--r-- | inc/permission.inc.php | 25 | ||||
-rw-r--r-- | inc/user.inc.php | 6 | ||||
-rw-r--r-- | inc/util.inc.php | 10 | ||||
-rw-r--r-- | index.php | 1 | ||||
-rw-r--r-- | modules/adduser.inc.php | 3 | ||||
-rw-r--r-- | modules/baseconfig.inc.php | 41 | ||||
-rw-r--r-- | style/default.css | 1 | ||||
-rw-r--r-- | templates/main-menu.html | 14 | ||||
-rw-r--r-- | templates/page-baseconfig.html | 25 | ||||
-rw-r--r-- | templates/page-login.html | 2 | ||||
-rw-r--r-- | templates/page-main.html | 2 |
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); + } + } @@ -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 »</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> |