68 lines
2.8 KiB
Go
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
|
|
}
|