From 60ab2b9723716f0a2141229f8c7848404f21f7f7 Mon Sep 17 00:00:00 2001 From: Pinga <121483313+getpinga@users.noreply.github.com> Date: Fri, 1 Nov 2024 14:36:59 +0200 Subject: [PATCH] Improved the spec11 abuse report, fixed #167 --- automation/abusereport.php | 115 +++++++++++++++++++++++++------------ 1 file changed, 77 insertions(+), 38 deletions(-) diff --git a/automation/abusereport.php b/automation/abusereport.php index 18d53ba..1bcca45 100644 --- a/automation/abusereport.php +++ b/automation/abusereport.php @@ -4,32 +4,47 @@ require __DIR__ . '/vendor/autoload.php'; $c = require_once 'config.php'; require_once 'helpers.php'; -// Connect to the database -$dsn = "{$c['db_type']}:host={$c['db_host']};dbname={$c['db_database']}"; -$options = [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false, -]; $logFilePath = '/var/log/namingo/abusereport.log'; $log = setupLogger($logFilePath, 'Abuse_Report'); -$log->info('job started.'); +$log->info('Job started.'); try { - $dbh = new PDO($dsn, $c['db_username'], $c['db_password'], $options); + // Database connection + $dsn = "{$c['db_type']}:host={$c['db_host']};dbname={$c['db_database']}"; + $dbh = new PDO($dsn, $c['db_username'], $c['db_password'], [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]); } catch (PDOException $e) { $log->error('DB Connection failed: ' . $e->getMessage()); + exit; } -try { - // Prepare and execute the query - $query = "SELECT reported_domain, nature_of_abuse, status, priority, date_of_incident, date_created FROM support_tickets WHERE category_id = '8'"; - $stmt = $dbh->query($query); +// Retrieve tickets by user role +function getTicketsByUserRole($dbh, $userRoleMask, $userId = null) +{ + $query = "SELECT reported_domain, nature_of_abuse, status, priority, date_of_incident, date_created + FROM support_tickets + WHERE category_id = '8'"; - // Fetch all rows - $tickets = $stmt->fetchAll(PDO::FETCH_ASSOC); + if ($userRoleMask === 4 && $userId) { + $query .= " AND user_id = :userId"; + } - // Start HTML output + $stmt = $dbh->prepare($query); + if ($userRoleMask === 4 && $userId) { + $stmt->execute([':userId' => $userId]); + } else { + $stmt->execute(); + } + + return $stmt->fetchAll(); +} + +// Generate HTML report for abuse tickets +function generateReportHTML($tickets) +{ $html = " @@ -37,12 +52,11 @@ try {

Abuse Report

-

Report Date: " . date('Y-m-d H:i:s') . "

"; // Display report generation date +

Report Date: " . date('Y-m-d H:i:s') . "

"; if (empty($tickets)) { - $html .= "

No abuse cases found for the period.

"; // Message if no tickets + $html .= "

No abuse cases found for the period.

"; } else { - // Continue with the table if tickets are found $html .= " @@ -53,7 +67,6 @@ try { "; - // Loop through tickets and add rows to the table foreach ($tickets as $ticket) { $html .= " @@ -64,29 +77,30 @@ try { "; } - - $html .= "
Reported DomainDate Reported
" . htmlspecialchars($ticket['reported_domain']) . "" . htmlspecialchars($ticket['date_created']) . "
"; // Close the table + $html .= ""; } + + $html .= ""; + return $html; +} - // End HTML - $html .= " - "; - - // Prepare the data array +// Send email via internal API +function sendEmail($toEmail, $subject, $htmlContent) +{ + global $log; $data = [ 'type' => 'sendmail', 'toEmail' => $toEmail, - 'subject' => 'Abuse Report', - 'body' => $html, + 'subject' => $subject, + 'body' => $htmlContent, ]; $url = 'http://127.0.0.1:8250'; - $options = [ CURLOPT_RETURNTRANSFER => true, - CURLOPT_CUSTOMREQUEST => 'POST', - CURLOPT_POSTFIELDS => json_encode($data), - CURLOPT_HTTPHEADER => [ + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => json_encode($data), + CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Content-Length: ' . strlen(json_encode($data)) ], @@ -94,18 +108,43 @@ try { $curl = curl_init($url); curl_setopt_array($curl, $options); - $response = curl_exec($curl); if ($response === false) { - throw new Exception(curl_error($curl), curl_errno($curl)); + $log->error('Email sending failed: ' . curl_error($curl)); + curl_close($curl); + return false; } curl_close($curl); + return true; +} - $log->info('job finished successfully.'); -} catch (PDOException $e) { - $log->error('Database error: ' . $e->getMessage()); +// Process report generation and sending based on roles +try { + $userRoles = [ + ['role' => 0, 'message' => 'Full abuse report for all domains'], + ['role' => 4, 'message' => 'Abuse report for specific user cases'] + ]; + + foreach ($userRoles as $role) { + $users = $dbh->prepare("SELECT id, email FROM users WHERE roles_mask = :roleMask"); + $users->execute([':roleMask' => $role['role']]); + + while ($user = $users->fetch()) { + $tickets = getTicketsByUserRole($dbh, $role['role'], $user['id']); + $htmlContent = generateReportHTML($tickets); + $subject = "Abuse Report - {$role['message']}"; + + if (sendEmail($user['email'], $subject, $htmlContent)) { + $log->info("Abuse report sent to {$user['email']} for role {$role['role']}"); + } else { + $log->error("Failed to send abuse report to {$user['email']} for role {$role['role']}"); + } + } + } + + $log->info('Job finished successfully.'); } catch (Throwable $e) { $log->error('Error: ' . $e->getMessage()); } \ No newline at end of file