Skip to content

Commit

Permalink
Add a button to set a zone as default
Browse files Browse the repository at this point in the history
  • Loading branch information
imobachgs committed Sep 20, 2018
1 parent 573af3a commit 53e7039
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 8 deletions.
4 changes: 2 additions & 2 deletions src/lib/y2firewall/widgets/change_zone_button.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ def initialize(interface)
@interface = interface
end

# @see seeAbstractWidget
# @macro seeAbstractWidget
def label
_("Change Zone")
end

# @see seeAbstractWidget
# @macro seeAbstractWidget
def handle
return nil unless interface
result = Dialogs::ChangeZone.run(interface)
Expand Down
8 changes: 7 additions & 1 deletion src/lib/y2firewall/widgets/pages/zones.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
require "cwm/page"
require "y2firewall/firewalld"
require "y2firewall/widgets/zones_table"
require "y2firewall/widgets/default_zone_button"

module Y2Firewall
module Widgets
Expand All @@ -47,12 +48,17 @@ def contents
return @contents if @contents
@contents = VBox(
Left(Heading(_("Zones"))),
ZonesTable.new(firewall.zones)
ZonesTable.new(firewall.zones, default_zone_button),
firewall.zones.empty? ? Empty() : default_zone_button
)
end

private

def default_zone_button
@default_zone_button ||= DefaultZoneButton.new(firewall.zones.first)
end

def firewall
Y2Firewall::Firewalld.instance
end
Expand Down
58 changes: 55 additions & 3 deletions src/lib/y2firewall/widgets/zones_table.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,74 @@ class ZonesTable < ::CWM::Table
# Constructor
#
# @param zones [Array<Y2Firewall::Firewalld::Zone>] Zones
def initialize(zones)
# @param default_zone_button [Y2Firewall::Widgets::DefaultZoneButton] Button to change
# the default zone
def initialize(zones, default_zone_button)
textdomain "firewall"
@zones = zones
@default_zone_button = default_zone_button
end

# @macro seeAbstractWidget
def opt
[:notify, :immediate]
end

# @macro seeAbstractWidget
def init
zone = Y2Firewall::UIState.instance.row_id
self.value = zone if zone && zones.map(&:name).include?(zone.to_s)
default_zone_button.zone = selected_zone
end

# @see CWM::Table#header
def header
[
_("Name"),
_("Interfaces")
_("Interfaces"),
_("Default")
]
end

# @see CWM::Table#items
def items
zones.map { |z| [z.name.to_sym, z.name, z.interfaces.join(", ")] }
zones.map do |zone|
[
zone.name.to_sym,
zone.name,
zone.interfaces.join(", "),
zone.name == firewall.default_zone ? Yast::UI.Glyph(:CheckMark) : ""
]
end
end

# @macro seeAbstractWidget
def handle(event)
return nil unless my_event?(event) && event["EventReason"] == "SelectionChanged"
UIState.instance.select_row(value)
default_zone_button.zone = selected_zone
nil
end

# Returns the selected interface
#
# @return [Y2Firewall::Firewall::Interface] Interface
def selected_zone
zones.find { |z| z.name == value.to_s }
end

private

# @return [Y2Firewalld::Widgets::DefaultZoneButton] Button to set a zone as 'default'
attr_reader :default_zone_button

# Return the current `Y2Firewall::Firewalld` instance
#
# This is just a convenience method.
#
# @return [Y2Firewall::Firewalld]
def firewall
Y2Firewall::Firewalld.instance
end
end
end
Expand Down
32 changes: 30 additions & 2 deletions test/lib/y2firewall/widgets/zones_table_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,38 @@
require_relative "../../../test_helper.rb"
require "cwm/rspec"
require "y2firewall/widgets/zones_table"
require "y2firewall/widgets/default_zone_button"
require "y2firewall/firewalld/interface"

describe Y2Firewall::Widgets::ZonesTable do
let(:z1) { double("fake zone", name: "zoe", interfaces: []) }
subject { described_class.new([z1]) }
subject(:widget) { described_class.new([public_zone, dmz_zone], default_zone_button) }

let(:default_zone_button) do
instance_double(Y2Firewall::Widgets::DefaultZoneButton).as_null_object
end

let(:public_zone) do
instance_double(Y2Firewall::Firewalld::Zone, name: "public", interfaces: ["eth0", "eth1"])
end

let(:dmz_zone) do
instance_double(Y2Firewall::Firewalld::Zone, name: "dmz", interfaces: [])
end

before do
allow(Y2Firewall::Firewalld.instance).to receive(:default_zone).and_return(public_zone.name)
end

include_examples "CWM::Table"

describe "#items" do
it "returns the list of zones" do
expect(widget.items).to eq(
[
[:public, "public", "eth0, eth1", Yast::UI.Glyph(:CheckMark)],
[:dmz, "dmz", "", ""]
]
)
end
end
end

0 comments on commit 53e7039

Please sign in to comment.