Merge pull request #306 from firezone/fix-empty-address-crash

Fix crash from empty address
This commit is contained in:
Jamil
2021-10-19 14:04:49 -07:00
committed by GitHub
3 changed files with 60 additions and 4 deletions

View File

@@ -24,13 +24,13 @@ defmodule FzHttp.Devices do
def create_device(attrs \\ %{}) do
%Device{}
|> Device.changeset(attrs)
|> Device.create_changeset(attrs)
|> Repo.insert()
end
def update_device(%Device{} = device, attrs) do
device
|> Device.changeset(attrs)
|> Device.update_changeset(attrs)
|> Repo.update()
end
@@ -39,7 +39,7 @@ defmodule FzHttp.Devices do
end
def change_device(%Device{} = device) do
Device.changeset(device, %{})
Device.update_changeset(device, %{})
end
def rand_name do

View File

@@ -30,7 +30,7 @@ defmodule FzHttp.Devices.Device do
timestamps(type: :utc_datetime_usec)
end
def changeset(device, attrs) do
def create_changeset(device, attrs) do
device
|> cast(attrs, [
:allowed_ips,
@@ -43,6 +43,28 @@ defmodule FzHttp.Devices.Device do
:name,
:public_key
])
|> shared_changeset()
end
def update_changeset(device, attrs) do
device
|> cast(attrs, [
:allowed_ips,
:dns_servers,
:remote_ip,
:address,
:server_public_key,
:private_key,
:user_id,
:name,
:public_key
])
|> shared_changeset()
|> validate_required(:address)
end
defp shared_changeset(changeset) do
changeset
|> validate_required([
:user_id,
:name,

View File

@@ -71,6 +71,18 @@ defmodule FzHttp.DevicesTest do
allowed_ips: "1.1.1.1, 11, foobar"
}
@empty_address %{
address: ""
}
@low_address %{
address: "1"
}
@high_address %{
address: "255"
}
test "updates device", %{device: device} do
{:ok, test_device} = Devices.update_device(device, @attrs)
assert @attrs = test_device
@@ -90,6 +102,28 @@ defmodule FzHttp.DevicesTest do
}
end
test "prevents updating device with empty address", %{device: device} do
{:error, changeset} = Devices.update_device(device, @empty_address)
assert changeset.errors[:address] == {"can't be blank", [{:validation, :required}]}
end
test "prevents updating device with address too low", %{device: device} do
{:error, changeset} = Devices.update_device(device, @low_address)
assert changeset.errors[:address] ==
{"must be greater than or equal to %{number}",
[{:validation, :number}, {:kind, :greater_than_or_equal_to}, {:number, 2}]}
end
test "prevents updating device with address too high", %{device: device} do
{:error, changeset} = Devices.update_device(device, @high_address)
assert changeset.errors[:address] ==
{"must be less than or equal to %{number}",
[{:validation, :number}, {:kind, :less_than_or_equal_to}, {:number, 254}]}
end
test "updates device with valid allowed_ips", %{device: device} do
{:ok, test_device} = Devices.update_device(device, @valid_allowed_ips_attrs)
assert @valid_allowed_ips_attrs = test_device