Files
itflow/agent/post/service.php
johnnyq 75df17698b Domains makeover: rebuilt domains list with expiry pills (red expired, amber close, blue close but auto-renewing), registrar and hosts shown once per vendor with their roles, SPF/DMARC/DKIM email pills, filters for Starred, Expiring in 45 days, Expired, No auto-renew and Email gaps with counts, registrar-or-host and tag filters, search across notes, hosts and tag names, safe column sorting, open straight to a domain with ?open=ID; new domain quick look with expiry, auto-renew, registration date and status, who registers it and hosts DNS, website and email, A/NS/MX records to copy, plain-language email checks (SPF strictness and duplicates, DMARC policy, DKIM at common selectors), certificates, services, the registrar and host logins, notes, TXT records, raw WHOIS and history; tabbed add/edit form that tidies pasted addresses to the domain, checks the name as it is typed (saved as, subdomain, already on the client), auto-renew switch, star, tags, client and our own vendors as registrar and hosts, Registrar does it all; add several domains at once from a pasted list; bulk look up now, set registrar or host, tags, star and unstar; domain tags (tag type 7) with a starter pack; refresher looks up a batch of up to 50 a run, never-checked, stale and soon-to-expire first; expiry alerts skip archived domains and clients, mention auto-renew and open the domain; vendor Domains tab opens the quick look and adds a domain with that vendor as registrar, our vendors get a Client domains tab; service quick look, overview renewals and search open the domain; client portal shows days to expiry and auto-renew; more export columns and filters; demo data with auto-renew, varied DMARC and DKIM, WHOIS lines and campaign domains near expiry. Fixes lookups, edits, the refresher and API updates wiping expiry dates and records when a lookup came back empty, edits logged without a client and dropping a past expiry date, every edit running slow lookups, expiry alerts for archived domains, deleted domains left on services and certificates, bulk archive needing delete rights and list actions limited to admins, registrar and host pickers accepting another client's vendors and dropping our own on save, services linking other clients' domains, a new client's website domain not added when its expiry could not be found, the WHOIS summary cut at 254 characters, and API names, vendors and duplicates not checked. Adds functions/domain.php helpers, domain quick look and shared form, domain_check lookup; removes domain_model.php. DB 2.8.3
2026-10-15 00:09:09 -04:00

207 lines
8.2 KiB
PHP

<?php
/*
* ITFlow - GET/POST request handler for client service info
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_service'])) {
validateCSRFToken();
enforceUserPermission('module_support', 2);
$client_id = intval($_POST['client_id']);
$service_name = escapeSql($_POST['name']);
$service_description = escapeSql($_POST['description']);
$service_category = escapeSql($_POST['category']); //TODO: Needs integration with company categories
$service_importance = escapeSql($_POST['importance']);
$service_backup = escapeSql($_POST['backup']);
$service_notes = escapeSql($_POST['note']);
enforceClientAccess();
// Create Service
mysqli_query($mysqli, "INSERT INTO services SET service_name = '$service_name', service_description = '$service_description', service_category = '$service_category', service_importance = '$service_importance', service_backup = '$service_backup', service_notes = '$service_notes', service_client_id = $client_id");
// Create links to assets
$service_id = mysqli_insert_id($mysqli);
if (isset($_POST['contacts'])) {
foreach($_POST['contacts'] as $contact_id) {
$contact_id = intval($contact_id);
mysqli_query($mysqli, "INSERT INTO service_contacts SET service_id = $service_id, contact_id = $contact_id");
}
}
if (isset($_POST['vendors'])) {
foreach($_POST['vendors'] as $vendor_id) {
$vendor_id = intval($vendor_id);
mysqli_query($mysqli, "INSERT INTO service_vendors SET service_id = $service_id, vendor_id = $vendor_id");
}
}
if (isset($_POST['documents'])) {
foreach($_POST['documents'] as $document_id) {
$document_id = intval($document_id);
mysqli_query($mysqli, "INSERT INTO service_documents SET service_id = $service_id, document_id = $document_id");
}
}
if (isset($_POST['assets'])) {
foreach($_POST['assets'] as $asset_id) {
$asset_id = intval($asset_id);
mysqli_query($mysqli, "INSERT INTO service_assets SET service_id = $service_id, asset_id = $asset_id");
}
}
if (isset($_POST['credentials'])) {
foreach($_POST['credentials'] as $credential_id) {
$credential_id = intval($credential_id);
// Only the client's own credentials
mysqli_query($mysqli, "INSERT INTO service_credentials (service_id, credential_id) SELECT $service_id, credential_id FROM credentials WHERE credential_id = $credential_id AND credential_client_id = $client_id");
}
}
if (isset($_POST['domains'])) {
foreach($_POST['domains'] as $domain_id) {
$domain_id = intval($domain_id);
// Only the client's own domains
mysqli_query($mysqli, "INSERT INTO service_domains (service_id, domain_id) SELECT $service_id, domain_id FROM domains WHERE domain_id = $domain_id AND domain_client_id = $client_id");
}
}
if (isset($_POST['certificates'])) {
foreach($_POST['certificates'] as $cert_id) {
$cert_id = intval($cert_id);
mysqli_query($mysqli, "INSERT INTO service_certificates SET service_id = $service_id, certificate_id = $cert_id");
}
}
logAudit("Service", "Create", "$session_name created service $service_name", $client_id, $service_id);
flashAlert("Service <strong>$service_name</strong> created");
redirect();
}
if (isset($_POST['edit_service'])) {
validateCSRFToken();
enforceUserPermission('module_support', 2);
$service_id = intval($_POST['service_id']);
$service_name = escapeSql($_POST['name']);
$service_description = escapeSql($_POST['description']);
$service_category = escapeSql($_POST['category']); //TODO: Needs integration with company categories
$service_importance = escapeSql($_POST['importance']);
$service_backup = escapeSql($_POST['backup']);
$service_notes = escapeSql($_POST['note']);
$client_id = intval(getFieldById('services', $service_id, 'service_client_id'));
enforceClientAccess();
// Update main service details
mysqli_query($mysqli, "UPDATE services SET service_name = '$service_name', service_description = '$service_description', service_category = '$service_category', service_importance = '$service_importance', service_backup = '$service_backup', service_notes = '$service_notes' WHERE service_id = $service_id");
// Unlink existing relations/assets
mysqli_query($mysqli, "DELETE FROM service_contacts WHERE service_id = $service_id");
mysqli_query($mysqli, "DELETE FROM service_vendors WHERE service_id = $service_id");
mysqli_query($mysqli, "DELETE FROM service_documents WHERE service_id = $service_id");
mysqli_query($mysqli, "DELETE FROM service_assets WHERE service_id = $service_id");
mysqli_query($mysqli, "DELETE FROM service_credentials WHERE service_id = $service_id");
mysqli_query($mysqli, "DELETE FROM service_domains WHERE service_id = $service_id");
mysqli_query($mysqli, "DELETE FROM service_certificates WHERE service_id = $service_id");
// Relink
if (isset($_POST['contacts'])) {
foreach($_POST['contacts'] as $contact_id) {
$contact_id = intval($contact_id);
mysqli_query($mysqli, "INSERT INTO service_contacts SET service_id = $service_id, contact_id = $contact_id");
}
}
if (isset($_POST['vendors'])) {
foreach($_POST['vendors'] as $vendor_id) {
$vendor_id = intval($vendor_id);
mysqli_query($mysqli, "INSERT INTO service_vendors SET service_id = $service_id, vendor_id = $vendor_id");
}
}
if (isset($_POST['documents'])) {
foreach($_POST['documents'] as $document_id) {
$document_id = intval($document_id);
mysqli_query($mysqli, "INSERT INTO service_documents SET service_id = $service_id, document_id = $document_id");
}
}
if (isset($_POST['assets'])) {
foreach($_POST['assets'] as $asset_id) {
$asset_id = intval($asset_id);
mysqli_query($mysqli, "INSERT INTO service_assets SET service_id = $service_id, asset_id = $asset_id");
}
}
if (isset($_POST['credentials'])) {
foreach($_POST['credentials'] as $credential_id) {
$credential_id = intval($credential_id);
// Only the client's own credentials
mysqli_query($mysqli, "INSERT INTO service_credentials (service_id, credential_id) SELECT $service_id, credential_id FROM credentials WHERE credential_id = $credential_id AND credential_client_id = $client_id");
}
}
if (isset($_POST['domains'])) {
foreach($_POST['domains'] as $domain_id) {
$domain_id = intval($domain_id);
// Only the client's own domains
mysqli_query($mysqli, "INSERT INTO service_domains (service_id, domain_id) SELECT $service_id, domain_id FROM domains WHERE domain_id = $domain_id AND domain_client_id = $client_id");
}
}
if (isset($_POST['certificates'])) {
foreach($_POST['certificates'] as $cert_id) {
$cert_id = intval($cert_id);
mysqli_query($mysqli, "INSERT INTO service_certificates SET service_id = $service_id, certificate_id = $cert_id");
}
}
logAudit("Service", "Edit", "$session_name edited service $service_name", $client_id, $service_id);
flashAlert("Service <strong>$service_name</strong> edited");
redirect();
}
if (isset($_GET['delete_service'])) {
validateCSRFToken();
enforceUserPermission('module_support', 3);
$service_id = intval($_GET['delete_service']);
// Get Service Details
$sql = mysqli_query($mysqli,"SELECT service_name, service_client_id FROM services WHERE service_id = $service_id");
$row = mysqli_fetch_assoc($sql);
$service_name = escapeSql($row['service_name']);
$client_id = intval($row['service_client_id']);
enforceClientAccess();
// Delete service
mysqli_query($mysqli, "DELETE FROM services WHERE service_id = $service_id");
logAudit("Service", "Delete", "$session_name deleted service $service_name", $client_id);
flashAlert("Service <strong>$service_name</strong> deleted", 'error');
redirect();
}