dnssec.go raw

   1  package goinwx
   2  
   3  import (
   4  	"errors"
   5  	"time"
   6  
   7  	"github.com/fatih/structs"
   8  	"github.com/go-viper/mapstructure/v2"
   9  )
  10  
  11  const (
  12  	methodDNSSecAddDNSKey     = "dnssec.adddnskey"
  13  	methodDNSSecDeleteAll     = "dnssec.deleteall"
  14  	methodDNSSecDeleteDNSKey  = "dnssec.deletednskey"
  15  	methodDNSSecDisableDNSSec = "dnssec.disablednssec"
  16  	methodDNSSecEnableDNSSec  = "dnssec.enablednssec"
  17  	methodDNSSecInfo          = "dnssec.info"
  18  	methodDNSSecListKeys      = "dnssec.listkeys"
  19  )
  20  
  21  // DNSSecService API access to DNSSEC.
  22  type DNSSecService service
  23  
  24  // Add adds one DNSKEY to a specified domain.
  25  func (s *DNSSecService) Add(request *DNSSecAddRequest) (*DNSSecAddResponse, error) {
  26  	if request == nil {
  27  		return nil, errors.New("request can't be nil")
  28  	}
  29  
  30  	requestMap := structs.Map(request)
  31  
  32  	req := s.client.NewRequest(methodDNSSecAddDNSKey, requestMap)
  33  
  34  	resp, err := s.client.Do(req)
  35  	if err != nil {
  36  		return nil, err
  37  	}
  38  
  39  	var result DNSSecAddResponse
  40  
  41  	err = mapstructure.Decode(resp, &result)
  42  	if err != nil {
  43  		return nil, err
  44  	}
  45  
  46  	return &result, nil
  47  }
  48  
  49  // DeleteAll deletes all DNSKEY/DS entries for a domain.
  50  func (s *DNSSecService) DeleteAll(domain string) error {
  51  	req := s.client.NewRequest(methodDNSSecDeleteAll, map[string]any{
  52  		"domainName": domain,
  53  	})
  54  
  55  	_, err := s.client.Do(req)
  56  	if err != nil {
  57  		return err
  58  	}
  59  
  60  	return nil
  61  }
  62  
  63  // DeleteDNSKey deletes one DNSKEY from a specified domain.
  64  func (s *DNSSecService) DeleteDNSKey(key string) error {
  65  	req := s.client.NewRequest(methodDNSSecDeleteDNSKey, map[string]any{
  66  		"key": key,
  67  	})
  68  
  69  	_, err := s.client.Do(req)
  70  	if err != nil {
  71  		return err
  72  	}
  73  
  74  	return nil
  75  }
  76  
  77  // Disable disables automated DNSSEC management for a domain.
  78  func (s *DNSSecService) Disable(domain string) error {
  79  	req := s.client.NewRequest(methodDNSSecDisableDNSSec, map[string]any{
  80  		"domainName": domain,
  81  	})
  82  
  83  	_, err := s.client.Do(req)
  84  	if err != nil {
  85  		return err
  86  	}
  87  
  88  	return nil
  89  }
  90  
  91  // Enable enables automated DNSSEC management for a domain.
  92  func (s *DNSSecService) Enable(domain string) error {
  93  	req := s.client.NewRequest(methodDNSSecEnableDNSSec, map[string]any{
  94  		"domainName": domain,
  95  	})
  96  
  97  	_, err := s.client.Do(req)
  98  	if err != nil {
  99  		return err
 100  	}
 101  
 102  	return nil
 103  }
 104  
 105  // Info gets current DNSSEC information.
 106  func (s *DNSSecService) Info(domains []string) (*DNSSecInfoResponse, error) {
 107  	req := s.client.NewRequest(methodDNSSecInfo, map[string]any{
 108  		"domains": domains,
 109  	})
 110  
 111  	resp, err := s.client.Do(req)
 112  	if err != nil {
 113  		return nil, err
 114  	}
 115  
 116  	var result DNSSecInfoResponse
 117  
 118  	err = mapstructure.Decode(resp, &result)
 119  	if err != nil {
 120  		return nil, err
 121  	}
 122  
 123  	return &result, nil
 124  }
 125  
 126  // List lists domains.
 127  func (s *DNSSecService) List(request *DNSSecServiceListRequest) (*DNSSecServiceList, error) {
 128  	if request == nil {
 129  		return nil, errors.New("request can't be nil")
 130  	}
 131  
 132  	requestMap := structs.Map(request)
 133  
 134  	req := s.client.NewRequest(methodDNSSecListKeys, requestMap)
 135  
 136  	resp, err := s.client.Do(req)
 137  	if err != nil {
 138  		return nil, err
 139  	}
 140  
 141  	var result DNSSecServiceList
 142  
 143  	err = mapstructure.Decode(resp, &result)
 144  	if err != nil {
 145  		return nil, err
 146  	}
 147  
 148  	return &result, nil
 149  }
 150  
 151  // DNSSecAddRequest API model.
 152  type DNSSecAddRequest struct {
 153  	DomainName      string `structs:"domainName,omitempty"`
 154  	DNSKey          string `structs:"dnskey,omitempty"`
 155  	DS              string `structs:"ds,omitempty"`
 156  	CalculateDigest bool   `structs:"calculateDigest,omitempty"`
 157  	DigestType      int    `structs:"digestType,omitempty"`
 158  }
 159  
 160  // DNSSecAddResponse API model.
 161  type DNSSecAddResponse struct {
 162  	DNSKey string `mapstructure:"dnskey"`
 163  	DS     string `mapstructure:"ds"`
 164  }
 165  
 166  // DNSSecInfoResponse API model.
 167  type DNSSecInfoResponse struct {
 168  	Data []DNSSecInfo `mapstructure:"data"`
 169  }
 170  
 171  // DNSSecInfo API model.
 172  type DNSSecInfo struct {
 173  	Domain       string `mapstructure:"domain"`
 174  	KeyCount     int    `mapstructure:"keyCount"`
 175  	DNSSecStatus string `mapstructure:"dnsSecStatus"`
 176  }
 177  
 178  // DNSSecServiceListRequest API model.
 179  type DNSSecServiceListRequest struct {
 180  	DomainName    string `structs:"domainName,omitempty"`
 181  	DomainNameIdn string `structs:"domainNameIdn,omitempty"`
 182  	KeyTag        int    `structs:"keyTag,omitempty"`
 183  	FlagID        int    `structs:"flagId,omitempty"`
 184  	AlgorithmID   int    `structs:"algorithmId,omitempty"`
 185  	PublicKey     string `structs:"publicKey,omitempty"`
 186  	DigestTypeID  int    `structs:"digestTypeId,omitempty"`
 187  	Digest        string `structs:"digest,omitempty"`
 188  	CreatedBefore string `structs:"createdBefore,omitempty"`
 189  	CreatedAfter  string `structs:"createdAfter,omitempty"`
 190  	Status        string `structs:"status,omitempty"`
 191  	Active        int    `structs:"active,omitempty"`
 192  	Page          int    `structs:"page,omitempty"`
 193  	PageLimit     int    `structs:"pagelimit,omitempty"`
 194  }
 195  
 196  // DNSSecServiceList API model.
 197  type DNSSecServiceList struct {
 198  	DNSKeys []DNSSecServiceListResponse `mapstructure:"dnskey"`
 199  }
 200  
 201  // DNSSecServiceListResponse API model.
 202  type DNSSecServiceListResponse struct {
 203  	OwnerName    string    `mapstructure:"ownerName"`
 204  	ID           int       `mapstructure:"id"`
 205  	DomainID     int       `mapstructure:"domainId"`
 206  	KeyTag       int       `mapstructure:"keyTag"`
 207  	FlagID       int       `mapstructure:"flagId"`
 208  	AlgorithmID  int       `mapstructure:"algorithmId"`
 209  	PublicKey    string    `mapstructure:"publicKey"`
 210  	DigestTypeID int       `mapstructure:"digestTypeId"`
 211  	Digest       string    `mapstructure:"digest"`
 212  	Created      time.Time `mapstructure:"created"`
 213  	Status       string    `mapstructure:"status"`
 214  	Active       int       `mapstructure:"active"`
 215  }
 216