Do not allow cascade deletion for rack devices as this table is optional to reference an asset and will cause issues when adding a devoce without a selected asset

This commit is contained in:
johnnyq 2025-03-14 15:33:00 -04:00
parent bf327afd19
commit 073f816dbd
4 changed files with 25 additions and 53 deletions

View File

@ -399,7 +399,7 @@ ob_start();
<?php if ($credential_count) { ?> <?php if ($credential_count) { ?>
<div class="tab-pane fade" id="pills-contact-credentials<?php echo $contact_id; ?>"> <div class="tab-pane fade" id="pills-contact-credentials<?php echo $contact_id; ?>">
<div class="table-responsive-sm"> <div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover table-sm"> <table class="table table-striped table-borderless table-hover table-sm dataTables" style="width:100%">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>Name</th>

View File

@ -2915,18 +2915,6 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) {
ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE
"); ");
// Clean up orphaned unit_asset_id rows in rack_units
mysqli_query($mysqli, "
DELETE FROM `rack_units`
WHERE `unit_asset_id` NOT IN (SELECT `asset_id` FROM `assets`);
");
// Add foreign key to rack_units
mysqli_query($mysqli, "
ALTER TABLE `rack_units`
ADD FOREIGN KEY (`unit_asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE
");
// Clean up orphaned service_id rows in service_assets // Clean up orphaned service_id rows in service_assets
mysqli_query($mysqli, " mysqli_query($mysqli, "
DELETE FROM `service_assets` DELETE FROM `service_assets`

6
db.sql
View File

@ -1351,9 +1351,7 @@ CREATE TABLE `rack_units` (
`unit_rack_id` int(11) NOT NULL, `unit_rack_id` int(11) NOT NULL,
PRIMARY KEY (`unit_id`), PRIMARY KEY (`unit_id`),
KEY `unit_rack_id` (`unit_rack_id`), KEY `unit_rack_id` (`unit_rack_id`),
KEY `unit_asset_id` (`unit_asset_id`), KEY `unit_asset_id` (`unit_asset_id`)
CONSTRAINT `rack_units_ibfk_1` FOREIGN KEY (`unit_rack_id`) REFERENCES `racks` (`rack_id`) ON DELETE CASCADE,
CONSTRAINT `rack_units_ibfk_2` FOREIGN KEY (`unit_asset_id`) REFERENCES `assets` (`asset_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
@ -2428,4 +2426,4 @@ CREATE TABLE `vendors` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-13 21:33:12 -- Dump completed on 2025-03-14 15:31:19

View File

@ -13,8 +13,7 @@ use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\Exception;
// Function to generate both crypto & URL safe random strings // Function to generate both crypto & URL safe random strings
function randomString($length = 16) function randomString($length = 16) {
{
// Generate some cryptographically safe random bytes // Generate some cryptographically safe random bytes
// Generate a little more than requested as we'll lose some later converting // Generate a little more than requested as we'll lose some later converting
$random_bytes = random_bytes($length + 5); $random_bytes = random_bytes($length + 5);
@ -31,8 +30,7 @@ function randomString($length = 16)
} }
// Older keygen function - only used for TOTP currently // Older keygen function - only used for TOTP currently
function key32gen() function key32gen() {
{
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$chars .= "234567"; $chars .= "234567";
while (1) { while (1) {
@ -46,25 +44,23 @@ function key32gen()
return $key; return $key;
} }
function nullable_htmlentities($unsanitizedInput) function nullable_htmlentities($unsanitizedInput) {
{
//return htmlentities($unsanitizedInput ?? ''); //return htmlentities($unsanitizedInput ?? '');
return htmlspecialchars($unsanitizedInput ?? '', ENT_QUOTES, 'UTF-8'); return htmlspecialchars($unsanitizedInput ?? '', ENT_QUOTES, 'UTF-8');
} }
function initials($str) function initials($string) {
{ if (!empty($string)) {
if (!empty($str)) { $return = '';
$ret = ''; foreach (explode(' ', $string) as $word) {
foreach (explode(' ', $str) as $word) $return .= mb_strtoupper($word[0], 'UTF-8'); // Use mb_strtoupper for UTF-8 support
$ret .= strtoupper($word[0]); }
$ret = substr($ret, 0, 2); $return = substr($return, 0, 2);
return $ret; return $return;
} }
} }
function removeDirectory($path) function removeDirectory($path) {
{
if (!file_exists($path)) { if (!file_exists($path)) {
return; return;
} }
@ -76,13 +72,11 @@ function removeDirectory($path)
rmdir($path); rmdir($path);
} }
function getUserAgent() function getUserAgent() {
{
return $_SERVER['HTTP_USER_AGENT']; return $_SERVER['HTTP_USER_AGENT'];
} }
function getIP() function getIP() {
{
if (defined("CONST_GET_IP_METHOD")) { if (defined("CONST_GET_IP_METHOD")) {
if (CONST_GET_IP_METHOD == "HTTP_X_FORWARDED_FOR") { if (CONST_GET_IP_METHOD == "HTTP_X_FORWARDED_FOR") {
$ip = getenv('HTTP_X_FORWARDED_FOR'); $ip = getenv('HTTP_X_FORWARDED_FOR');
@ -100,8 +94,7 @@ function getIP()
return $ip; return $ip;
} }
function getWebBrowser($user_browser) function getWebBrowser($user_browser) {
{
$browser = "-"; $browser = "-";
$browser_array = array( $browser_array = array(
'/msie/i' => "<i class='fab fa-fw fa-internet-explorer text-secondary'></i> Internet Explorer", '/msie/i' => "<i class='fab fa-fw fa-internet-explorer text-secondary'></i> Internet Explorer",
@ -120,8 +113,7 @@ function getWebBrowser($user_browser)
return $browser; return $browser;
} }
function getOS($user_os) function getOS($user_os) {
{
$os_platform = "-"; $os_platform = "-";
$os_array = array( $os_array = array(
'/windows/i' => "<i class='fab fa-fw fa-windows text-secondary'></i> Windows", '/windows/i' => "<i class='fab fa-fw fa-windows text-secondary'></i> Windows",
@ -141,8 +133,7 @@ function getOS($user_os)
return $os_platform; return $os_platform;
} }
function getDevice() function getDevice() {
{
$tablet_browser = 0; $tablet_browser = 0;
$mobile_browser = 0; $mobile_browser = 0;
if (preg_match('/(tablet|ipad|playbook)|(android(?!.*(mobi|opera mini)))/i', strtolower($_SERVER['HTTP_USER_AGENT']))) { if (preg_match('/(tablet|ipad|playbook)|(android(?!.*(mobi|opera mini)))/i', strtolower($_SERVER['HTTP_USER_AGENT']))) {
@ -189,8 +180,7 @@ function getDevice()
} }
} }
function truncate($text, $chars) function truncate($text, $chars) {
{
if (strlen($text) <= $chars) { if (strlen($text) <= $chars) {
return $text; return $text;
} }
@ -203,8 +193,7 @@ function truncate($text, $chars)
return $text . "..."; return $text . "...";
} }
function formatPhoneNumber($phoneNumber) function formatPhoneNumber($phoneNumber) {
{
global $mysqli; global $mysqli;
// Get Phone Mask Option // Get Phone Mask Option
@ -240,8 +229,7 @@ function formatPhoneNumber($phoneNumber)
return $phoneNumber; return $phoneNumber;
} }
function mkdirMissing($dir) function mkdirMissing($dir) {
{
if (!is_dir($dir)) { if (!is_dir($dir)) {
mkdir($dir); mkdir($dir);
} }
@ -249,8 +237,7 @@ function mkdirMissing($dir)
// Called during initial setup // Called during initial setup
// Encrypts the master key with the user's password // Encrypts the master key with the user's password
function setupFirstUserSpecificKey($user_password, $site_encryption_master_key) function setupFirstUserSpecificKey($user_password, $site_encryption_master_key) {
{
$iv = randomString(); $iv = randomString();
$salt = randomString(); $salt = randomString();
@ -268,8 +255,7 @@ function setupFirstUserSpecificKey($user_password, $site_encryption_master_key)
* New Users: Requires the admin setting up their account have a Specific/Session key configured * New Users: Requires the admin setting up their account have a Specific/Session key configured
* Password Changes: Will use the current info in the session. * Password Changes: Will use the current info in the session.
*/ */
function encryptUserSpecificKey($user_password) function encryptUserSpecificKey($user_password) {
{
$iv = randomString(); $iv = randomString();
$salt = randomString(); $salt = randomString();