@@ -13,57 +13,70 @@ import (
1313)
1414
1515type WebserviceResponse struct {
16- Success bool
17- Message string
18- Domain string
19- Domains []string
20- Address string
21- AddrType string
22- Addresses []Address
23- }
24-
25- type Address struct {
16+ Success bool
17+ Message string
18+ Domain string
19+ Domains []string
2620 Address string
2721 AddrType string
22+ Records []Record
2823}
2924
30- func ParseAddress (address string ) (Address , error ) {
25+ type Record struct {
26+ Value string
27+ Type string
28+ }
29+
30+ func ParseAddress (address string ) (Record , error ) {
3131 if ipparser .ValidIP4 (address ) {
32- return Address { Address : address , AddrType : "A" }, nil
32+ return Record { Value : address , Type : "A" }, nil
3333 } else if ipparser .ValidIP6 (address ) {
34- return Address { Address : address , AddrType : "AAAA" }, nil
34+ return Record { Value : address , Type : "AAAA" }, nil
3535 }
36- return Address {}, fmt .Errorf ("Invalid ip address: %s" , address )
36+ return Record {}, fmt .Errorf ("invalid ip address: %s" , address )
3737}
3838
3939func BuildWebserviceResponseFromRequest (r * http.Request , appConfig * Config , extractors requestDataExtractor ) WebserviceResponse {
4040 response := WebserviceResponse {}
4141
4242 response .Domains = strings .Split (extractors .Domain (r ), "," )
4343 for _ , address := range strings .Split (extractors .Address (r ), "," ) {
44+ if address == "" {
45+ continue
46+ }
4447 var parsedAddress , error = ParseAddress (address )
4548 if error == nil {
46- response .Addresses = append (response .Addresses , parsedAddress )
49+ response .Records = append (response .Records , parsedAddress )
50+ } else {
51+ response .Success = false
52+ response .Message = fmt .Sprintf ("Error: %v. '%v' is neither a valid IPv4 nor IPv6 address" , error , extractors .Address (r ))
53+ log .Println (response .Message )
54+ return response
4755 }
4856 }
4957
5058 if extractors .Secret (r ) == "" { // futher checking is done by bind server as configured
51- log .Println (fmt .Sprintf ("Invalid shared secret" ))
5259 response .Success = false
5360 response .Message = "Invalid Credentials"
61+ log .Println (response .Message )
5462 return response
5563 }
5664
5765 for _ , domain := range response .Domains {
5866 if domain == "" {
5967 response .Success = false
60- response .Message = fmt . Sprintf ( "Domain not set" )
61- log .Println ("Domain not set" )
68+ response .Message = "Domain not set"
69+ log .Println (response . Message )
6270 return response
6371 }
6472 }
6573
66- if len (response .Addresses ) == 0 {
74+ req := Record {extractors .Value (r ), extractors .Type (r )}
75+ if req .Type != "" && req .Value != "" {
76+ response .Records = append (response .Records , req )
77+ }
78+
79+ if len (response .Records ) == 0 {
6780 ip , err := getUserIP (r )
6881 if ip == "" {
6982 ip , _ , err = net .SplitHostPort (r .RemoteAddr )
@@ -72,22 +85,22 @@ func BuildWebserviceResponseFromRequest(r *http.Request, appConfig *Config, extr
7285 if err == nil {
7386 parsedAddress , err := ParseAddress (ip )
7487 if err == nil {
75- response .Addresses = append (response .Addresses , parsedAddress )
88+ response .Records = append (response .Records , parsedAddress )
7689 }
7790 }
7891 }
7992
80- if len (response .Addresses ) == 0 {
93+ if len (response .Records ) == 0 {
8194 response .Success = false
82- response .Message = fmt . Sprintf ( "%v is neither a valid IPv4 nor IPv6 address" , extractors . Address ( r ))
83- log .Println (fmt . Sprintf ( "Invalid address: %v" , extractors . Address ( r )) )
95+ response .Message = "No valid update data could be extracted from request"
96+ log .Println (response . Message )
8497 return response
8598 }
8699
87100 // kept in the response for compatibility reasons
88101 response .Domain = strings .Join (response .Domains , "," )
89- response .Address = response .Addresses [0 ].Address
90- response .AddrType = response .Addresses [0 ].AddrType
102+ response .Address = response .Records [0 ].Value
103+ response .AddrType = response .Records [0 ].Type
91104
92105 response .Success = true
93106
0 commit comments