From bfbdc160367d633cbca6b79384f2186021cde37b Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Tue, 7 Mar 2023 14:56:32 +0100 Subject: [PATCH] Implement node flags --- asset.php | 2 +- includes.php | 4 +- install/index.php | 121 ++++++++++++++++++++++++++++++++++++++++++++++ install/mysql.sql | 1 + lang/de.php | 2 + lang/en.php | 2 + node.php | 30 +++++++++--- options.php | 3 +- subnet.php | 37 ++++++-------- tpl/assetview.tpl | 11 ++++- tpl/node.tpl | 6 ++- tpl/nodeedit.tpl | 9 ++++ tpl/nodeview.tpl | 3 +- tpl/useredit.tpl | 2 +- user.php | 5 +- 15 files changed, 200 insertions(+), 38 deletions(-) create mode 100644 install/index.php diff --git a/asset.php b/asset.php index 27e60b6..3b46635 100644 --- a/asset.php +++ b/asset.php @@ -167,7 +167,7 @@ $sth->execute([$id]); $asset = $sth->fetch(PDO::FETCH_OBJ); $smarty->assign("asset", $asset); -$sql = "SELECT node_id, node_ip, +$sql = "SELECT node_id, node_ip, node.node_flags & 0x1 = 1 AS deleted, CONCAT(LEFT(node_info, 40), IF(CHAR_LENGTH(node_info)>40,'...','')) AS node_info FROM node WHERE asset_id=? diff --git a/includes.php b/includes.php index 880f88e..998f4a1 100644 --- a/includes.php +++ b/includes.php @@ -12,7 +12,9 @@ session_start(); // check for user_id, if unnkown, redirect to login if (empty($_SESSION['suser_id'])) { - $_SESSION['prelogin'] = $_SERVER['REQUEST_URI']; + if (isset($_SERVER['REQUEST_URI'])) { + $_SESSION['prelogin'] = $_SERVER['REQUEST_URI']; + } header("Location: login.php"); exit; } diff --git a/install/index.php b/install/index.php new file mode 100644 index 0000000..c34b124 --- /dev/null +++ b/install/index.php @@ -0,0 +1,121 @@ + + + + +Install + + +

Installation check

+PDO database interface: %s'."

\n"; +$failure = ! in_array('PDO', $ext); +$res = $failure ? ['red', 'Error'] : ['green', 'OK']; +echo vsprintf($msg, $res); + +// config file +if (! $failure) { + $conffile = '../config.php'; + $perms = fileperms($conffile); + if ($perms & 0x07) { + echo '

Config file world readable: Error', "

\n"; + } + if ($perms & 0x10) { + echo '

Config file writeable by webserver: Error', "

\n"; + } + $msg = '

Read config file: %s'."

\n"; + $failure = (! include($conffile)); + $res = $failure ? ['red', 'Error'] : ['green', 'OK']; + echo vsprintf($msg, $res); +} else { + echo "

Configfile correct?

"; +} + +// Database connection +if (! $failure) { + try { + $dbh = new PDO("mysql:host=$config_mysql_host", $config_mysql_username, $config_mysql_password); + $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + } catch (PDOException $e) { + $details = "
" . $e->getMessage() . "
\n"; + $failure = true; + } + $msg = '

Database connection: %s'."

\n"; + $res = $failure ? ['red', 'Error'] : ['green', 'OK']; + echo vsprintf($msg, $res); + if ($failure) { + echo $details; + } +} else { + echo "

Database connection available?

\n"; +} + +// Ipreg database exists +if (! $failure) { + $sql = "SELECT SCHEMA_NAME FROM + INFORMATION_SCHEMA.SCHEMATA + WHERE SCHEMA_NAME=?"; + $sth = $dbh->prepare($sql); + $sth->execute([$config_mysql_dbname]); + $failure = ! $sth->fetchColumn(); + $msg = '

Database exists: %s'."

\n"; + $res = $failure ? ['red', 'Error'] : ['green', 'OK']; + echo vsprintf($msg, $res); + $dbh->query("USE $config_mysql_dbname"); +} else { + echo "

Database available?

\n"; +} +?> + +

Rights

+0"; + $sth = $dbh->query($sql); + $adminlist = $sth->fetchAll(PDO::FETCH_ASSOC); + $admincount = count($adminlist); + if ($admincount == 0) { + echo '

No admin user exists: Error'."

\n"; + } + + // Default admin + $sql = "SELECT user_pass FROM user WHERE user_name='admin' AND FIND_IN_SET('admin',user_role)>0"; + $sth = $dbh->query($sql); + if ($rec = $sth->fetchColumn()) { + // Check default password + if ($rec == '$2y$10$HTs0lSaFrfr.q4Gmy5zWfeDg3jhYZkqEGZEnDkMiHZ641nso38mt6') { + echo '

Password for default admin has not been changed: Warnung'."

\n"; + } else { + echo '

Default admin exists: OK'."

\n"; + } + } else { + echo "

Default admin does not exist.

\n"; + if ($admincount > 0) { + echo '

There are more admin accounts: OK', "

\n"; + } + } +} else { + echo "

Administrative user available?

\n"; +} + +// Smarty +$compiledir = '../tpl_c'; +$failure = ! is_writeable($compiledir); +$msg = '

Smarty compile directory writable: %s'."

\n"; +$res = $failure ? ['red', 'Error'] : ['green', 'OK']; +echo vsprintf($msg, $res); + +?> +

Summary

+

If everything here checks ok the installation directory install +should be removed.

+ + diff --git a/install/mysql.sql b/install/mysql.sql index 054d482..b4fa5c1 100644 --- a/install/mysql.sql +++ b/install/mysql.sql @@ -99,6 +99,7 @@ CREATE TABLE node ( zone_id int(10) DEFAULT NULL, node_info text DEFAULT NULL, node_type enum('v4','v6') NOT NULL DEFAULT 'v4', + node_flags set('deleted','reserved') DEFAULT NULL, PRIMARY KEY (node_id), INDEX ix_ip (node_ip), INDEX ix_mac (node_mac) diff --git a/lang/de.php b/lang/de.php index eb0fa59..6dabdda 100644 --- a/lang/de.php +++ b/lang/de.php @@ -53,6 +53,8 @@ $lang = array( 'lang_source' => 'Quelle', 'lang_target' => 'Ziel', 'lang_length' => 'Länge', + 'lang_flag_deleted' => 'gelöscht', + 'lang_flag_reserved' => 'reserviert', 'lang_asset_add' => 'Objekt hinzufügen', 'lang_asset_del' => 'Objekt löschen', diff --git a/lang/en.php b/lang/en.php index b35c341..a7d9ea5 100644 --- a/lang/en.php +++ b/lang/en.php @@ -53,6 +53,8 @@ $lang = array( 'lang_source' => 'Source', 'lang_target' => 'Target', 'lang_length' => 'Length', + 'lang_flag_deleted' => 'deleted', + 'lang_flag_reserved' => 'reserved', 'lang_asset_add' => 'Add asset', 'lang_asset_del' => 'Delete asset', diff --git a/node.php b/node.php index b7eb48e..e5a39f6 100644 --- a/node.php +++ b/node.php @@ -83,14 +83,24 @@ switch ($submit = form_get_action()) { $node_dns2 = sanitize($_POST['node_dns2']); $node_info = sanitize($_POST['node_info']); $zone_id = sanitize($_POST['zone_id']); + $flag_deleted = isset($_POST['flag_deleted']) or false; + $flag_reserved = isset($_POST['flag_reserved']) or false; + + // construct flags + $flags = array(); + if ($flag_deleted) $flags[] = 'deleted'; + if ($flag_reserved) $flags[] = 'reserved'; + $flags = empty($flags) ? NULL : implode(',', $flags); $sql = "UPDATE node SET asset_id=?, node_ip=?, subnet_id=?, node_mac=?, - node_dns1=?, node_dns2=?, node_info=?, zone_id=? + node_dns1=?, node_dns2=?, node_info=?, zone_id=?, + node_flags=? WHERE node_id=?"; $sth = $dbh->prepare($sql); $sth->execute([$asset_id, $node_ip, $subnet_id, $node_mac, $node_dns1, $node_dns2, $node_info, $zone_id, + $flags, $id]); $action = ACT_VIEW; break; @@ -138,19 +148,24 @@ if(isset($_GET['subnet_id'])) { $smarty->assign("subnet_id", ''); } +// deleted records only for admin or manager +if (($_SESSION['suser_role_admin'] == 0) and ($_SESSION['suser_role_manage'] == 0)) { + $w[] = "((n.node_flags IS NULL) OR (n.node_flags & 0x1 = 0))"; +} + // create sql with optional filter $where = join(' AND ', $w); $sql = "SELECT a.asset_id, CONCAT(LEFT(a.asset_info,30), IF(CHAR_LENGTH(a.asset_info)>30,'...','')) AS asset_info, REPLACE(a.asset_name, ' ', ' ') AS asset_name, - n.node_id, n.node_ip, + n.node_id, n.node_ip, (n.node_flags & 0x1)=1 AS deleted, CONCAT(LEFT(n.node_info,30), IF(CHAR_LENGTH(n.node_info)>30,'...','')) AS node_info, c.assetclass_id, c.assetclass_name FROM node AS n LEFT JOIN asset AS a USING (asset_id) LEFT JOIN assetclass AS c USING (assetclass_id)"; if ($where) { - $sql .= ' WHERE ' . $where; + $sql .= ' WHERE ' . $where . ' '; } $sql .= "GROUP BY n.node_id ORDER BY INET_ATON(n.node_ip)"; $sth = $dbh->prepare($sql); @@ -201,7 +216,8 @@ elseif ($action == ACT_VIEW): // node $sql = "SELECT n.node_id AS id, n.node_ip AS ip, n.node_mac AS mac, n.node_dns1 AS dns1, n.node_dns2 AS dns2, n.node_info AS info, - n.node_type AS type, + n.node_type AS type, n.node_flags AS flags, + (n.node_flags & 0x1)=1 AS deleted, (n.node_flags & 0x2)=2 AS reserved, a.asset_id, a.asset_name, c.assetclass_id, c.assetclass_name, s.subnet_id, s.subnet_address, s.subnet_mask, @@ -259,12 +275,14 @@ elseif ($action == ACT_EDIT): $sql = "SELECT node_id AS id, node_ip AS ip, node_mac AS mac, node_dns1 AS dns1, node_dns2 AS dns2, node_info AS info, - zone_id, asset_id, subnet_id + zone_id, asset_id, subnet_id, node_flags AS flags FROM node WHERE node_id=?"; $sth = $dbh->prepare($sql); $sth->execute([$id]); -$smarty->assign("node", $sth->fetch(PDO::FETCH_OBJ)); +$node = $sth->fetch(PDO::FETCH_OBJ); +$node->flags = explode(',', $node->flags); +$smarty->assign("node", $node); $smarty->assign("asset_options", db_get_options_asset()); $smarty->assign("subnet_options", db_get_options_subnet()); diff --git a/options.php b/options.php index d8501b0..23baf23 100644 --- a/options.php +++ b/options.php @@ -49,6 +49,7 @@ switch ($submit = form_get_action()) { if ($menu_subnets) $menu[] = 'subnet'; if ($menu_vlans) $menu[] = 'vlan'; if ($menu_zones) $menu[] = 'zone'; + $menu = empty($menu) ? NULL : implode(',', $menu); $sql = "UPDATE user SET user_language=?, user_imagesize=?, user_imagecount=?, @@ -59,7 +60,7 @@ switch ($submit = form_get_action()) { $sth = $dbh->prepare($sql); $sth->execute([$language, $imagesize, $imagecount, $mac, $dateformat, $dns1suffix, - $dns2suffix, $tooltips, implode(',', $menu), + $dns2suffix, $tooltips, $menu, $id]); $_SESSION['suser_language'] = $language; diff --git a/subnet.php b/subnet.php index dc4596f..320db5a 100644 --- a/subnet.php +++ b/subnet.php @@ -186,12 +186,12 @@ if ($action == ACT_DEFAULT): // ========== VARIANT: default behavior ======================================= $sql = "SELECT s.subnet_id, s.subnet_address, s.subnet_mask, - s.ntp_server, - CONCAT(LEFT(s.subnet_info, 50), IF(CHAR_LENGTH(s.subnet_info)>50,'...','')) AS subnet_info, - COUNT(node.subnet_id) AS node_counter - FROM subnet AS s LEFT JOIN node USING (subnet_id) - GROUP BY s.subnet_id - ORDER BY INET_ATON(s.subnet_address)"; + s.ntp_server, + CONCAT(LEFT(s.subnet_info, 50), IF(CHAR_LENGTH(s.subnet_info)>50,'...','')) AS subnet_info, + COUNT(node.subnet_id) AS node_counter + FROM subnet AS s LEFT JOIN node USING (subnet_id) + GROUP BY s.subnet_id + ORDER BY INET_ATON(s.subnet_address)"; $sth = $dbh->query($sql); $smarty->assign("subnets", $sth->fetchAll()); @@ -215,22 +215,15 @@ if(isset($_GET['page'])) { } // subnet -$sql = "SELECT - s.subnet_id AS id, - s.subnet_address AS address, - s.subnet_mask AS mask, - s.subnet_dhcp_start AS dhcp_start, - s.subnet_dhcp_end AS dhcp_end, - s.subnet_info AS info, - s.protocol_version AS proto_vers, +$sql = "SELECT s.subnet_id AS id, s.subnet_address AS address, s.subnet_mask AS mask, + s.subnet_dhcp_start AS dhcp_start, s.subnet_dhcp_end AS dhcp_end, + s.subnet_info AS info, s.protocol_version AS proto_vers, s.ntp_server, - COUNT(node.subnet_id) AS node_counter - FROM - subnet AS s LEFT JOIN node USING (subnet_id) - WHERE - s.subnet_id=? - GROUP BY - s.subnet_id"; + COUNT(n.subnet_id) AS node_counter + FROM subnet AS s LEFT JOIN node AS n USING (subnet_id) + WHERE s.subnet_id=? + AND ((n.node_flags IS NULL) OR (n.node_flags & 0x1 = 0)) + GROUP BY s.subnet_id"; $sth = $dbh->prepare($sql); $sth->execute([$id]); @@ -441,6 +434,7 @@ $sql = "SELECT LEFT JOIN assetclass AS c USING (assetclass_id) LEFT JOIN assetclassgroup AS g USING (assetclassgroup_id) WHERE n.subnet_id=:subnet_id + AND ((n.node_flags IS NULL) OR (n.node_flags & 0x1 = 0)) AND INET_ATON(n.node_ip) BETWEEN :ipfrom AND :ipto"; // Debug $smarty->assign("sql",array_key_first($subnetdata) . " - " . array_key_last($subnetdata) ); $sth = $dbh->prepare($sql); @@ -556,6 +550,7 @@ $sql = "SELECT assetclass_id AS id, assetclass_name AS name, LEFT JOIN assetclass USING (assetclass_id) LEFT JOIN assetclassgroup USING (assetclassgroup_id) WHERE subnet_id=? + AND ((node.node_flags IS NULL) OR (node.node_flags & 0x1 = 0)) GROUP BY assetclass_id ORDER BY assetclass_name"; $sth = $dbh->prepare($sql); diff --git a/tpl/assetview.tpl b/tpl/assetview.tpl index a599e89..dc6ce4f 100644 --- a/tpl/assetview.tpl +++ b/tpl/assetview.tpl @@ -106,8 +106,15 @@ {foreach item=node from=$nodes} - {if $node.node_ip}{$node.node_ip}{else}(leer){/if} - {if $node.node_info}{$node.node_info}{/if}
+ {if !$node.deleted} + {if $node.node_ip}{$node.node_ip}{else}(leer){/if} + {if $node.node_info}{$node.node_info}{/if}
+ {else} + {if $suser_admin or $suser_manage} + {if $node.node_ip}{$node.node_ip}{else}(leer){/if} + {if $node.node_info}{$node.node_info}{/if}
+ {/if} + {/if} {/foreach} diff --git a/tpl/node.tpl b/tpl/node.tpl index 4612dca..5e1bbac 100644 --- a/tpl/node.tpl +++ b/tpl/node.tpl @@ -30,9 +30,10 @@ {foreach item=node from=$nodes} + {if not $node.deleted or $suser_admin or $suser_manage} - {if $node.node_ip}{$node.node_ip}{else}(leer){/if} + {if $node.node_ip}{if $node.deleted}{$node.node_ip}{else}{$node.node_ip}{/if}{else}(leer){/if} {$node.node_info} @@ -47,9 +48,10 @@ {$node.asset_info} + {/if} {foreachelse} - + {$lang_node_none} diff --git a/tpl/nodeedit.tpl b/tpl/nodeedit.tpl index d212c50..58eceeb 100644 --- a/tpl/nodeedit.tpl +++ b/tpl/nodeedit.tpl @@ -63,6 +63,15 @@ + + + Flags + + + flags)} checked="checked"{/if}> {$lang_flag_deleted}
+ flags)} checked="checked"{/if}> {$lang_flag_reserved} + + diff --git a/tpl/nodeview.tpl b/tpl/nodeview.tpl index c7aa8f8..50fa2d2 100644 --- a/tpl/nodeview.tpl +++ b/tpl/nodeview.tpl @@ -29,7 +29,8 @@ {$lang_ip} diff --git a/tpl/useredit.tpl b/tpl/useredit.tpl index f11e167..5063764 100644 --- a/tpl/useredit.tpl +++ b/tpl/useredit.tpl @@ -73,6 +73,7 @@ role)} checked="checked"{/if} +{if $suser_admin} -{if $suser_admin}
- {$node->ip} + {if $node->deleted}{$node->ip}{else}{$node->ip}{/if} + {if $node->flags}({$node->flags}){/if}
{$lang_user_role_delete} @@ -82,7 +83,6 @@ role)} checked="checked"{/if}
{$lang_user_role_manage} diff --git a/user.php b/user.php index a4a3b0f..16c187c 100644 --- a/user.php +++ b/user.php @@ -61,13 +61,14 @@ switch ($submit = form_get_action()) { $role_manage = sanitize($_POST['role_manage']); $role_admin = sanitize($_POST['role_admin']); - // construct menu set + // construct role set $role = array(); if ($role_add) $role[] = 'add'; if ($role_edit) $role[] = 'edit'; if ($role_delete) $role[] = 'delete'; if ($role_manage) $role[] = 'manage'; if ($role_admin) $role[] = 'admin'; + $role = empty($role) ? NULL : implode(',', $role); $sql = "UPDATE user SET user_name=?, user_displayname=?, user_realm=?, @@ -75,7 +76,7 @@ switch ($submit = form_get_action()) { WHERE user_id=?"; $sth = $dbh->prepare($sql); $sth->execute([$user_name ,$user_displayname, $user_realm, - implode(',', $role), $id]); + $role, $id]); $action = ACT_VIEW; break;