From 0229f64f4ebc49427307a72bf78568b0e5a5e484 Mon Sep 17 00:00:00 2001
From: Hosteroid
Date: Tue, 21 Oct 2025 16:13:58 +0300
Subject: [PATCH] Implementing Manual Expiration Dates
---
app/Controllers/DomainController.php | 18 +++++++++++-----
app/Helpers/DomainHelper.php | 29 +++++++++++++++++++++++++
app/Views/domains/edit.php | 32 ++++++++++++++++++++++++++++
app/Views/domains/index.php | 9 +++++++-
app/Views/domains/view.php | 10 ++++++++-
5 files changed, 91 insertions(+), 7 deletions(-)
diff --git a/app/Controllers/DomainController.php b/app/Controllers/DomainController.php
index 29b61e7..13c2eb1 100644
--- a/app/Controllers/DomainController.php
+++ b/app/Controllers/DomainController.php
@@ -285,6 +285,7 @@ class DomainController extends Controller
$groupId = !empty($_POST['notification_group_id']) ? (int)$_POST['notification_group_id'] : null;
$isActive = isset($_POST['is_active']) ? 1 : 0;
$tagsInput = trim($_POST['tags'] ?? '');
+ $manualExpirationDate = !empty($_POST['manual_expiration_date']) ? $_POST['manual_expiration_date'] : null;
// Validate tags
$tagValidation = \App\Helpers\InputValidator::validateTags($tagsInput);
@@ -317,7 +318,8 @@ class DomainController extends Controller
$this->domainModel->update($id, [
'notification_group_id' => $groupId,
'tags' => $tags,
- 'is_active' => $isActive
+ 'is_active' => $isActive,
+ 'expiration_date' => $manualExpirationDate
]);
// Send notification if monitoring status changed and has notification group
@@ -403,12 +405,15 @@ class DomainController extends Controller
return;
}
- $status = $this->whoisService->getDomainStatus($whoisData['expiration_date'], $whoisData['status'] ?? []);
+ // Use WHOIS expiration date if available, otherwise preserve manual expiration date
+ $expirationDate = $whoisData['expiration_date'] ?? $domain['expiration_date'];
+
+ $status = $this->whoisService->getDomainStatus($expirationDate, $whoisData['status'] ?? []);
$this->domainModel->update($id, [
'registrar' => $whoisData['registrar'],
'registrar_url' => $whoisData['registrar_url'] ?? null,
- 'expiration_date' => $whoisData['expiration_date'],
+ 'expiration_date' => $expirationDate,
'updated_date' => $whoisData['updated_date'] ?? null,
'abuse_email' => $whoisData['abuse_email'] ?? null,
'last_checked' => date('Y-m-d H:i:s'),
@@ -707,12 +712,15 @@ class DomainController extends Controller
continue;
}
- $status = $this->whoisService->getDomainStatus($whoisData['expiration_date'], $whoisData['status'] ?? []);
+ // Use WHOIS expiration date if available, otherwise preserve manual expiration date
+ $expirationDate = $whoisData['expiration_date'] ?? $domain['expiration_date'];
+
+ $status = $this->whoisService->getDomainStatus($expirationDate, $whoisData['status'] ?? []);
$this->domainModel->update($id, [
'registrar' => $whoisData['registrar'],
'registrar_url' => $whoisData['registrar_url'] ?? null,
- 'expiration_date' => $whoisData['expiration_date'],
+ 'expiration_date' => $expirationDate,
'updated_date' => $whoisData['updated_date'] ?? null,
'abuse_email' => $whoisData['abuse_email'] ?? null,
'last_checked' => date('Y-m-d H:i:s'),
diff --git a/app/Helpers/DomainHelper.php b/app/Helpers/DomainHelper.php
index ac39278..979d583 100644
--- a/app/Helpers/DomainHelper.php
+++ b/app/Helpers/DomainHelper.php
@@ -30,9 +30,38 @@ class DomainHelper
// Determine expiry color for labels
$domain['expiryColor'] = self::getExpiryColor($domain['daysLeft']);
+ // Check if expiration date is manual (not from WHOIS/RDAP)
+ $domain['isManualExpiration'] = self::isManualExpiration($domain);
+
return $domain;
}
+ /**
+ * Check if expiration date is manually set (not from WHOIS/RDAP)
+ */
+ private static function isManualExpiration(array $domain): bool
+ {
+ // If no expiration date, it's not manual
+ if (empty($domain['expiration_date'])) {
+ return false;
+ }
+
+ // Parse WHOIS data to check if it contains expiration date
+ $whoisData = json_decode($domain['whois_data'] ?? '{}', true);
+
+ // If WHOIS data doesn't have expiration date, it's likely manual
+ if (empty($whoisData['expiration_date'])) {
+ return true;
+ }
+
+ // If WHOIS expiration date is different from stored expiration date, it's manual
+ if ($whoisData['expiration_date'] !== $domain['expiration_date']) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* Determine domain status from WHOIS data
*/
diff --git a/app/Views/domains/edit.php b/app/Views/domains/edit.php
index 2be4488..9586ff1 100644
--- a/app/Views/domains/edit.php
+++ b/app/Views/domains/edit.php
@@ -119,6 +119,38 @@ ob_start();
+
+
+
+
+
+
+
+
+
+ Set a manual expiration date if WHOIS/RDAP doesn't provide one (e.g., for .nl domains).
+ This will be used for expiration notifications and status calculations.
+