From ac2b355399854980b97b42154930a17ab74b7c5f Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sat, 1 Mar 2025 21:21:03 -0500 Subject: [PATCH 01/18] updated Changelog and bumped app version to 25.02.2 --- CHANGELOG.md | 4 ++++ includes/app_version.php | 2 +- post/user/credential.php | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c723cb0e..8ab066ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ This file documents all notable changes made to ITFlow. +## [25.02.2] +### Fixed +- Fix broken create / edit credentials + ## [25.02.1] ### Fixed - Resolved broken links in the client overview, project and client listings, and rack details. diff --git a/includes/app_version.php b/includes/app_version.php index 9d4a8fb8..3675c435 100644 --- a/includes/app_version.php +++ b/includes/app_version.php @@ -5,4 +5,4 @@ * Update this file each time we merge develop into master. Format is YY.MM (add a .v if there is more than one release a month. */ -DEFINE("APP_VERSION", "25.02.1"); +DEFINE("APP_VERSION", "25.02.2"); diff --git a/post/user/credential.php b/post/user/credential.php index 18d6c6ea..ac6f899c 100644 --- a/post/user/credential.php +++ b/post/user/credential.php @@ -12,7 +12,7 @@ if (isset($_POST['add_login'])) { require_once 'post/user/credential_model.php'; - mysqli_query($mysqli,"INSERT INTO logins SET login_name = '$name', login_description = '$description', login_uri = '$uri', login_uri_2 = '$uri_2', login_username = '$username', login_password = '$password', login_otp_secret = '$otp_secret', login_note = '$note', login_important = $important, login_contact_id = $contact_id, login_vendor_id = $vendor_id, login_asset_id = $asset_id, login_software_id = $software_id, login_client_id = $client_id"); + mysqli_query($mysqli,"INSERT INTO logins SET login_name = '$name', login_description = '$description', login_uri = '$uri', login_uri_2 = '$uri_2', login_username = '$username', login_password = '$password', login_otp_secret = '$otp_secret', login_note = '$note', login_important = $important, login_contact_id = $contact_id, login_asset_id = $asset_id, login_client_id = $client_id"); $login_id = mysqli_insert_id($mysqli); @@ -50,7 +50,7 @@ if (isset($_POST['edit_login'])) { } // Update the login entry with the new details - mysqli_query($mysqli,"UPDATE logins SET login_name = '$name', login_description = '$description', login_uri = '$uri', login_uri_2 = '$uri_2', login_username = '$username', login_password = '$password', login_otp_secret = '$otp_secret', login_note = '$note', login_important = $important, login_contact_id = $contact_id, login_vendor_id = $vendor_id, login_asset_id = $asset_id, login_software_id = $software_id WHERE login_id = $login_id"); + mysqli_query($mysqli,"UPDATE logins SET login_name = '$name', login_description = '$description', login_uri = '$uri', login_uri_2 = '$uri_2', login_username = '$username', login_password = '$password', login_otp_secret = '$otp_secret', login_note = '$note', login_important = $important, login_contact_id = $contact_id, login_asset_id = $asset_id WHERE login_id = $login_id"); // Tags // Delete existing tags From bece8abfe2d7b99acb0edaba94fdc9c3b9f65372 Mon Sep 17 00:00:00 2001 From: Marcus Hill Date: Sun, 2 Mar 2025 09:26:16 +0000 Subject: [PATCH 02/18] Prune db updates older than a year --- database_updates.php | 139 +++++-------------------------------------- 1 file changed, 14 insertions(+), 125 deletions(-) diff --git a/database_updates.php b/database_updates.php index 6a74d7a0..7883601f 100644 --- a/database_updates.php +++ b/database_updates.php @@ -17,117 +17,6 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { // We need updates! - if (CURRENT_DATABASE_VERSION == '0.1.0') { - // Insert queries here required to update to DB version 0.1.1 - // Logs don't get archived - mysqli_query($mysqli, "ALTER TABLE `logs` DROP `log_archived_at`"); - - // Assets will eventualy have file associatons which could include a receipt. - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_reciept`"); - - mysqli_query($mysqli, "ALTER TABLE `campaign_messages` DROP `message_updated_at`"); - // This will be a seperate table eventually called contact_documents because contact can have several documents - mysqli_query($mysqli, "ALTER TABLE `documents` DROP `document_contact_id`"); - - mysqli_query($mysqli, "ALTER TABLE `expenses` DROP `expense_asset_id`"); - mysqli_query($mysqli, "ALTER TABLE `files` DROP `file_contact_id`"); - mysqli_query($mysqli, "ALTER TABLE `history` DROP `history_archived_at`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.1') { - // Insert queries here required to update to DB version 0.1.2 - // Create Many to Many Relationship tables for Assets, Contacts, Software and Vendors - - mysqli_query($mysqli, "CREATE TABLE `asset_documents` (`asset_id` int(11) NOT NULL,`document_id` int(11) NOT NULL, PRIMARY KEY (`asset_id`,`document_id`))"); - mysqli_query($mysqli, "CREATE TABLE `asset_logins` (`asset_id` int(11) NOT NULL,`login_id` int(11) NOT NULL, PRIMARY KEY (`asset_id`,`login_id`))"); - mysqli_query($mysqli, "CREATE TABLE `asset_files` (`asset_id` int(11) NOT NULL,`file_id` int(11) NOT NULL, PRIMARY KEY (`asset_id`,`file_id`))"); - - mysqli_query($mysqli, "CREATE TABLE `contact_documents` (`contact_id` int(11) NOT NULL,`document_id` int(11) NOT NULL, PRIMARY KEY (`contact_id`,`document_id`))"); - mysqli_query($mysqli, "CREATE TABLE `contact_logins` (`contact_id` int(11) NOT NULL,`login_id` int(11) NOT NULL, PRIMARY KEY (`contact_id`,`login_id`))"); - mysqli_query($mysqli, "CREATE TABLE `contact_files` (`contact_id` int(11) NOT NULL,`file_id` int(11) NOT NULL, PRIMARY KEY (`contact_id`,`file_id`))"); - - mysqli_query($mysqli, "CREATE TABLE `software_documents` (`software_id` int(11) NOT NULL,`document_id` int(11) NOT NULL, PRIMARY KEY (`software_id`,`document_id`))"); - mysqli_query($mysqli, "CREATE TABLE `software_logins` (`software_id` int(11) NOT NULL,`login_id` int(11) NOT NULL, PRIMARY KEY (`software_id`,`login_id`))"); - mysqli_query($mysqli, "CREATE TABLE `software_files` (`software_id` int(11) NOT NULL,`file_id` int(11) NOT NULL, PRIMARY KEY (`software_id`,`file_id`))"); - - mysqli_query($mysqli, "CREATE TABLE `vendor_documents` (`vendor_id` int(11) NOT NULL,`document_id` int(11) NOT NULL, PRIMARY KEY (`vendor_id`,`document_id`))"); - mysqli_query($mysqli, "CREATE TABLE `vendor_logins` (`vendor_id` int(11) NOT NULL,`login_id` int(11) NOT NULL, PRIMARY KEY (`vendor_id`,`login_id`))"); - mysqli_query($mysqli, "CREATE TABLE `vendor_files` (`vendor_id` int(11) NOT NULL,`file_id` int(11) NOT NULL, PRIMARY KEY (`vendor_id`,`file_id`))"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.2') { - // Insert queries here required to update to DB version 0.1.3 - mysqli_query($mysqli, "ALTER TABLE `logs` ADD `log_entity_id` INT NOT NULL DEFAULT '0' AFTER `log_user_id`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.3') { - // Insert queries here required to update to DB version 0.1.4 - mysqli_query($mysqli, "ALTER TABLE assets ADD asset_status VARCHAR(200) NULL AFTER asset_mac"); - - ///Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.4'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.4') { - // Insert queries here required to update to DB version 0.1.5 - mysqli_query($mysqli, "ALTER TABLE `domains` ADD `domain_txt` TEXT NULL DEFAULT NULL AFTER `domain_mail_servers`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.5') { - // Insert queries here required to update to DB version 0.1.6 - // Remove Mailing List Tables - mysqli_query($mysqli, "DROP TABLE campaigns"); - mysqli_query($mysqli, "DROP TABLE campaign_messages"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.6') { - // Insert queries here required to update to DB version 0.1.7 - //Remove custom links - mysqli_query($mysqli, "DROP TABLE custom_links"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.7') { - // Insert queries here required to update to DB version 0.1.8 - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_backup_enable`"); - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_backup_path`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.8') { - // Insert queries here required to update to DB version 0.1.9 - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_base_url`"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.1.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.1.9') { - // Insert queries here required to update to DB version 0.2.0 - // Allow contacts to reset their portal password - mysqli_query($mysqli, "ALTER TABLE contacts ADD contact_password_reset_token VARCHAR(200) NULL DEFAULT NULL AFTER contact_password_hash"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.0'"); - } - if (CURRENT_DATABASE_VERSION == '0.2.0') { //Insert queries here required to update to DB version 0.2.1 @@ -2239,7 +2128,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.6.6') { - + mysqli_query($mysqli, "CREATE TABLE `contact_notes` ( `contact_note_id` INT(11) NOT NULL AUTO_INCREMENT, `contact_note_type` VARCHAR(200) NOT NULL, @@ -2280,7 +2169,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.6.7') { - + mysqli_query($mysqli, "CREATE TABLE `error_logs` ( `error_log_id` INT(11) NOT NULL AUTO_INCREMENT, `error_log_type` VARCHAR(200) NOT NULL, @@ -2304,7 +2193,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.6.8') { - + // Create New Vendor Templates Table this eventual be used to seperate templates out of the vendors table mysqli_query($mysqli, "CREATE TABLE `vendor_templates` (`vendor_template_id` int(11) AUTO_INCREMENT PRIMARY KEY, `vendor_template_name` varchar(200) NOT NULL, @@ -2322,7 +2211,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.6.9') { - + mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_has_thumbnail` TINYINT(1) NOT NULL DEFAULT 0 AFTER `file_mime_type`"); mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_has_preview` TINYINT(1) NOT NULL DEFAULT 0 AFTER `file_has_thumbnail`"); @@ -2330,7 +2219,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.7.0') { - + mysqli_query($mysqli, "DROP TABLE `vendor_templates`"); mysqli_query($mysqli, "CREATE TABLE `vendor_contacts` ( @@ -2348,12 +2237,12 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { `vendor_contact_archived_at` DATETIME DEFAULT NULL, `vendor_contact_vendor_id` INT(11) NOT NULL DEFAULT 0 )"); - + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.1'"); } if (CURRENT_DATABASE_VERSION == '1.7.1') { - + mysqli_query($mysqli, "DROP TABLE `error_logs`"); mysqli_query($mysqli, "CREATE TABLE `app_logs` ( @@ -2364,7 +2253,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { `app_log_created_at` DATETIME NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (`app_log_id`) )"); - + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.2'"); } @@ -2377,7 +2266,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.7.3') { - + // Add Recurring Payments mysqli_query($mysqli, "CREATE TABLE `recurring_payments` ( `recurring_payment_id` INT(11) NOT NULL AUTO_INCREMENT, @@ -2397,7 +2286,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.7.4') { - + // Remove Recurring Payment Amount as it will use the Recurring Invoice Amount and is unessessary mysqli_query($mysqli, "ALTER TABLE `recurring_payments` DROP `recurring_payment_amount`"); @@ -2463,14 +2352,14 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '1.7.9') { - + mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_cron_key`"); mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.0'"); } if (CURRENT_DATABASE_VERSION == '1.8.0') { - + mysqli_query($mysqli, "ALTER TABLE `ticket_statuses` ADD `ticket_status_order` int(11) NOT NULL DEFAULT 0"); mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_order` int(11) NOT NULL DEFAULT 0"); @@ -2481,12 +2370,12 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.1'"); } - + if (CURRENT_DATABASE_VERSION == '1.8.1') { mysqli_query($mysqli, "ALTER TABLE `asset_interfaces` CHANGE `interface_port` `interface_description` VARCHAR(200) DEFAULT NULL AFTER `interface_name`"); mysqli_query($mysqli, "ALTER TABLE `asset_interfaces` ADD `interface_type` VARCHAR(50) DEFAULT NULL AFTER `interface_description`"); - + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.2'"); } From 2908568e2aeb4e020b854873af926e0a42f66472 Mon Sep 17 00:00:00 2001 From: Marcus Hill Date: Sun, 2 Mar 2025 09:40:21 +0000 Subject: [PATCH 03/18] Fix certificates not showing notes --- ajax/ajax_certificate_edit.php | 41 +++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/ajax/ajax_certificate_edit.php b/ajax/ajax_certificate_edit.php index 157675ec..3a9789b3 100644 --- a/ajax/ajax_certificate_edit.php +++ b/ajax/ajax_certificate_edit.php @@ -5,7 +5,7 @@ require_once '../includes/ajax_header.php'; $certificate_id = intval($_GET['id']); $sql = mysqli_query($mysqli, "SELECT * FROM certificates WHERE certificate_id = $certificate_id LIMIT 1"); - + $row = mysqli_fetch_array($sql); $certificate_name = nullable_htmlentities($row['certificate_name']); $certificate_description = nullable_htmlentities($row['certificate_description']); @@ -13,10 +13,13 @@ $certificate_domain = nullable_htmlentities($row['certificate_domain']); $certificate_domain_id = intval($row['certificate_domain_id']); $certificate_issued_by = nullable_htmlentities($row['certificate_issued_by']); $certificate_public_key = nullable_htmlentities($row['certificate_public_key']); +$certificate_notes = nullable_htmlentities($row['certificate_notes']); $certificate_expire = nullable_htmlentities($row['certificate_expire']); $certificate_created_at = nullable_htmlentities($row['certificate_created_at']); $client_id = intval($row['certificate_client_id']); +$history_sql = mysqli_query($mysqli, "SELECT * FROM certificate_history WHERE certificate_history_certificate_id = $certificate_id"); + // Generate the HTML form content using output buffering. ob_start(); ?> @@ -42,6 +45,9 @@ ob_start(); +
@@ -78,7 +84,7 @@ ob_start(); + +
+
+ + + + + + + + + + + + + + + + + + + +
DateFieldBeforeAfter
+
From 0ab9a1c97df721fe15a2221ee9c2e20857cbf28f Mon Sep 17 00:00:00 2001 From: Marcus Hill Date: Sun, 2 Mar 2025 09:50:50 +0000 Subject: [PATCH 04/18] Temp fix warnings on num_domains expiring / num_domains_expired vars not defined yet --- includes/client_side_nav.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/client_side_nav.php b/includes/client_side_nav.php index 6610214c..134d9cb3 100644 --- a/includes/client_side_nav.php +++ b/includes/client_side_nav.php @@ -202,7 +202,7 @@ 0) { ?> - +

From ae59aa3326424d42187e98cf5da4c1aec280cb3d Mon Sep 17 00:00:00 2001 From: Marcus Hill Date: Sun, 2 Mar 2025 10:12:47 +0000 Subject: [PATCH 05/18] Add SSL certificate history tracking --- database_updates.php | 20 +++++++++++--- db.sql | 18 +++++++++++++ includes/database_version.php | 2 +- post/user/certificate.php | 35 ++++++++++++++++++++++++- scripts/cron_certificate_refresher.php | 36 +++++++++++++++++++++++++- 5 files changed, 105 insertions(+), 6 deletions(-) diff --git a/database_updates.php b/database_updates.php index 7883601f..fe623e24 100644 --- a/database_updates.php +++ b/database_updates.php @@ -2409,10 +2409,24 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.6'"); } - // if (CURRENT_DATABASE_VERSION == '1.8.6') { - // // Insert queries here required to update to DB version 1.8.7 + if (CURRENT_DATABASE_VERSION == '1.8.6') { + mysqli_query($mysqli, " + CREATE TABLE `certificate_history` (`certificate_history_id` INT(11) NOT NULL AUTO_INCREMENT, + `certificate_history_column` VARCHAR(200) NOT NULL, + `certificate_history_old_value` TEXT NOT NULL, + `certificate_history_new_value` TEXT NOT NULL, + `certificate_history_certificate_id` INT(11) NOT NULL, + `certificate_history_modified_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`certificate_history_id`)) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci; + "); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.7'"); + } + + // if (CURRENT_DATABASE_VERSION == '1.8.8') { + // // Insert queries here required to update to DB version 1.8.8 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.7'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.8'"); // } } else { diff --git a/db.sql b/db.sql index 3431294a..a757b2a2 100644 --- a/db.sql +++ b/db.sql @@ -321,6 +321,24 @@ CREATE TABLE `categories` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `certificate_history` +-- + +DROP TABLE IF EXISTS `certificate_history`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `certificate_history` ( + `certificate_history_id` int(11) NOT NULL AUTO_INCREMENT, + `certificate_history_column` varchar(200) NOT NULL, + `certificate_history_old_value` text NOT NULL, + `certificate_history_new_value` text NOT NULL, + `certificate_history_certificate_id` int(11) NOT NULL, + `certificate_history_modified_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`certificate_history_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `certificates` -- diff --git a/includes/database_version.php b/includes/database_version.php index dfc04fee..17de9b8e 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.8.6"); +DEFINE("LATEST_DATABASE_VERSION", "1.8.7"); diff --git a/post/user/certificate.php b/post/user/certificate.php index 2fe0a469..f2960904 100644 --- a/post/user/certificate.php +++ b/post/user/certificate.php @@ -64,8 +64,41 @@ if (isset($_POST['edit_certificate'])) { $expire = "'" . $expire . "'"; } + // Get current certificate info + $original_certificate_info = mysqli_fetch_assoc(mysqli_query($mysqli," + SELECT + certificates.*, + domains.domain_name + FROM certificates + LEFT JOIN domains ON certificate_domain_id = domain_id + WHERE certificate_id = $certificate_id + ")); + + // Update certificate mysqli_query($mysqli,"UPDATE certificates SET certificate_name = '$name', certificate_description = '$description', certificate_domain = '$domain', certificate_issued_by = '$issued_by', certificate_expire = $expire, certificate_public_key = '$public_key', certificate_notes = '$notes', certificate_domain_id = '$domain_id' WHERE certificate_id = $certificate_id"); + // Fetch the updated info + $new_certificate_info = mysqli_fetch_assoc(mysqli_query($mysqli," + SELECT + certificates.*, + domains.domain_name + FROM certificates + LEFT JOIN domains ON certificate_domain_id = domain_id + WHERE certificate_id = $certificate_id + ")); + + // Compare/log changes between old/new info + $ignored_columns = ["certificate_public_key", "certificate_updated_at", "certificate_accessed_at", "certificate_domain_id"]; + foreach ($original_certificate_info as $column => $old_value) { + $new_value = $new_certificate_info[$column]; + if ($old_value != $new_value && !in_array($column, $ignored_columns)) { + $column = sanitizeInput($column); + $old_value = sanitizeInput($old_value); + $new_value = sanitizeInput($new_value); + mysqli_query($mysqli,"INSERT INTO certificate_history SET certificate_history_column = '$column', certificate_history_old_value = '$old_value', certificate_history_new_value = '$new_value', certificate_history_certificate_id = $certificate_id"); + } + } + // Logging logAction("Certificate", "Edit", "$session_name edited certificate $name", $client_id, $certificate_id); @@ -144,7 +177,7 @@ if (isset($_POST['bulk_delete_certificates'])) { $client_id = intval($row['certificate_client_id']); mysqli_query($mysqli, "DELETE FROM certificates WHERE certificate_id = $certificate_id AND certificate_client_id = $client_id"); - + // Logging logAction("Certificate", "Delete", "$session_name deleted certificate $certificate_name", $client_id); diff --git a/scripts/cron_certificate_refresher.php b/scripts/cron_certificate_refresher.php index 865b0a3a..9cb2feb6 100644 --- a/scripts/cron_certificate_refresher.php +++ b/scripts/cron_certificate_refresher.php @@ -45,7 +45,7 @@ $sql_certificates = mysqli_query( while ($row = mysqli_fetch_array($sql_certificates)) { $certificate_id = intval($row['certificate_id']); $domain = sanitizeInput($row['certificate_domain']); - + $certificate = getSSL($domain); $expire = sanitizeInput($certificate['expire']); @@ -60,8 +60,42 @@ while ($row = mysqli_fetch_array($sql_certificates)) { echo "$public_key\n\n"; $expire = "'" . $expire . "'"; + + // Get current certificate info + $original_certificate_info = mysqli_fetch_assoc(mysqli_query($mysqli," + SELECT + certificates.*, + domains.domain_name + FROM certificates + LEFT JOIN domains ON certificate_domain_id = domain_id + WHERE certificate_id = $certificate_id + ")); + + // Update mysqli_query($mysqli,"UPDATE certificates SET certificate_issued_by = '$issued_by', certificate_expire = $expire, certificate_public_key = '$public_key' WHERE certificate_id = $certificate_id"); + // Fetch the updated info + $new_certificate_info = mysqli_fetch_assoc(mysqli_query($mysqli," + SELECT + certificates.*, + domains.domain_name + FROM certificates + LEFT JOIN domains ON certificate_domain_id = domain_id + WHERE certificate_id = $certificate_id + ")); + + // Compare/log changes between old/new info + $ignored_columns = ["certificate_public_key", "certificate_updated_at", "certificate_accessed_at", "certificate_domain_id"]; + foreach ($original_certificate_info as $column => $old_value) { + $new_value = $new_certificate_info[$column]; + if ($old_value != $new_value && !in_array($column, $ignored_columns)) { + $column = sanitizeInput($column); + $old_value = sanitizeInput($old_value); + $new_value = sanitizeInput($new_value); + mysqli_query($mysqli,"INSERT INTO certificate_history SET certificate_history_column = '$column', certificate_history_old_value = '$old_value', certificate_history_new_value = '$new_value', certificate_history_certificate_id = $certificate_id"); + } + } + } else { logApp("Cron-Certificate-Refresher", "error", "Cron Certificate Refresh - error updating Error updating $domain."); error_log("Certificate Cron Error - Error updating $domain"); From 7994c9c7a8774f8c71d1dfedf67e687d0bb053fc Mon Sep 17 00:00:00 2001 From: Marcus Hill Date: Sun, 2 Mar 2025 10:15:26 +0000 Subject: [PATCH 06/18] Add SSL certificate history tracking --- database_updates.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database_updates.php b/database_updates.php index fe623e24..50ea60ce 100644 --- a/database_updates.php +++ b/database_updates.php @@ -2423,7 +2423,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.7'"); } - // if (CURRENT_DATABASE_VERSION == '1.8.8') { + // if (CURRENT_DATABASE_VERSION == '1.8.7') { // // Insert queries here required to update to DB version 1.8.8 // // Then, update the database to the next sequential version // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.8'"); From 6106b8aebb75f6d7d7797f81ae97e6a44707bad1 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 2 Mar 2025 21:03:02 -0500 Subject: [PATCH 07/18] Fix broken client link for the report clients with a balance --- report_clients_with_balance.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report_clients_with_balance.php b/report_clients_with_balance.php index f9fc7bad..40f15ce7 100644 --- a/report_clients_with_balance.php +++ b/report_clients_with_balance.php @@ -66,7 +66,7 @@ enforceUserPermission('module_financial'); ?> - + Date: Mon, 3 Mar 2025 00:07:22 -0500 Subject: [PATCH 08/18] Don't count Non-Billable Invoices in overdue count --- invoices.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invoices.php b/invoices.php index aaf133bb..8eadd522 100644 --- a/invoices.php +++ b/invoices.php @@ -33,7 +33,7 @@ $draft_count = $row['num']; $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status = 'Cancelled' $client_query")); $cancelled_count = $row['num']; -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status NOT LIKE 'Draft' AND invoice_status NOT LIKE 'Paid' AND invoice_status NOT LIKE 'Cancelled' AND invoice_due < CURDATE() $client_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status NOT LIKE 'Draft' AND invoice_status NOT LIKE 'Paid' AND invoice_status NOT LIKE 'Cancelled' AND invoice_status NOT LIKE 'Non-Billable' AND invoice_due < CURDATE() $client_query")); $overdue_count = $row['num']; $sql_total_draft_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_draft_amount FROM invoices WHERE invoice_status = 'Draft' $client_query"); From 580f50b187532562a6c1ac21dfceb6f47c577bd7 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 3 Mar 2025 00:22:51 -0500 Subject: [PATCH 09/18] Added Link button to WYSIWYG Document Creation and editing --- js/app.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/js/app.js b/js/app.js index 6e6527da..c751288c 100644 --- a/js/app.js +++ b/js/app.js @@ -28,6 +28,7 @@ tinymce.init({ toolbar: [ { name: 'styles', items: [ 'styles' ] }, { name: 'formatting', items: [ 'bold', 'italic', 'forecolor' ] }, + { name: 'link', items: [ 'link'] }, { name: 'lists', items: [ 'bullist', 'numlist' ] }, { name: 'alignment', items: [ 'alignleft', 'aligncenter', 'alignright', 'alignjustify' ] }, { name: 'indentation', items: [ 'outdent', 'indent' ] }, @@ -59,6 +60,7 @@ tinymce.init({ toolbar: [ { name: 'styles', items: [ 'styles' ] }, { name: 'formatting', items: [ 'bold', 'italic', 'forecolor' ] }, + { name: 'link', items: [ 'link'] }, { name: 'lists', items: [ 'bullist', 'numlist' ] }, { name: 'alignment', items: [ 'alignleft', 'aligncenter', 'alignright', 'alignjustify' ] }, { name: 'indentation', items: [ 'outdent', 'indent' ] }, @@ -275,20 +277,6 @@ tinymce.init({ } }); -// Initialize TinyMCE -tinymce.init({ - selector: '.tinymcePreview', - resize: false, - promotion: false, - branding: false, - menubar: false, - toolbar: false, - statusbar: false, - readonly: false, - plugins: 'autoresize', - license_key: 'gpl', -}); - // DateTime $('.datetimepicker').datetimepicker({ }); From 546d21adac7a6023c12ac469f7e431e7d5375c4a Mon Sep 17 00:00:00 2001 From: wrongecho Date: Mon, 3 Mar 2025 09:03:49 +0000 Subject: [PATCH 10/18] Fix client notes on edit modal --- ajax/ajax_client_edit.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ajax/ajax_client_edit.php b/ajax/ajax_client_edit.php index e67b8bee..77439c4e 100644 --- a/ajax/ajax_client_edit.php +++ b/ajax/ajax_client_edit.php @@ -251,9 +251,7 @@ ob_start();
- +
From 8488445bf4be2928151d61509a4e0e9584c6dda8 Mon Sep 17 00:00:00 2001 From: wrongecho Date: Mon, 3 Mar 2025 09:06:07 +0000 Subject: [PATCH 11/18] Start March changelog --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ab066ed..070186cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,16 @@ This file documents all notable changes made to ITFlow. +## [25.03] +### Fixed +- Corrected some edit modals not showing notes correctly. + +### Added / Changed +- Implemented SSL certificate history tracking. + ## [25.02.2] ### Fixed -- Fix broken create / edit credentials +- Fix broken create / edit credentials. ## [25.02.1] ### Fixed From 8da3bb15e9e6ec65950c025b95b8c2bef7c746c7 Mon Sep 17 00:00:00 2001 From: wrongecho Date: Mon, 3 Mar 2025 09:29:28 +0000 Subject: [PATCH 12/18] Add physical location field to asset csv import/export --- modals/asset_import_modal.php | 2 +- post/user/asset.php | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modals/asset_import_modal.php b/modals/asset_import_modal.php index 512958e9..25dc0deb 100644 --- a/modals/asset_import_modal.php +++ b/modals/asset_import_modal.php @@ -14,7 +14,7 @@