diff --git a/apps/fg_http/assets/js/hooks/hooks.js b/apps/fg_http/assets/js/hooks/hooks.js index 96fdafdde..835c8b468 100644 --- a/apps/fg_http/assets/js/hooks/hooks.js +++ b/apps/fg_http/assets/js/hooks/hooks.js @@ -3,6 +3,9 @@ import { qrEncode } from "./qr_code.js" let Hooks = {} Hooks.QrEncode = { + mounted() { + qrEncode() + }, updated() { qrEncode() } diff --git a/apps/fg_http/lib/fg_http/devices.ex b/apps/fg_http/lib/fg_http/devices.ex index eef55d84a..72ec5a3b7 100644 --- a/apps/fg_http/lib/fg_http/devices.ex +++ b/apps/fg_http/lib/fg_http/devices.ex @@ -32,12 +32,10 @@ defmodule FgHttp.Devices do } """ def new_device(attrs \\ %{}) do - device = %Device{ - } + device = %Device{} Map.merge(device, attrs) end - @doc """ Gets a single device. diff --git a/apps/fg_http/lib/fg_http/devices/device.ex b/apps/fg_http/lib/fg_http/devices/device.ex index e37f4d936..ecf4a34c5 100644 --- a/apps/fg_http/lib/fg_http/devices/device.ex +++ b/apps/fg_http/lib/fg_http/devices/device.ex @@ -9,7 +9,6 @@ defmodule FgHttp.Devices.Device do schema "devices" do field :name, :string field :public_key, :string - field :verified_at, :utc_datetime field :user_id, :id has_many :rules, FgHttp.Rules.Rule @@ -20,7 +19,7 @@ defmodule FgHttp.Devices.Device do @doc false def changeset(device, attrs) do device - |> cast(attrs, [:name, :public_key]) - |> validate_required([:name]) + |> cast(attrs, [:user_id, :name, :public_key]) + |> validate_required([:user_id]) end end diff --git a/apps/fg_http/lib/fg_http/sessions.ex b/apps/fg_http/lib/fg_http/sessions.ex index 9f28bebc2..3d1f7d325 100644 --- a/apps/fg_http/lib/fg_http/sessions.ex +++ b/apps/fg_http/lib/fg_http/sessions.ex @@ -102,4 +102,3 @@ defmodule FgHttp.Sessions do Session.changeset(session, %{}) end end - diff --git a/apps/fg_http/lib/fg_http/users.ex b/apps/fg_http/lib/fg_http/users.ex index 9c90b2f6b..5fb224803 100644 --- a/apps/fg_http/lib/fg_http/users.ex +++ b/apps/fg_http/lib/fg_http/users.ex @@ -102,5 +102,3 @@ defmodule FgHttp.Users do User.changeset(user, %{}) end end - - diff --git a/apps/fg_http/lib/fg_http/users/user.ex b/apps/fg_http/lib/fg_http/users/user.ex index 5dbddfe94..c4fe12691 100644 --- a/apps/fg_http/lib/fg_http/users/user.ex +++ b/apps/fg_http/lib/fg_http/users/user.ex @@ -19,7 +19,7 @@ defmodule FgHttp.Users.User do def changeset(user, attrs \\ %{}) do user |> cast(attrs, [:email, :confirmed_at, :password_digest, :last_signed_in_at]) - |> validate_required([:email, :last_signed_in_at]) + |> validate_required([:email]) |> unique_constraint(:email) end end diff --git a/apps/fg_http/lib/fg_http_web/controllers/device_controller.ex b/apps/fg_http/lib/fg_http_web/controllers/device_controller.ex index 3763e3444..6fe3802ba 100644 --- a/apps/fg_http/lib/fg_http_web/controllers/device_controller.ex +++ b/apps/fg_http/lib/fg_http_web/controllers/device_controller.ex @@ -18,6 +18,23 @@ defmodule FgHttpWeb.DeviceController do render(conn, "new.html", changeset: changeset) end + def create(conn, %{"device" => device_params}) do + create_params = %{ + "user_id" => conn.assigns.current_user.id, + "name" => "Auto" + } + + all_params = Map.merge(device_params, create_params) + + case Devices.create_device(all_params) do + {:ok, device} -> + redirect(conn, to: Routes.device_path(conn, :show, device)) + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, "new.html", changeset: changeset) + end + end + def show(conn, %{"id" => id}) do device = Devices.get_device!(id) render(conn, "show.html", device: device) diff --git a/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex b/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex index 8e255ba96..c2cd30e7a 100644 --- a/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex +++ b/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex @@ -4,7 +4,7 @@ defmodule FgHttpWeb.SessionController do """ use FgHttpWeb, :controller - alias FgHttp.{Repo, Users.User, Sessions.Session} + alias FgHttp.{Repo, Sessions.Session, Users.User} plug :redirect_authenticated when action in [:new] plug FgHttpWeb.Plugs.Authenticator when action in [:delete] diff --git a/apps/fg_http/lib/fg_http_web/endpoint.ex b/apps/fg_http/lib/fg_http_web/endpoint.ex index 60eaba97f..f77e492ee 100644 --- a/apps/fg_http/lib/fg_http_web/endpoint.ex +++ b/apps/fg_http/lib/fg_http_web/endpoint.ex @@ -10,8 +10,7 @@ defmodule FgHttpWeb.Endpoint do signing_salt: "Z9eq8iof" ] - socket "/live", Phoenix.LiveView.Socket, - websocket: [connect_info: [session: @session_options]] + socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]] socket "/socket", FgHttpWeb.UserSocket, websocket: true, diff --git a/apps/fg_http/lib/fg_http_web/live/new_device_live.ex b/apps/fg_http/lib/fg_http_web/live/new_device_live.ex index 5e59f69be..8e68ccf47 100644 --- a/apps/fg_http/lib/fg_http_web/live/new_device_live.ex +++ b/apps/fg_http/lib/fg_http_web/live/new_device_live.ex @@ -1,19 +1,23 @@ defmodule FgHttpWeb.NewDeviceLive do - use Phoenix.LiveView + @moduledoc """ + Manages LiveView for New Devices + """ + use Phoenix.LiveView + use Phoenix.HTML alias FgHttp.Devices.Device + alias FgHttpWeb.Router.Helpers, as: Routes def mount(_params, %{"current_user_id" => user_id}, socket) do - if connected?(socket), do: wait_for_device(socket) + if connected?(socket), do: wait_for_device_connect(socket) - device = %Device{user_id: user_id} + device = %Device{id: "1", user_id: user_id} {:ok, assign(socket, :device, device)} end - defp wait_for_device(socket) do - # TODO: pass socket to fg_vpn somehow - IO.inspect(socket) - :timer.send_after(10000, self(), :update) + defp wait_for_device_connect(_socket) do + # XXX: pass socket to fg_vpn somehow + :timer.send_after(3000, self(), :update) end def handle_info(:update, socket) do diff --git a/apps/fg_http/lib/fg_http_web/live/new_device_live.html.leex b/apps/fg_http/lib/fg_http_web/live/new_device_live.html.leex index a36e33766..1bdcfd0a9 100644 --- a/apps/fg_http/lib/fg_http_web/live/new_device_live.html.leex +++ b/apps/fg_http/lib/fg_http_web/live/new_device_live.html.leex @@ -1,5 +1,5 @@
- Add the following to your Wireguard configuration file: + Add the following to your WireGuard™ configuration file:
- When we receive a connection from your device, we'll prompt you verify it here. -
- -- Waiting for device connection... - - <%= if @device.public_key do %> - Connected! Device Public Key: <%= @device.public_key %> - Configure your device -> - <% end %> - -
++ When we receive a connection from your device, we'll prompt you verify it here. +
+ <% else %> ++ Device Public Key: <%= @device.public_key %> +
++ <%# XXX: Use the public key sent by the actual device and not the one here %> + <%= + link("This looks good, verify and continue. ->", + to: Routes.device_path(@socket, :create, "device[public_key]": @device.public_key), + method: :post) + %> +
++ <%= + link("<- Something's wrong. Don't add this device and go back.", + to: Routes.device_path(@socket, :index), + method: :delete) + %> +
+ <% end %> +<%= link "Back", to: Routes.device_path(@conn, :index) %> diff --git a/apps/fg_http/lib/fg_http_web/templates/device/show.html.eex b/apps/fg_http/lib/fg_http_web/templates/device/show.html.eex index 9ca326d51..8db5dae66 100644 --- a/apps/fg_http/lib/fg_http_web/templates/device/show.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/device/show.html.eex @@ -6,11 +6,6 @@ <%= @device.name %> -