Skip to content

Commit 4ee6806

Browse files
committed
Merge commit '60ba35e' into develop
2 parents 208612b + 60ba35e commit 4ee6806

File tree

3 files changed

+71
-53
lines changed

3 files changed

+71
-53
lines changed

rest-api/main.go

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,27 +83,32 @@ func update(w http.ResponseWriter, r *http.Request) {
8383
func updateDomains(r *http.Request, response *WebserviceResponse, onError func()) bool {
8484
extractor := r.Context().Value(extractorKey).(requestDataExtractor)
8585

86-
for _, domain := range response.Domains {
87-
recordUpdate := RecordUpdateRequest{
88-
domain: domain,
89-
ipaddr: response.Address,
90-
addrType: response.AddrType,
91-
ddnskey: extractor.DdnsKey(r),
92-
}
93-
result := recordUpdate.updateRecord()
94-
95-
if result != "" {
96-
response.Success = false
97-
response.Message = result
98-
99-
onError()
100-
return false
86+
for _, address := range response.Addresses {
87+
for _, domain := range response.Domains {
88+
recordUpdate := RecordUpdateRequest{
89+
domain: domain,
90+
ipaddr: address.Address,
91+
addrType: address.AddrType,
92+
ddnskey: extractor.DdnsKey(r),
93+
}
94+
result := recordUpdate.updateRecord()
95+
96+
if result != "" {
97+
response.Success = false
98+
response.Message = result
99+
100+
onError()
101+
return false
102+
}
103+
104+
response.Success = true
105+
if len(response.Message) == 0 {
106+
response.Message += "; "
107+
}
108+
response.Message += fmt.Sprintf("Updated %s record for %s to IP address %s", address.AddrType, response.Domain, address.Address)
101109
}
102110
}
103111

104-
response.Success = true
105-
response.Message = fmt.Sprintf("Updated %s record for %s to IP address %s", response.AddrType, response.Domain, response.Address)
106-
107112
return true
108113
}
109114

rest-api/request_handler.go

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,40 @@ import (
1313
)
1414

1515
type WebserviceResponse struct {
16-
Success bool
17-
Message string
18-
Domain string
19-
Domains []string
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 {
2026
Address string
2127
AddrType string
2228
}
2329

24-
func addrType(address string) string {
30+
func ParseAddress(address string) (Address, error) {
2531
if ipparser.ValidIP4(address) {
26-
return "A"
32+
return Address{Address: address, AddrType: "A"}, nil
2733
} else if ipparser.ValidIP6(address) {
28-
return "AAAA"
34+
return Address{Address: address, AddrType: "AAAA"}, nil
2935
}
30-
return ""
36+
return Address{}, fmt.Errorf("Invalid ip address: %s", address)
3137
}
3238

3339
func BuildWebserviceResponseFromRequest(r *http.Request, appConfig *Config, extractors requestDataExtractor) WebserviceResponse {
3440
response := WebserviceResponse{}
3541

3642
sharedSecret := extractors.Secret(r)
3743
response.Domains = strings.Split(extractors.Domain(r), ",")
38-
response.Address = extractors.Address(r)
44+
for _, address := range strings.Split(extractors.Address(r), ",") {
45+
var parsedAddress, error = ParseAddress(address)
46+
if error == nil {
47+
response.Addresses = append(response.Addresses, parsedAddress)
48+
}
49+
}
3950

4051
if sharedSecret != appConfig.SharedSecret {
4152
log.Println(fmt.Sprintf("Invalid shared secret: %s", sharedSecret))
@@ -53,30 +64,32 @@ func BuildWebserviceResponseFromRequest(r *http.Request, appConfig *Config, extr
5364
}
5465
}
5566

56-
// kept in the response for compatibility reasons
57-
response.Domain = strings.Join(response.Domains, ",")
58-
59-
response.AddrType = addrType(response.Address)
60-
if response.AddrType == "" { // address type unknown. Fall back to get address by request
67+
if len(response.Addresses) == 0 {
6168
ip, err := getUserIP(r)
6269
if ip == "" {
6370
ip, _, err = net.SplitHostPort(r.RemoteAddr)
6471
}
6572

66-
if err != nil {
67-
ip = "" // will fail later
73+
if err == nil {
74+
parsedAddress, err := ParseAddress(ip)
75+
if err == nil {
76+
response.Addresses = append(response.Addresses, parsedAddress)
77+
}
6878
}
69-
response.Address = ip
70-
response.AddrType = addrType(response.Address)
7179
}
7280

73-
if response.AddrType == "" {
81+
if len(response.Addresses) == 0 {
7482
response.Success = false
75-
response.Message = fmt.Sprintf("%s is neither a valid IPv4 nor IPv6 address", response.Address)
76-
log.Println(fmt.Sprintf("Invalid address: %s", response.Address))
83+
response.Message = fmt.Sprintf("%v is neither a valid IPv4 nor IPv6 address", response.Addresses)
84+
log.Println(fmt.Sprintf("Invalid address: %v", response.Addresses))
7785
return response
7886
}
7987

88+
// kept in the response for compatibility reasons
89+
response.Domain = strings.Join(response.Domains, ",")
90+
response.Address = response.Addresses[0].Address
91+
response.AddrType = response.Addresses[0].AddrType
92+
8093
response.Success = true
8194

8295
return response

rest-api/request_handler_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ func TestBuildWebserviceResponseFromRequestToReturnValidObject(t *testing.T) {
2424
t.Fatalf("Expected WebserviceResponse.Domain to be foo")
2525
}
2626

27-
if result.Address != "1.2.3.4" {
27+
if result.Addresses[0].Address != "1.2.3.4" {
2828
t.Fatalf("Expected WebserviceResponse.Address to be 1.2.3.4")
2929
}
3030

31-
if result.AddrType != "A" {
31+
if result.Addresses[0].AddrType != "A" {
3232
t.Fatalf("Expected WebserviceResponse.AddrType to be A")
3333
}
3434
}
@@ -49,11 +49,11 @@ func TestBuildWebserviceResponseFromRequestWithXRealIPHeaderToReturnValidObject(
4949
t.Fatalf("Expected WebserviceResponse.Domain to be foo")
5050
}
5151

52-
if result.Address != "1.2.3.4" {
52+
if result.Addresses[0].Address != "1.2.3.4" {
5353
t.Fatalf("Expected WebserviceResponse.Address to be 1.2.3.4")
5454
}
5555

56-
if result.AddrType != "A" {
56+
if result.Addresses[0].AddrType != "A" {
5757
t.Fatalf("Expected WebserviceResponse.AddrType to be A")
5858
}
5959
}
@@ -71,15 +71,15 @@ func TestBuildWebserviceResponseFromRequestWithXForwardedForHeaderToReturnValidO
7171
}
7272

7373
if result.Domain != "foo" {
74-
t.Fatalf("Expected WebserviceResponse.Domain to be foo")
74+
t.Fatalf("Expected WebserviceResponse.Domain to be foo but was %s", result.Domain)
7575
}
7676

77-
if result.Address != "1.2.3.4" {
78-
t.Fatalf("Expected WebserviceResponse.Address to be 1.2.3.4")
77+
if result.Addresses[0].Address != "1.2.3.4" {
78+
t.Fatalf("Expected WebserviceResponse.Address to be 1.2.3.4 but was %s", result.Addresses[0].Address)
7979
}
8080

81-
if result.AddrType != "A" {
82-
t.Fatalf("Expected WebserviceResponse.AddrType to be A")
81+
if result.Addresses[0].AddrType != "A" {
82+
t.Fatalf("Expected WebserviceResponse.AddrType to be A but was %s", result.Addresses[0].AddrType)
8383
}
8484
}
8585

@@ -193,15 +193,15 @@ func TestBuildWebserviceResponseFromRequestToReturnValidObjectWithDynExtractor(t
193193
}
194194

195195
if result.Domain != "foo" {
196-
t.Fatalf("Expected WebserviceResponse.Domain to be foo")
196+
t.Fatalf("Expected WebserviceResponse.Domain to be foo but was %s", result.Domain)
197197
}
198198

199-
if result.Address != "1.2.3.4" {
200-
t.Fatalf("Expected WebserviceResponse.Address to be 1.2.3.4")
199+
if result.Addresses[0].Address != "1.2.3.4" {
200+
t.Fatalf("Expected WebserviceResponse.Address to be 1.2.3.4 but was %s", result.Addresses[0].Address)
201201
}
202202

203-
if result.AddrType != "A" {
204-
t.Fatalf("Expected WebserviceResponse.AddrType to be A")
203+
if result.Addresses[0].AddrType != "A" {
204+
t.Fatalf("Expected WebserviceResponse.AddrType to be A but was %s", result.Addresses[0].AddrType)
205205
}
206206
}
207207

0 commit comments

Comments
 (0)