diff options
| author | Bobby <[email protected]> | 2026-03-08 17:00:49 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-03-08 17:00:49 +0530 |
| commit | 2d5fb5e2078e92e7ec19582c3954409dd93f89fd (patch) | |
| tree | 932f96385d56c94596cb2bb073f0f72b13d3eee4 /services | |
| parent | 0f254730178c9b0d9b171fef49993071a4b6a0f1 (diff) | |
| download | dove-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.go | 6 | ||||
| -rw-r--r-- | services/domain/domain.go | 23 | ||||
| -rw-r--r-- | services/mail/mailboxes.go | 21 |
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 { |
