From 89b3c215dad34d1b47f0853367376870a426aa74 Mon Sep 17 00:00:00 2001 From: Melvin Date: Thu, 22 Dec 2022 10:49:44 -0700 Subject: [PATCH] Adds Audit Log On Disconnect --- .../channels/device_channel.ex | 9 ++++++++- .../channels/device_channel_test.exs | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/nerves_hub_device/lib/nerves_hub_device_web/channels/device_channel.ex b/apps/nerves_hub_device/lib/nerves_hub_device_web/channels/device_channel.ex index d44970ee4..16de33240 100644 --- a/apps/nerves_hub_device/lib/nerves_hub_device_web/channels/device_channel.ex +++ b/apps/nerves_hub_device/lib/nerves_hub_device_web/channels/device_channel.ex @@ -153,7 +153,14 @@ defmodule NervesHubDeviceWeb.DeviceChannel do def terminate(_reason, %{assigns: %{device: device}}) do if device = Devices.get_device(device.id) do - Devices.update_device(device, %{last_communication: DateTime.utc_now()}) + {:ok, device} = Devices.update_device(device, %{last_communication: DateTime.utc_now()}) + + AuditLogs.audit!(device, device, :update, %{ + description: + "device #{device.identifier} disconnected from the server at #{device.last_communication}", + last_communication: device.last_communication, + status: device.status + }) end :ok diff --git a/apps/nerves_hub_device/test/nerves_hub_device_web/channels/device_channel_test.exs b/apps/nerves_hub_device/test/nerves_hub_device_web/channels/device_channel_test.exs index 67e656d26..1dbb14b81 100644 --- a/apps/nerves_hub_device/test/nerves_hub_device_web/channels/device_channel_test.exs +++ b/apps/nerves_hub_device/test/nerves_hub_device_web/channels/device_channel_test.exs @@ -2,7 +2,7 @@ defmodule NervesHubDeviceWeb.DeviceChannelTest do use NervesHubDeviceWeb.ChannelCase use DefaultMocks alias NervesHubDeviceWeb.{DeviceSocket, DeviceChannel} - alias NervesHubWebCore.Fixtures + alias NervesHubWebCore.{AuditLogs, Fixtures} alias NervesHubDevice.Presence test "basic connection to the channel" do @@ -29,6 +29,23 @@ defmodule NervesHubDeviceWeb.DeviceChannelTest do assert presence["#{device.id}"].firmware_metadata end + test "device disconnected adds audit log" do + user = Fixtures.user_fixture() + {device, firmware, _deployment} = device_fixture(user, %{identifier: "123"}) + %{db_cert: certificate, cert: _cert} = Fixtures.device_certificate_fixture(device) + {:ok, socket} = connect(DeviceSocket, %{}, %{peer_data: %{ssl_cert: certificate.der}}) + {:ok, _, socket} = subscribe_and_join(socket, DeviceChannel, "firmware:#{firmware.uuid}") + + Process.unlink(socket.channel_pid) + + close(socket) + + assert [_, disconnect_log] = AuditLogs.logs_for(device) + + assert disconnect_log.changes["description"] =~ + "device #{device.identifier} disconnected from the server at #{device.last_communication}" + end + test "update_available on connect" do user = Fixtures.user_fixture() {device, firmware, _deployment} = device_fixture(user, %{identifier: "123"})