Device creation works

This commit is contained in:
Jamil Bou Kheir
2020-05-13 00:39:51 -05:00
parent 0669726769
commit ea127c4ca1
10 changed files with 81 additions and 24 deletions

View File

@@ -3,6 +3,9 @@ import { qrEncode } from "./qr_code.js"
let Hooks = {}
Hooks.QrEncode = {
mounted() {
qrEncode()
},
updated() {
qrEncode()
}

View File

@@ -90,6 +90,19 @@ defmodule FgHttp.Devices do
|> Repo.update()
end
@doc """
Verifies a Device.
## Examples
iex> verify!(device.id)
{:ok, %Device{}}
"""
def verify(id) do
get_device!(id)
|> update_device(%{verified_at: DateTime.utc_now})
end
@doc """
Deletes a device.

View File

@@ -20,7 +20,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, :verified_at, :name, :public_key])
|> validate_required([:user_id])
end
end

View File

@@ -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

View File

@@ -18,6 +18,25 @@ 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,
"verified_at" => DateTime.utc_now,
"name" => "Auto"
}
all_params = Map.merge(device_params, create_params)
IO.puts "Create device with params: "
IO.inspect all_params
case Devices.create_device(all_params) do
{:ok, device} ->
IO.inspect(device)
redirect(conn, to: Routes.device_path(conn, :show, device))
{:error, %Ecto.Changeset{} = changeset} ->
IO.inspect(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)

View File

@@ -1,19 +1,23 @@
defmodule FgHttpWeb.NewDeviceLive do
use Phoenix.LiveView
use Phoenix.HTML
alias FgHttpWeb.Router.Helpers, as: Routes
alias FgHttp.Devices.Device
def mount(_params, %{"current_user_id" => user_id}, socket) do
def mount(_params, %{}, socket) do
user_id = "1"
IO.inspect(socket)
if connected?(socket), do: wait_for_device(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)
:timer.send_after(3000, self(), :update)
end
def handle_info(:update, socket) do

View File

@@ -1,5 +1,5 @@
<p>
Add the following to your Wireguard configuration file:
Add the following to your WireGuard configuration file:
</p>
<div class="cf">
@@ -18,16 +18,33 @@ Endpoint = <%= Application.fetch_env!(:fg_http, :vpn_endpoint) %>
</div>
</div>
<p>
When we receive a connection from your device, we'll prompt you verify it here.
</p>
<p>
Waiting for device connection...
<span phx-hook="QrEncode">
<%= if @device.public_key do %>
Connected! Device Public Key: <%= @device.public_key %>
<a href="#">Configure your device -></a>
<% end %>
</span>
</p>
<div phx-hook="QrEncode">
<%= unless @device.public_key do %>
<h4>
Waiting for device connection...
</h4>
<p>
When we receive a connection from your device, we'll prompt you verify it here.
</p>
<% else %>
<h4>Connected!</h4>
<p>
Device Public Key: <%= @device.public_key %>
</p>
<p>
<%# 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)
%>
</p>
<p>
<%=
link("<- Something's wrong. Don't add this device and go back.",
to: Routes.device_path(@socket, :index),
method: :delete)
%>
</p>
<% end %>
</div>

View File

@@ -4,12 +4,13 @@ defmodule FgHttpWeb.Plugs.Authenticator do
"""
import Plug.Conn
alias FgHttp.Users.User
alias FgHttp.{Users.User, Repo}
def init(default), do: default
def call(conn, _default) do
user = %User{id: 1, email: "dev_user@fireguard.network"}
user = Repo.one(User)
assign(conn, :current_user, user)
end
end

View File

@@ -23,7 +23,7 @@ defmodule FgHttpWeb.Router do
resources "/user", UserController, singleton: true, only: [:show, :edit, :update, :delete]
resources "/users", UserController, only: [:new, :create]
resources "/devices", DeviceController, except: [:create] do
resources "/devices", DeviceController do
resources "/rules", RuleController, only: [:new, :index, :create]
end

View File

@@ -1,6 +1,6 @@
<h1>New Device</h1>
<%= live_render(@conn, FgHttpWeb.NewDeviceLive, session: %{"current_user_id" => 1}) %>
<%= live_render(@conn, FgHttpWeb.NewDeviceLive) %>
<p>
<%= link "Back", to: Routes.device_path(@conn, :index) %>