aboutsummaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-03-08 17:00:49 +0530
committerBobby <[email protected]>2026-03-08 17:00:49 +0530
commit2d5fb5e2078e92e7ec19582c3954409dd93f89fd (patch)
tree932f96385d56c94596cb2bb073f0f72b13d3eee4 /services
parent0f254730178c9b0d9b171fef49993071a4b6a0f1 (diff)
downloaddove-2d5fb5e2078e92e7ec19582c3954409dd93f89fd.tar.xz
dove-2d5fb5e2078e92e7ec19582c3954409dd93f89fd.zip
feat(dns): Implement DNS record management and query handling
- Added models for various DNS record types: A, AAAA, CNAME, MX, SRV, and TXT. - Created repository functions for CRUD operations on DNS records. - Developed DNS server functionality to handle incoming queries and forward them to upstream servers. - Implemented local resolution for DNS queries, including support for A, AAAA, CNAME, MX, TXT, and SRV records. - Enhanced SMTP server to support TLS and STARTTLS configurations. - Improved email session handling with local delivery and error logging. - Added new log messages for better traceability of DNS operations and SMTP actions.
Diffstat (limited to 'services')
-rw-r--r--services/domain/defaults.go6
-rw-r--r--services/domain/domain.go23
-rw-r--r--services/mail/mailboxes.go21
3 files changed, 49 insertions, 1 deletions
diff --git a/services/domain/defaults.go b/services/domain/defaults.go
new file mode 100644
index 0000000..aee8c14
--- /dev/null
+++ b/services/domain/defaults.go
@@ -0,0 +1,6 @@
+package domain
+
+const (
+ DefaultAddress = "127.0.0.1"
+ DefaultMXTarget = "mail"
+)
diff --git a/services/domain/domain.go b/services/domain/domain.go
index f320189..ff3efa5 100644
--- a/services/domain/domain.go
+++ b/services/domain/domain.go
@@ -3,7 +3,9 @@ package domain
import (
"strings"
+ dnsModel "dove/models/dns"
domainModel "dove/models/domain"
+ dnsRepo "dove/repositories/dns"
domainRepo "dove/repositories/domain"
mailRepo "dove/repositories/mail"
"dove/utils/shortcuts"
@@ -86,9 +88,19 @@ func CreateDomain(request CreateDomainRequest) *shortcuts.Error {
return shortcuts.ServiceError(shortcuts.Internal, DomainCreationFailed)
}
+ seedDefaultARecord(newDomain.ID)
+
return nil
}
+func seedDefaultARecord(domainID uint) {
+ dnsRepo.CreateARecord(&dnsModel.ARecord{
+ DomainID: domainID,
+ Name: "@",
+ Address: DefaultAddress,
+ })
+}
+
func EditDomainFormData(domainID uint) (*EditDomainFormResponse, *shortcuts.Error) {
foundDomain := domainRepo.FindDomainByID(domainID)
if foundDomain == nil {
@@ -156,9 +168,20 @@ func DeleteDomain(domainID uint) *shortcuts.Error {
return shortcuts.ServiceError(shortcuts.Unprocessable, DomainHasMailboxes)
}
+ deleteAllDNSRecords(foundDomain.ID)
+
if deleteError := domainRepo.DeleteDomain(foundDomain); deleteError != nil {
return shortcuts.ServiceError(shortcuts.Internal, DomainDeletionFailed)
}
return nil
}
+
+func deleteAllDNSRecords(domainID uint) {
+ dnsRepo.DeleteARecordsByDomainID(domainID)
+ dnsRepo.DeleteAAAARecordsByDomainID(domainID)
+ dnsRepo.DeleteCNAMERecordsByDomainID(domainID)
+ dnsRepo.DeleteMXRecordsByDomainID(domainID)
+ dnsRepo.DeleteTXTRecordsByDomainID(domainID)
+ dnsRepo.DeleteSRVRecordsByDomainID(domainID)
+}
diff --git a/services/mail/mailboxes.go b/services/mail/mailboxes.go
index d940907..3a4ee90 100644
--- a/services/mail/mailboxes.go
+++ b/services/mail/mailboxes.go
@@ -3,9 +3,11 @@ package mail
import (
"strings"
+ dnsModel "dove/models/dns"
domainModel "dove/models/domain"
- domainRepo "dove/repositories/domain"
mailModel "dove/models/mail"
+ dnsRepo "dove/repositories/dns"
+ domainRepo "dove/repositories/domain"
mailRepo "dove/repositories/mail"
"dove/utils/meta"
"dove/utils/shortcuts"
@@ -89,9 +91,26 @@ func CreateMailbox(request CreateMailboxRequest) *shortcuts.Error {
return shortcuts.ServiceError(shortcuts.Internal, FolderSeedFailed)
}
+ seedMXRecordForDomain(foundDomain)
+
return nil
}
+func seedMXRecordForDomain(targetDomain *domainModel.Domain) {
+ fullDomainName := targetDomain.Name + "." + targetDomain.TLD.Name
+ existingMX := dnsRepo.FindMXRecordByTarget(targetDomain.ID, fullDomainName)
+ if existingMX != nil {
+ return
+ }
+
+ dnsRepo.CreateMXRecord(&dnsModel.MXRecord{
+ DomainID: targetDomain.ID,
+ Name: "@",
+ Target: fullDomainName,
+ Priority: 10,
+ })
+}
+
func EditMailboxFormData(mailboxID uint) (*EditMailboxFormResponse, *shortcuts.Error) {
mailbox := mailRepo.FindMailboxByIDWithRelations(mailboxID)
if mailbox == nil {