Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
227b87b
Fix Show OTP on hover in asset and contact details logins section
johnnyq Jan 26, 2025
052d5a6
Remove cron key from setup
johnnyq Jan 26, 2025
d5a03d3
remove cron key from the code and remove old cron script and setup an…
johnnyq Jan 26, 2025
96809c7
Update db.sql
johnnyq Jan 26, 2025
ab7273b
Reduce Global Ticket view padding by not displaying contact's email
johnnyq Jan 27, 2025
8221ef2
Global Ticket View make contact secondary text in table header and re…
johnnyq Jan 27, 2025
39adab7
Enhanced the MFA Setup Flow
johnnyq Jan 28, 2025
071352e
Autopay
Jan 28, 2025
20a862f
Fix redirect to /client if no login key is set
Jan 28, 2025
5fa8363
Fix ticket assign modal/filter
Jan 28, 2025
92ef31d
Bulk mail - only show active clients
Jan 28, 2025
c150fb0
Fix Profit and Loss Report getting the wrong total expense amount for…
johnnyq Jan 28, 2025
ec9572c
Merge branch 'develop' of github.com:itflow-org/itflow into develop
johnnyq Jan 28, 2025
9ea5fdf
Further improve the MFA process, now when verification fails the moda…
johnnyq Jan 28, 2025
a4c9b4e
fix right margin on forms in user details when in mobile response
johnnyq Jan 28, 2025
706a77c
Added btn-responsive style class to define buttons to go full block l…
johnnyq Jan 28, 2025
47eddfd
Merge pull request #1155 from itflow-org/rec-payment-stripe
johnnyq Jan 28, 2025
f417335
Merge pull request #1156 from itflow-org/tck-assign
johnnyq Jan 28, 2025
5b5e01d
Merge pull request #1157 from itflow-org/bulk-mail
johnnyq Jan 28, 2025
c282e22
Updated Changelog
johnnyq Jan 28, 2025
677bb6b
Updated Changelog removed crons and cron key
johnnyq Jan 28, 2025
52ad2ba
Reworked the MFA Enforcement
johnnyq Jan 28, 2025
02fdc66
Updated UI / UX MFA enforcement
johnnyq Jan 29, 2025
033a5d1
Remove comment
johnnyq Jan 29, 2025
6cbd4ff
Add members column in roles and other UI tidying
johnnyq Jan 29, 2025
22a5c90
Reworked MFA Enforcement page to use login page style for smoother tr…
johnnyq Jan 29, 2025
5b32127
Add Tooltips on hover to better explain what to do with the MFA enfor…
johnnyq Jan 29, 2025
34b94af
Copied the cron scripts from /script dir back to / and updated all re…
johnnyq Jan 29, 2025
ffca7ff
Added back warning about the old script path
johnnyq Jan 29, 2025
c4980a1
Update Changelog
johnnyq Jan 29, 2025
6df465a
Update Changelog
johnnyq Jan 29, 2025
aa87a11
Removed setup from the cron script wording
johnnyq Jan 29, 2025
bf019f3
Minor changelog wording tweaks
Jan 29, 2025
badda09
Prevent users disabling MFA when it is enforced
Jan 29, 2025
b3c7b00
Fix broken image link in user pref and company details ig not avatar …
johnnyq Jan 30, 2025
dd94e59
Merge branch 'develop' of github.com:itflow-org/itflow into develop
johnnyq Jan 30, 2025
2e5b0d1
Increased version to 25.01.1 for a hotfix release
johnnyq Jan 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

This file documents all notable changes made to ITFlow.

## [25.01.01]

### Added / Changed
- Redesigned the Multi-Factor Authentication (MFA) Setup and Enforcement Flow UI/UX for a more intuitive user experience.
- Added a "Member" column in the user roles listing for improved visibility.
- General UI/UX improvements, along with minor performance optimizations and cleanups.

### Fixed
- Fixed an issue where Stripe was not appearing as a recurring payment option.
- Corrected inaccurate Quarter 2 Expense results in the Profit & Loss Report.
- Resolved TOTP code not displaying correctly on hover in the Contact or Asset Details sections.
- Archived contacts no longer appear in the Bulk Mail section.
- Fixed an issue where the Ticket Assign Modal was showing both ITFlow and client users.
- Fixed issue with login key redirecting to legacy client portal page.

## [25.01]

### Added / Changed
Expand Down
5 changes: 3 additions & 2 deletions admin_bulk_mail.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

$sql = mysqli_query($mysqli, "SELECT * FROM contacts
LEFT JOIN clients ON client_id = contact_client_id
WHERE contact_archived_at IS NULL
WHERE client_archived_at IS NULL
AND contact_archived_at IS NULL
AND contact_email != ''
AND (contact_primary = 1 OR
contact_important = 1 OR
Expand All @@ -22,7 +23,7 @@
<h3 class="card-title mt-2 mb-2"><i class="fa fa-fw fa-envelope-open mr-2"></i>Bulk Mail</h3>
<div class="card-tools">
<button id="bulkActionButton" hidden class="btn btn-primary" type="submit" form='bulkActions' name="send_bulk_mail_now">
<i class="fas fa-fw fa-paper-plane mr-2"></i>Send Now (<span id="selectedCount">0</span>)
<i class="fas fa-fw fa-paper-plane mr-2"></i>Send (<span id="selectedCount">0</span>)
</button>
</div>
</div>
Expand Down
10 changes: 2 additions & 8 deletions admin_mail_queue.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,6 @@
<input class="form-check-input" id="selectAllCheckbox" type="checkbox" onclick="checkAll(this)">
</div>
</td>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_id&order=<?php echo $disp; ?>">
ID <?php if ($sort == 'email_id') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_queued_at&order=<?php echo $disp; ?>">
Queued <?php if ($sort == 'email_queued_at') { echo $order_icon; } ?>
Expand Down Expand Up @@ -137,7 +132,7 @@
Attempts <?php if ($sort == 'email_attempts') { echo $order_icon; } ?>
</a>
</th>
<th>Action</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
Expand Down Expand Up @@ -175,14 +170,13 @@
</div>
<?php } ?>
</td>
<td><?php echo $email_id; ?></td>
<td><?php echo $email_queued_at; ?></td>
<td><?php echo "$email_from<br><small class='text-secondary'>$email_from_name</small>"?></td>
<td><?php echo "$email_recipient<br><small class='text-secondary'>$email_recipient_name</small>"?></td>
<td><?php echo $email_subject; ?></td>
<td><?php echo $email_status_display; ?></td>
<td><?php echo $email_attempts; ?></td>
<td>
<td class="text-center">
<a class="btn btn-sm btn-secondary" href="admin_mail_queue_message_view.php?email_id=<?php echo $email_id; ?>">
<i class="fas fa-fw fa-eye"></i>
</a>
Expand Down
37 changes: 23 additions & 14 deletions admin_role.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));

?>
<div class="alert alert-warning text-center"><strong>Roles are still in development. Permissions may not be fully enforced.</strong></div>
<div class="alert alert-info text-center"><strong>Roles are still in development. Permissions may not be fully enforced.</strong></div>

<div class="card card-dark">
<div class="card-header py-2">
Expand Down Expand Up @@ -54,22 +54,15 @@
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=user_role_name&order=<?php echo $disp; ?>">
Name <?php if ($sort == 'user_role_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=user_role_description&order=<?php echo $disp; ?>">
Description <?php if ($sort == 'user_role_description') { echo $order_icon; } ?>
Role <?php if ($sort == 'user_role_name') { echo $order_icon; } ?>
</a>
</th>
<th>Members</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=user_role_is_admin&order=<?php echo $disp; ?>">
Admin <?php if ($sort == 'user_role_is_admin') { echo $order_icon; } ?>
</a>
</th>
<th class="text-center">
User count
</th>
<th class="text-center">Action</th>
</tr>
</thead>
Expand All @@ -87,16 +80,32 @@
$sql_role_user_count = mysqli_query($mysqli, "SELECT COUNT(users.user_id) FROM users LEFT JOIN user_settings on users.user_id = user_settings.user_id WHERE user_role = $role_id AND user_archived_at IS NULL");
$role_user_count = mysqli_fetch_row($sql_role_user_count)[0];

$sql_users = mysqli_query($mysqli, "SELECT * FROM users LEFT JOIN user_settings on users.user_id = user_settings.user_id WHERE user_role = $role_id AND user_archived_at IS NULL");
// Initialize an empty array to hold user names
$user_names = [];

// Fetch each row and store the user_name in the array
while($row = mysqli_fetch_assoc($sql_users)) {
$user_names[] = nullable_htmlentities($row['user_name']);
}

// Convert the array of user names to a comma-separated string
$user_names_string = implode(",", $user_names) ;

if (empty($user_names_string)) {
$user_names_string = "-";
}

?>
<tr>
<td>
<a class="text-dark" href="#" data-toggle="modal" data-target="#editRoleModal<?php echo $role_id; ?>">
<div class="text-secondary"><?php echo $role_name; ?></div>
<a class="text-dark text-bold" href="#" data-toggle="modal" data-target="#editRoleModal<?php echo $role_id; ?>">
<?php echo $role_name; ?>
</a>
<div class="text-secondary"><?php echo $role_description; ?></div>
</td>
<td><?php echo $role_description; ?></td>
<td><?php echo $user_names_string; ?></td>
<td><?php echo $role_admin ? 'Yes' : 'No' ; ?></td>
<td class="text-center"><?php echo $role_user_count ?></td>
<td>
<?php if ($role_id !== 3) { ?>
<div class="dropdown dropleft text-center">
Expand Down
2 changes: 1 addition & 1 deletion admin_settings_company.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

<div class="row">
<div class="col-md-3 text-center">
<?php if(file_exists("uploads/settings/$company_logo")) { ?>
<?php if($company_logo) { ?>
<img class="img-thumbnail" src="<?php echo "uploads/settings/$company_logo"; ?>">
<a href="post.php?remove_company_logo" class="btn btn-outline-danger btn-block">Remove Logo</a>
<hr>
Expand Down
13 changes: 0 additions & 13 deletions admin_settings_notification.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,6 @@
</div>
</div>

<div class="form-group">
<label>Cron Key</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" name="config_cron_key" placeholder="Generate a CRON Key" value="<?php echo nullable_htmlentities($config_cron_key); ?>" readonly>
<div class="input-group-append">
<a href="post.php?generate_cron_key" class="btn btn-secondary confirm-link"><i class="fas fa-fw fa-sync mr-2"></i>Regenerate</a>
</div>
</div>
</div>

<table class="table table-bordered">
<thead class="thead-dark">
<tr>
Expand Down
7 changes: 1 addition & 6 deletions check_login.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
$session_name = sanitizeInput($row['user_name']);
$session_email = $row['user_email'];
$session_avatar = $row['user_avatar'];
$session_token = $row['user_token'];
$session_token = $row['user_token']; // MFA Token
$session_user_role = intval($row['user_role']);
$session_user_role_display = sanitizeInput($row['user_role_name']);
if (isset($row['user_role_is_admin']) && $row['user_role_is_admin'] == 1) {
Expand Down Expand Up @@ -128,8 +128,3 @@
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('notification_id') AS num FROM notifications WHERE (notification_user_id = $session_user_id OR notification_user_id = 0) AND notification_dismissed_at IS NULL"));
$num_notifications = $row['num'];


// FORCE MFA Setup
//if ($session_user_config_force_mfa == 1 && $session_token == NULL) {
// header("Location: force_mfa.php");
//}
4 changes: 3 additions & 1 deletion client_asset_details.php
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@
if (empty($login_otp_secret)) {
$otp_display = "-";
} else {
$otp_display = "<span onmouseenter='showOTP($login_id_with_secret)'><i class='far fa-clock'></i> <span id='otp_$login_id'><i>Hover..</i></span></span>";
$otp_display = "<span onmouseenter='showOTPViaLoginID($login_id)'><i class='far fa-clock'></i> <span id='otp_$login_id'><i>Hover..</i></span></span>";
}
$login_note = nullable_htmlentities($row['login_note']);
$login_important = intval($row['login_important']);
Expand Down Expand Up @@ -926,6 +926,8 @@ function updateAssetNotes(asset_id) {
</script>

<script src="js/recurring_tickets_edit_modal.js"></script>
<!-- Include script to get TOTP code via the login ID -->
<script src="js/logins_show_otp_via_id.js"></script>

<?php

Expand Down
4 changes: 3 additions & 1 deletion client_contact_details.php
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ class="btn btn-secondary btn-sm" title="Unlink">
if (empty($login_otp_secret)) {
$otp_display = "-";
} else {
$otp_display = "<span onmouseenter='showOTP($login_id_with_secret)'><i class='far fa-clock'></i> <span id='otp_$login_id'><i>Hover..</i></span></span>";
$otp_display = "<span onmouseenter='showOTPViaLoginID($login_id)'><i class='far fa-clock'></i> <span id='otp_$login_id'><i>Hover..</i></span></span>";
}
$login_note = nullable_htmlentities($row['login_note']);
$login_important = intval($row['login_important']);
Expand Down Expand Up @@ -1129,6 +1129,8 @@ function(data) {
</script>

<script src="js/recurring_tickets_edit_modal.js"></script>
<!-- Include script to get TOTP code via the login ID -->
<script src="js/logins_show_otp_via_id.js"></script>

<?php

Expand Down
Loading