From 200d817047659b72bbf06e6b2da968956ddcfc3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Alejandro=20Anderssen=20Gonz=C3=A1lez?= Date: Wed, 23 Dec 2020 08:52:47 +0000 Subject: [PATCH 1/3] Improve additional IP addresses validation --- .../y2network/dialogs/additional_address.rb | 34 ++++++++++++++++--- .../dialogs/additional_address_test.rb | 23 +++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/lib/y2network/dialogs/additional_address.rb b/src/lib/y2network/dialogs/additional_address.rb index cfd91612a..9e8d9c7a1 100644 --- a/src/lib/y2network/dialogs/additional_address.rb +++ b/src/lib/y2network/dialogs/additional_address.rb @@ -47,18 +47,42 @@ def contents end def run - ret = super - return ret if ret != :ok || @settings.subnet_prefix.start_with?("/") + ret = nil - netmask = @settings.subnet_prefix - prefix = IPAddr.new("#{netmask}/#{netmask}").prefix - @settings.subnet_prefix = "/#{prefix}" + loop do + ret = super + break if ret != :ok + + @settings.subnet_prefix = subnet_prefix_for?(@settings.subnet_prefix) + + begin + IPAddr.new("#{@settings.ip_address}#{@settings.subnet_prefix}") + break + rescue IPAddr::InvalidAddressError + Yast::Report.Error( + format(_("Invalid Address %s%s"), @settings.ip_address, @settings.subnet_prefix) + ) + end + end ret end private + def subnet_prefix_for?(value) + return value if value.start_with?("/") + + prefix = + if value.size < 3 || value =~ /^\d{3}$/ + value.to_i + else + IPAddr.new("#{value}/#{value}").prefix + end + + "/#{prefix}" + end + def buttons [ok_button, cancel_button] end diff --git a/test/y2network/dialogs/additional_address_test.rb b/test/y2network/dialogs/additional_address_test.rb index 399eb879b..c1afb1ba3 100644 --- a/test/y2network/dialogs/additional_address_test.rb +++ b/test/y2network/dialogs/additional_address_test.rb @@ -45,6 +45,21 @@ context "when the modifications are applied" do let(:ret_code) { :ok } + before do + ip_settings.ip_address = "192.168.20.200" + ip_settings.subnet_prefix = "/24" + end + + context "and the address is not valid" do + it "reports a validation error" do + ip_settings.subnet_prefix = "/64" + allow(subject).to receive(:cwm_show).and_return(:ok, :cancel) + expect(Yast::Popup).to receive(:Error).with(/Invalid/) + + subject.run + end + end + context "and the modified IP address settings uses a netmask" do it "converts the netmask to its equivalent prefix length" do ip_settings.subnet_prefix = "255.255.255.0" @@ -52,6 +67,14 @@ .to change { ip_settings.subnet_prefix }.from("255.255.255.0").to("/24") end end + + context "and the modified IP address settings uses a prefix length without '/'" do + it "sets the prefix lenght correctly" do + ip_settings.subnet_prefix = "32" + expect { subject.run } + .to change { ip_settings.subnet_prefix }.from("32").to("/32") + end + end end end end From 2e6e87ec27041fc000a9ea04aa5546f7846d0285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Alejandro=20Anderssen=20Gonz=C3=A1lez?= Date: Wed, 23 Dec 2020 09:43:51 +0000 Subject: [PATCH 2/3] Adapt changelog --- package/yast2-network.changes | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package/yast2-network.changes b/package/yast2-network.changes index 73758ff4b..9291e5d7d 100644 --- a/package/yast2-network.changes +++ b/package/yast2-network.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Dec 23 09:21:16 UTC 2020 - Knut Anderssen + +- Improve additional addresses validation (bsc#1174766) +- 4.3.37 + ------------------------------------------------------------------- Mon Dec 21 13:56:55 UTC 2020 - Knut Anderssen From 0d65349807e6d9fa93fbd386cc18b2078d5c4a1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Alejandro=20Anderssen=20Gonz=C3=A1lez?= Date: Wed, 23 Dec 2020 10:05:39 +0000 Subject: [PATCH 3/3] Changes based on CR --- src/lib/y2network/dialogs/additional_address.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/y2network/dialogs/additional_address.rb b/src/lib/y2network/dialogs/additional_address.rb index 9e8d9c7a1..1cb952c47 100644 --- a/src/lib/y2network/dialogs/additional_address.rb +++ b/src/lib/y2network/dialogs/additional_address.rb @@ -53,7 +53,7 @@ def run ret = super break if ret != :ok - @settings.subnet_prefix = subnet_prefix_for?(@settings.subnet_prefix) + @settings.subnet_prefix = subnet_prefix_for(@settings.subnet_prefix) begin IPAddr.new("#{@settings.ip_address}#{@settings.subnet_prefix}") @@ -70,7 +70,7 @@ def run private - def subnet_prefix_for?(value) + def subnet_prefix_for(value) return value if value.start_with?("/") prefix =