From d380e17aba93a94f12da55907379b4bc3f931021 Mon Sep 17 00:00:00 2001 From: Richard Hansen Date: Mon, 29 Jul 2024 00:56:55 -0400 Subject: [PATCH] infomaniak: Fix response status processing Previously, `nochg` responses were treated as failures and the logged message for all responses was incorrect (either `undef` or "Unknown reply from Infomaniak"). Background: Hash values are always scalars, so lists of values can only be stored in hashes in arrayref form. The following is legal but does not do what one might expect: my %h = ( a => (1, 2), b => (3, 4), ); The `=>` operator is just a variant of the comma operator, and lists in list context are flattened, so the above is equivalent to: my %h = ('a', 1, 2, 'b', 3, 4); which is equivalent to: my %h = ( a => 1, 2 => 'b', 3 => 4, ); which is obviously not what was intended. --- ChangeLog.md | 2 ++ ddclient.in | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f7b0f67..e7f8358 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -126,6 +126,8 @@ repository history](https://github.com/ddclient/ddclient/commits/master). [#691](https://github.com/ddclient/ddclient/pull/691) * `infomaniak`: Fixed incorrect parsing of server response. [#692](https://github.com/ddclient/ddclient/pull/692) + * `infomaniak`: Fixed incorrect handling of `nochg` responses. + [#723](https://github.com/ddclient/ddclient/pull/723) * `regfishde`: Fixed IPv6 support. [#691](https://github.com/ddclient/ddclient/pull/691) * `easydns`: IPv4 and IPv6 addresses are now updated separately to be diff --git a/ddclient.in b/ddclient.in index 017d808..5e5fa16 100755 --- a/ddclient.in +++ b/ddclient.in @@ -7331,10 +7331,10 @@ sub nic_infomaniak_update { # IP changed => good # No domain name => Validation failed my %statuses = ( - 'good' => (1, "IP set to $ip for $h"), - 'nochg' => (1, "IP already set to $ip for $h"), - 'nohost' => (0, "Bad domain name $h or bad IP $ip"), - 'badauth' => (0, "Bad authentication for $h"), + 'good' => [1, "IP set to $ip for $h"], + 'nochg' => [1, "IP already set to $ip for $h"], + 'nohost' => [0, "Bad domain name $h or bad IP $ip"], + 'badauth' => [0, "Bad authentication for $h"], ); my $reply = geturl( proxy => opt('proxy'), @@ -7346,7 +7346,7 @@ sub nic_infomaniak_update { (my $body = $reply) =~ s/^.*?\n\n//s; my ($status) = split(/ /, $body, 2); my ($ok, $msg) = - $statuses{$status} // (0, "Unknown reply from Infomaniak: $body"); + @{$statuses{$status} // [0, "Unknown reply from Infomaniak: $body"]}; if (!$ok) { failed($msg); next;