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();
Notes
+
+ History
+
@@ -78,7 +84,7 @@ ob_start();
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 @@
-
Format csv file with headings & data:
Name, Description, Type, Make, Model, Serial, OS, Assigned To, Location
+
Format csv file with headings & data:
Name, Description, Type, Make, Model, Serial, OS, Assigned To, Location, Physical Location
diff --git a/post/user/asset.php b/post/user/asset.php
index 7208108f..6d184f0d 100644
--- a/post/user/asset.php
+++ b/post/user/asset.php
@@ -740,7 +740,6 @@ if (isset($_GET['unlink_asset_from_file'])) {
if (isset($_POST["import_assets_csv"])) {
enforceUserPermission('module_support', 2);
-
validateCSRFToken($_POST['csrf_token']);
$client_id = intval($_POST['client_id']);
@@ -774,9 +773,9 @@ if (isset($_POST["import_assets_csv"])) {
//(Else)Check column count (name, desc, type, make, model, serial, os, assigned to, location)
$f = fopen($file_name, "r");
$f_columns = fgetcsv($f, 1000, ",");
- if (!$error & count($f_columns) != 9) {
+ if (!$error & count($f_columns) != 10) {
$error = true;
- $_SESSION['alert_message'] = "Bad column count.";
+ $_SESSION['alert_message'] = "Invalid column count.";
}
//Else, parse the file
@@ -832,11 +831,14 @@ if (isset($_POST["import_assets_csv"])) {
$location_id = intval($row['location_id']);
}
}
+ if (!empty($column[9])) {
+ $physical_location = sanitizeInput($column[9]);
+ }
// Check if duplicate was detected
if ($duplicate_detect == 0) {
//Add
- mysqli_query($mysqli,"INSERT INTO assets SET asset_name = '$name', asset_description = '$description', asset_type = '$type', asset_make = '$make', asset_model = '$model', asset_serial = '$serial', asset_os = '$os', asset_contact_id = $contact_id, asset_location_id = $location_id, asset_client_id = $client_id");
+ mysqli_query($mysqli,"INSERT INTO assets SET asset_name = '$name', asset_description = '$description', asset_type = '$type', asset_make = '$make', asset_model = '$model', asset_serial = '$serial', asset_os = '$os', asset_physical_location = '$physical_location', asset_contact_id = $contact_id, asset_location_id = $location_id, asset_client_id = $client_id");
$asset_id = mysqli_insert_id($mysqli);
@@ -864,7 +866,7 @@ if (isset($_POST["import_assets_csv"])) {
}
if (isset($_GET['download_assets_csv_template'])) {
- $client_id = intval($_GET['download_client_assets_csv_template']);
+ $client_id = intval($_GET['download_assets_csv_template']);
//get records from database
$sql = mysqli_query($mysqli,"SELECT client_name FROM clients WHERE client_id = $client_id");
@@ -879,7 +881,7 @@ if (isset($_GET['download_assets_csv_template'])) {
$f = fopen('php://memory', 'w');
//set column headers
- $fields = array('Name', 'Description', 'Type', 'Make', 'Model', 'Serial', 'OS', 'Assigned To', 'Location');
+ $fields = array('Name', 'Description', 'Type', 'Make', 'Model', 'Serial', 'OS', 'Assigned To', 'Location', 'Physical Location');
fputcsv($f, $fields, $delimiter);
//move back to beginning of file
@@ -924,12 +926,12 @@ if (isset($_POST['export_assets_csv'])) {
$f = fopen('php://memory', 'w');
//set column headers
- $fields = array('Name', 'Description', 'Type', 'Make', 'Model', 'Serial Number', 'Operating System', 'Purchase Date', 'Warranty Expire', 'Install Date', 'Assigned To', 'Location', 'Notes');
+ $fields = array('Name', 'Description', 'Type', 'Make', 'Model', 'Serial Number', 'Operating System', 'Purchase Date', 'Warranty Expire', 'Install Date', 'Assigned To', 'Location', 'Physical Location', 'Notes');
fputcsv($f, $fields, $delimiter);
//output each row of the data, format line as csv and write to file pointer
while($row = mysqli_fetch_array($sql)) {
- $lineData = array($row['asset_name'], $row['asset_description'], $row['asset_type'], $row['asset_make'], $row['asset_model'], $row['asset_serial'], $row['asset_os'], $row['asset_purchase_date'], $row['asset_warranty_expire'], $row['asset_install_date'], $row['contact_name'], $row['location_name'], $row['asset_notes']);
+ $lineData = array($row['asset_name'], $row['asset_description'], $row['asset_type'], $row['asset_make'], $row['asset_model'], $row['asset_serial'], $row['asset_os'], $row['asset_purchase_date'], $row['asset_warranty_expire'], $row['asset_install_date'], $row['contact_name'], $row['location_name'], $row['asset_physical_location'], $row['asset_notes']);
fputcsv($f, $lineData, $delimiter);
}
@@ -1188,7 +1190,6 @@ if (isset($_GET['delete_asset_interface'])) {
if (isset($_POST["import_client_asset_interfaces_csv"])) {
enforceUserPermission('module_support', 2);
-
validateCSRFToken($_POST['csrf_token']);
$asset_id = intval($_POST['asset_id']);
@@ -1338,7 +1339,6 @@ if (isset($_GET['download_client_asset_interfaces_csv_template'])) {
if (isset($_POST['export_client_asset_interfaces_csv'])) {
enforceUserPermission('module_support');
-
validateCSRFToken($_POST['csrf_token']);
$asset_id = intval($_POST['asset_id']);
From a69b09c9e696760c1c2ac33d34ee647481e9cd99 Mon Sep 17 00:00:00 2001
From: wrongecho
Date: Mon, 3 Mar 2025 09:42:45 +0000
Subject: [PATCH 13/18] Bugfix: When exporting to CSV, the first asset isn't
shown
---
CHANGELOG.md | 1 +
post/user/asset.php | 14 +++++++-------
2 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 070186cc..b1e2b206 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@ This file documents all notable changes made to ITFlow.
## [25.03]
### Fixed
- Corrected some edit modals not showing notes correctly.
+- Bugfix: When exporting to CSV, the first asset wasn't being shown.
### Added / Changed
- Implemented SSL certificate history tracking.
diff --git a/post/user/asset.php b/post/user/asset.php
index 6d184f0d..bcfd1549 100644
--- a/post/user/asset.php
+++ b/post/user/asset.php
@@ -900,22 +900,22 @@ if (isset($_GET['download_assets_csv_template'])) {
if (isset($_POST['export_assets_csv'])) {
enforceUserPermission('module_support');
-
validateCSRFToken($_POST['csrf_token']);
+ $client_name = 'All'; // default
+
if (isset($_POST['client_id'])) {
$client_id = intval($_POST['client_id']);
$client_query = "AND asset_client_id = $client_id";
+
+ $client_row = mysqli_fetch_array(mysqli_query($mysqli,"SELECT client_name FROM clients WHERE client_id = $client_id"));
+ $client_name = $client_row['client_name'];
} else {
$client_query = '';
}
- //get records from database
+ // Get records from database
$sql = mysqli_query($mysqli,"SELECT * FROM assets LEFT JOIN contacts ON asset_contact_id = contact_id LEFT JOIN locations ON asset_location_id = location_id LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1 LEFT JOIN clients ON asset_client_id = client_id WHERE asset_archived_at IS NULL $client_query ORDER BY asset_name ASC");
- $row = mysqli_fetch_array($sql);
-
- $client_name = $row['client_name'];
-
$num_rows = mysqli_num_rows($sql);
if ($num_rows > 0) {
@@ -930,7 +930,7 @@ if (isset($_POST['export_assets_csv'])) {
fputcsv($f, $fields, $delimiter);
//output each row of the data, format line as csv and write to file pointer
- while($row = mysqli_fetch_array($sql)) {
+ while ($row = mysqli_fetch_array($sql)) {
$lineData = array($row['asset_name'], $row['asset_description'], $row['asset_type'], $row['asset_make'], $row['asset_model'], $row['asset_serial'], $row['asset_os'], $row['asset_purchase_date'], $row['asset_warranty_expire'], $row['asset_install_date'], $row['contact_name'], $row['location_name'], $row['asset_physical_location'], $row['asset_notes']);
fputcsv($f, $lineData, $delimiter);
}
From 5da1310e3466b46bdacfd27f586a10a31b2beff7 Mon Sep 17 00:00:00 2001
From: johnnyq
Date: Mon, 3 Mar 2025 14:36:38 -0500
Subject: [PATCH 14/18] Combine Notifications dismissed and notifications into
1 and add link to Notifications Ajax modal
---
ajax/ajax_notifications.php | 6 +-
notifications.php | 206 +++++++++++++++++++++++++-----------
notifications_dismissed.php | 132 -----------------------
3 files changed, 148 insertions(+), 196 deletions(-)
delete mode 100644 notifications_dismissed.php
diff --git a/ajax/ajax_notifications.php b/ajax/ajax_notifications.php
index 02ebac3b..dbb7e701 100644
--- a/ajax/ajax_notifications.php
+++ b/ajax/ajax_notifications.php
@@ -66,13 +66,17 @@ ob_start();