Files
mailgoserver/internal/db/crud_domain_dns_credentials.go
T

68 lines
2.8 KiB
Go

package db
import (
"database/sql"
"errors"
)
// DomainDNSCredentials holds one domain's DNS provider credentials, used to
// auto-publish its DKIM TXT record when dkim_dns_automation is "automatic" — see
// internal/dnspublish for what each field means and schema.go's
// esrv_domain_dns_credentials comment for the storage precedent (plaintext, matching
// [LetsEncrypt]'s own DNS-01 credentials).
type DomainDNSCredentials struct {
DomainID int64
Provider string
ZoneName string
CloudflareAPIToken string
Route53AccessKeyID string
Route53SecretAccessKey string
Route53Region string
DigitalOceanAPIToken string
GCloudProject string
GCloudServiceAccountJSON string
}
const domainDNSCredentialsColumns = `domain_id, provider, zone_name, cloudflare_api_token, route53_access_key_id, route53_secret_access_key, route53_region, digitalocean_api_token, gcloud_project, gcloud_service_account_json`
// GetDomainDNSCredentials returns nil (not an error) if the domain has none configured.
func (d *DB) GetDomainDNSCredentials(domainID int64) (*DomainDNSCredentials, error) {
row := d.QueryRow(`SELECT `+domainDNSCredentialsColumns+` FROM esrv_domain_dns_credentials WHERE domain_id = ?`, domainID)
var c DomainDNSCredentials
if err := row.Scan(&c.DomainID, &c.Provider, &c.ZoneName, &c.CloudflareAPIToken,
&c.Route53AccessKeyID, &c.Route53SecretAccessKey, &c.Route53Region,
&c.DigitalOceanAPIToken, &c.GCloudProject, &c.GCloudServiceAccountJSON); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
}
return nil, err
}
return &c, nil
}
// SetDomainDNSCredentials creates or replaces the one credentials row for
// c.DomainID (upsert, keyed on the primary key).
func (d *DB) SetDomainDNSCredentials(c DomainDNSCredentials) error {
_, err := d.Exec(`INSERT INTO esrv_domain_dns_credentials (`+domainDNSCredentialsColumns+`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(domain_id) DO UPDATE SET
provider = excluded.provider,
zone_name = excluded.zone_name,
cloudflare_api_token = excluded.cloudflare_api_token,
route53_access_key_id = excluded.route53_access_key_id,
route53_secret_access_key = excluded.route53_secret_access_key,
route53_region = excluded.route53_region,
digitalocean_api_token = excluded.digitalocean_api_token,
gcloud_project = excluded.gcloud_project,
gcloud_service_account_json = excluded.gcloud_service_account_json`,
c.DomainID, c.Provider, c.ZoneName, c.CloudflareAPIToken,
c.Route53AccessKeyID, c.Route53SecretAccessKey, c.Route53Region,
c.DigitalOceanAPIToken, c.GCloudProject, c.GCloudServiceAccountJSON)
return err
}
func (d *DB) DeleteDomainDNSCredentials(domainID int64) error {
_, err := d.Exec(`DELETE FROM esrv_domain_dns_credentials WHERE domain_id = ?`, domainID)
return err
}