diff --git a/elixir/apps/api/lib/api/gateway/views/resource.ex b/elixir/apps/api/lib/api/gateway/views/resource.ex index 8da5ac2cb..6522933cc 100644 --- a/elixir/apps/api/lib/api/gateway/views/resource.ex +++ b/elixir/apps/api/lib/api/gateway/views/resource.ex @@ -8,7 +8,8 @@ defmodule API.Gateway.Views.Resource do address: resource.address, name: resource.name, ipv4: resource.ipv4, - ipv6: resource.ipv6 + ipv6: resource.ipv6, + filters: Enum.flat_map(resource.filters, &render_filter/1) } end @@ -17,7 +18,37 @@ defmodule API.Gateway.Views.Resource do id: resource.id, type: :cidr, address: resource.address, - name: resource.name + name: resource.name, + filters: Enum.flat_map(resource.filters, &render_filter/1) } end + + def render_filter(%Resources.Resource.Filter{} = filter) do + Enum.map(filter.ports, fn port -> + case String.split(port, "-") do + [port_start, port_end] -> + port_start = port_to_number(port_start) + port_end = port_to_number(port_end) + + %{ + protocol: filter.protocol, + port_range_start: port_start, + port_range_end: port_end + } + + [port] -> + port = port_to_number(port) + + %{ + protocol: filter.protocol, + port_range_start: port, + port_range_end: port + } + end + end) + end + + defp port_to_number(port) do + port |> String.trim() |> String.to_integer() + end end diff --git a/elixir/apps/api/test/api/gateway/channel_test.exs b/elixir/apps/api/test/api/gateway/channel_test.exs index b7f155b9f..03e09c4ec 100644 --- a/elixir/apps/api/test/api/gateway/channel_test.exs +++ b/elixir/apps/api/test/api/gateway/channel_test.exs @@ -89,7 +89,12 @@ defmodule API.Gateway.ChannelTest do name: resource.name, type: :dns, ipv4: resource.ipv4, - ipv6: resource.ipv6 + ipv6: resource.ipv6, + filters: [ + %{protocol: :tcp, port_range_end: 80, port_range_start: 80}, + %{protocol: :tcp, port_range_end: 433, port_range_start: 433}, + %{protocol: :udp, port_range_start: 100, port_range_end: 200} + ] } assert payload.device_id == device.id @@ -173,7 +178,12 @@ defmodule API.Gateway.ChannelTest do name: resource.name, type: :dns, ipv4: resource.ipv4, - ipv6: resource.ipv6 + ipv6: resource.ipv6, + filters: [ + %{protocol: :tcp, port_range_end: 80, port_range_start: 80}, + %{protocol: :tcp, port_range_end: 433, port_range_start: 433}, + %{protocol: :udp, port_range_start: 100, port_range_end: 200} + ] } assert payload.device == %{