From 0f1653e9135fd0ca69cdcf4dec418b09b358b264 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 26 Sep 2025 19:57:10 +0000 Subject: [PATCH] FlexPass_v.0005 --- add-client.php | 4 +- assets/js/main.js | 8 +- assets/pasted-20250925-212907-b1dbc7c4.png | Bin 0 -> 40957 bytes dashboard.php | 15 +- db/migrate.php | 46 +++++- db/migrations/002_add_user_id_to_clients.sql | 1 + .../003_make_user_id_not_null_in_clients.sql | 2 + db/temp_update_clients.php | 37 +++++ delete-client.php | 127 ++++++++++++++++ delete-credential.php | 106 ++++++++++--- delete-note.php | 25 ++-- edit-client.php | 140 ++++++++++++++++++ 12 files changed, 461 insertions(+), 50 deletions(-) create mode 100644 assets/pasted-20250925-212907-b1dbc7c4.png create mode 100644 db/migrations/002_add_user_id_to_clients.sql create mode 100644 db/migrations/003_make_user_id_not_null_in_clients.sql create mode 100644 db/temp_update_clients.php create mode 100644 delete-client.php create mode 100644 edit-client.php diff --git a/add-client.php b/add-client.php index 3f5c949..d35de6d 100644 --- a/add-client.php +++ b/add-client.php @@ -36,8 +36,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $errors[] = "Client ID already exists."; } else { // Insert into database - $stmt = $pdo->prepare("INSERT INTO clients (client_id, name, status) VALUES (?, ?, ?)"); - if ($stmt->execute([$clientId, $clientName, $status])) { + $stmt = $pdo->prepare("INSERT INTO clients (client_id, name, status, user_id) VALUES (?, ?, ?, ?)"); + if ($stmt->execute([$clientId, $clientName, $status, $_SESSION['user_id']])) { log_audit_event('client_create', $_SESSION['user_id'], 'client', $clientId); header("Location: dashboard.php?status=client_added"); exit; diff --git a/assets/js/main.js b/assets/js/main.js index d9df405..4daf22e 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -131,7 +131,13 @@ document.addEventListener('DOMContentLoaded', function () { if (confirm('Are you sure you want to delete this note?')) { const noteId = deleteButton.dataset.noteId; - fetch(`delete-note.php?note_id=${noteId}`) + const formData = new FormData(); + formData.append('note_id', noteId); + + fetch('delete-note.php', { + method: 'POST', + body: formData + }) .then(response => response.json()) .then(data => { if (data.success) { diff --git a/assets/pasted-20250925-212907-b1dbc7c4.png b/assets/pasted-20250925-212907-b1dbc7c4.png new file mode 100644 index 0000000000000000000000000000000000000000..4e43a1548fc2848be24f360d11f6e75061e5f8e1 GIT binary patch literal 40957 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 aAyMtECqdWZ>6cCyu(bH|r-h=rUjGXpwE#;1 literal 0 HcmV?d00001 diff --git a/dashboard.php b/dashboard.php index 78f8e65..e8374e7 100644 --- a/dashboard.php +++ b/dashboard.php @@ -15,8 +15,8 @@ $viewingClient = null; $clients = []; if (isset($_GET['client_id'])) { - $stmt = $pdo->prepare("SELECT * FROM clients WHERE client_id = ?"); - $stmt->execute([$_GET['client_id']]); + $stmt = $pdo->prepare("SELECT * FROM clients WHERE client_id = ? AND user_id = ?"); + $stmt->execute([$_GET['client_id'], $_SESSION['user_id']]); $viewingClient = $stmt->fetch(PDO::FETCH_ASSOC); $credentials = []; @@ -35,7 +35,8 @@ if (isset($_GET['client_id'])) { $notes = $noteStmt->fetchAll(PDO::FETCH_ASSOC); } } else { - $stmt = $pdo->query("SELECT * FROM clients ORDER BY name ASC"); + $stmt = $pdo->prepare("SELECT * FROM clients WHERE user_id = ? ORDER BY name ASC"); + $stmt->execute([$_SESSION['user_id']]); $clients = $stmt->fetchAll(PDO::FETCH_ASSOC); } @@ -55,7 +56,7 @@ if (isset($_GET['client_id'])) { + +
+

Delete Client

+ + +
+ + + +
+

Are you sure?

+

This action will permanently delete the client and all of their associated credentials and notes. This cannot be undone.

+
+
+ + Cancel +
+ +
Client not found or you do not have permission to delete it.
+ Back to Dashboard + +
+ + + + \ No newline at end of file diff --git a/delete-credential.php b/delete-credential.php index 02ca8a1..a9dd6f2 100644 --- a/delete-credential.php +++ b/delete-credential.php @@ -9,34 +9,92 @@ if (!isset($_SESSION['user_id'])) { exit; } -// Check if credential_id is provided -if (!isset($_GET['credential_id'])) { +$displayName = $_SESSION['user_display_name'] ?? 'User'; +$credentialId = $_GET['credential_id'] ?? null; +$credential = null; +$error = ''; + +if (!$credentialId) { header('Location: dashboard.php'); exit; } $pdo = db(); -$credential_id = $_GET['credential_id']; -// Fetch the client_id for redirecting back -$stmt = $pdo->prepare("SELECT client_id FROM credentials WHERE credential_id = ?"); -$stmt->execute([$credential_id]); -$credential = $stmt->fetch(PDO::FETCH_ASSOC); - -if ($credential) { - $client_id = $credential['client_id']; - - log_audit_event('credential_delete', $_SESSION['user_id'], 'credential', $credential_id); - - // Delete the credential - $deleteStmt = $pdo->prepare("DELETE FROM credentials WHERE credential_id = ?"); - $deleteStmt->execute([$credential_id]); - - // Redirect back to the client detail page with a success message - header("Location: dashboard.php?client_id=$client_id&status=credential_deleted"); - exit; -} else { - // Credential not found, just redirect - header('Location: dashboard.php'); - exit; +// Fetch credential data to display its name and ensure it belongs to the user. +try { + $stmt = $pdo->prepare( + "SELECT c.credential_id, c.name, c.client_id FROM credentials c " . + "JOIN clients cl ON c.client_id = cl.client_id " . + "WHERE c.credential_id = ? AND cl.user_id = ?" + ); + $stmt->execute([$credentialId, $_SESSION['user_id']]); + $credential = $stmt->fetch(PDO::FETCH_ASSOC); + if (!$credential) { + // If credential not found or doesn't belong to the user, redirect. + header('Location: dashboard.php'); + exit; + } +} catch (PDOException $e) { + $error = "Error fetching credential data: " . $e->getMessage(); } + + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST['confirm_delete'])) { + try { + $stmt = $pdo->prepare("DELETE FROM credentials WHERE credential_id = ?"); + $stmt->execute([$credentialId]); + + log_audit_event('credential_delete', $_SESSION['user_id'], "Credential '{$credential['name']}' (ID: {$credentialId}) deleted."); + + header('Location: dashboard.php?client_id=' . $credential['client_id'] . '&status=credential_deleted'); + exit; + } catch (PDOException $e) { + $error = "Error deleting credential: " . $e->getMessage(); + } + } +} + +?> + + + + + + Delete Credential - ClientManager + + + + + + +
+

Delete Credential

+ + +
+ + + +
+

Are you sure?

+

This action will permanently delete the credential .

+
+
+ + Cancel +
+ +
Credential not found or you do not have permission to delete it.
+ Back to Dashboard + +
+ + + + \ No newline at end of file diff --git a/delete-note.php b/delete-note.php index bdfdee2..59aeb88 100644 --- a/delete-note.php +++ b/delete-note.php @@ -5,25 +5,33 @@ require_once __DIR__ . '/includes/audit.php'; header('Content-Type: application/json'); +if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + echo json_encode(['success' => false, 'message' => 'Invalid request method.']); + exit; +} + // If user is not logged in, return error if (!isset($_SESSION['user_id'])) { echo json_encode(['success' => false, 'message' => 'User not logged in.']); exit; } -$noteId = $_GET['note_id'] ?? null; +$noteId = $_POST['note_id'] ?? null; if ($noteId) { try { $pdo = db(); - // First, get the client_id for redirection - $stmt = $pdo->prepare("SELECT client_id FROM notes WHERE note_id = ?"); - $stmt->execute([$noteId]); + // Verify that the note belongs to a client of the logged-in user + $stmt = $pdo->prepare( + "SELECT n.note_id FROM notes n " . + "JOIN clients c ON n.client_id = c.client_id " . + "WHERE n.note_id = ? AND c.user_id = ?" + ); + $stmt->execute([$noteId, $_SESSION['user_id']]); $note = $stmt->fetch(PDO::FETCH_ASSOC); - $clientId = $note['client_id'] ?? null; - if ($clientId) { + if ($note) { log_audit_event('note_delete', $_SESSION['user_id'], 'note', $noteId); // Now, delete the note @@ -33,17 +41,16 @@ if ($noteId) { echo json_encode(['success' => true]); exit; } else { - // Note not found or no client_id associated - echo json_encode(['success' => false, 'message' => 'Note not found.']); + echo json_encode(['success' => false, 'message' => 'Note not found or you do not have permission to delete it.']); exit; } } catch (PDOException $e) { // Optional: Log error + error_log("Error deleting note: " . $e->getMessage()); echo json_encode(['success' => false, 'message' => 'Database error.']); exit; } } else { - // Redirect if note_id is missing echo json_encode(['success' => false, 'message' => 'Note ID is required.']); exit; } diff --git a/edit-client.php b/edit-client.php new file mode 100644 index 0000000..f3e6931 --- /dev/null +++ b/edit-client.php @@ -0,0 +1,140 @@ +prepare("SELECT * FROM clients WHERE client_id = ? AND user_id = ?"); + $stmt->execute([$clientId, $_SESSION['user_id']]); + $client = $stmt->fetch(PDO::FETCH_ASSOC); + if (!$client) { + // If client not found or doesn't belong to the user, redirect. + header('Location: dashboard.php'); + exit; + } +} catch (PDOException $e) { + $errors[] = "Error fetching client data: " . $e->getMessage(); +} + + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $name = trim($_POST['name'] ?? ''); + $status = trim($_POST['status'] ?? ''); + + if (empty($name)) { + $errors[] = 'Client name is required.'; + } + if (!in_array($status, ['active', 'inactive'])) { + $errors[] = 'Invalid status value.'; + } + + if (empty($errors)) { + try { + $stmt = $pdo->prepare("UPDATE clients SET name = ?, status = ? WHERE client_id = ? AND user_id = ?"); + $stmt->execute([$name, $status, $clientId, $_SESSION['user_id']]); + log_audit_event('client_edit', $_SESSION['user_id'], "Client '{$name}' (ID: {$clientId}) updated."); + header('Location: dashboard.php?client_id=' . $clientId . '&status=client_updated'); + exit; + } catch (PDOException $e) { + $errors[] = "Error updating client: " . $e->getMessage(); + } + } +} + +?> + + + + + + Edit Client - ClientManager + + + + + + +
+

Edit Client

+ + +
+
    + +
  • + +
+
+ + + +
+
+ + +
+
+ + +
+ + Cancel +
+ +

Client not found or you do not have permission to view it.

+ Back to Dashboard + +
+ + + + \ No newline at end of file