about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-08-16 18:17:06 +0200
committerMelonai <einebeere@gmail.com>2021-08-16 18:17:06 +0200
commita7af012b92f0dfd90cc3eb570e03144016646180 (patch)
treef73d402f1d74459195967928346d26ad195a2a73
parent877f2aa4cc5890214f0c58813c4b498f8be1236d (diff)
downloadrook-a7af012b92f0dfd90cc3eb570e03144016646180.tar.zst
rook-a7af012b92f0dfd90cc3eb570e03144016646180.zip
Ability to pass request info through pipeline
-rw-r--r--assets/src/components/share/Request.svelte6
-rw-r--r--assets/src/models/incoming_request.ts16
-rw-r--r--assets/src/network/channel/messages/messages.ts3
-rw-r--r--assets/src/network/channel/share_connection.ts7
-rw-r--r--assets/src/network/channel/socket.ts1
-rw-r--r--lib/rook/request/actions.ex4
-rw-r--r--lib/rook/request/request.ex4
-rw-r--r--lib/rook/share/events.ex4
-rw-r--r--lib/rook/share/share.ex4
-rw-r--r--lib/rook/utils/identity.ex19
-rw-r--r--lib/rook_web/channels/request_channel.ex12
-rw-r--r--lib/rook_web/channels/user_socket.ex5
-rw-r--r--lib/rook_web/endpoint.ex2
13 files changed, 69 insertions, 18 deletions
diff --git a/assets/src/components/share/Request.svelte b/assets/src/components/share/Request.svelte
index a5e77e7..e554bfe 100644
--- a/assets/src/components/share/Request.svelte
+++ b/assets/src/components/share/Request.svelte
@@ -36,9 +36,9 @@
     {/if}
 
     <li>Requested at {time}</li>
-    <li class="ip">{request.info.token}</li>
-    <li>Trusowo, Russia</li>
-    <li>Firefox 89</li>
+    <li class="ip">{request.info.ip}</li>
+    <li>{request.info.location}</li>
+    <li>{request.info.client}</li>
 
     {#if $state === IncomingRequestState.IN_FLIGHT}
         Transferring...
diff --git a/assets/src/models/incoming_request.ts b/assets/src/models/incoming_request.ts
index 8a8d7fb..4af1e02 100644
--- a/assets/src/models/incoming_request.ts
+++ b/assets/src/models/incoming_request.ts
@@ -18,6 +18,11 @@ export enum IncomingRequestState {
 // Identifying information about the requestor
 export type IncomingRequestInfo = {
     token: string;
+
+    ip: string;
+    location: string;
+    client: string;
+
     receivedAt: Date;
 };
 
@@ -31,9 +36,18 @@ export type IncomingRequest = {
 };
 
 // Create a model for a new incoming request
-export function newIncomingRequest(token: string): IncomingRequest {
+export function newIncomingRequest(
+    token: string,
+    ip: string,
+    location: string,
+    client: string
+): IncomingRequest {
     const info = {
         token,
+        ip,
+        location,
+        client,
+
         receivedAt: new Date(),
     };
 
diff --git a/assets/src/network/channel/messages/messages.ts b/assets/src/network/channel/messages/messages.ts
index 67f70ac..24380ae 100644
--- a/assets/src/network/channel/messages/messages.ts
+++ b/assets/src/network/channel/messages/messages.ts
@@ -17,6 +17,9 @@ export type ShareMessage =
 
 export type NewRequestMessage = {
     event_name: "new_request";
+    ip: string;
+    location: string;
+    client: string;
     token: string;
 };
 
diff --git a/assets/src/network/channel/share_connection.ts b/assets/src/network/channel/share_connection.ts
index 1bb4f14..bdc2b8e 100644
--- a/assets/src/network/channel/share_connection.ts
+++ b/assets/src/network/channel/share_connection.ts
@@ -35,7 +35,12 @@ export async function startShareConnection() {
 function onNewRequest(message: NewRequestMessage) {
     const token = message.token;
 
-    const request = newIncomingRequest(token);
+    const request = newIncomingRequest(
+        token,
+        message.ip,
+        message.location,
+        message.client
+    );
     requests.addRequest(request);
 
     const unregister = onWithToken(
diff --git a/assets/src/network/channel/socket.ts b/assets/src/network/channel/socket.ts
index 7d14842..9d95577 100644
--- a/assets/src/network/channel/socket.ts
+++ b/assets/src/network/channel/socket.ts
@@ -39,6 +39,7 @@ export function joinRequestChannel(
 ): Promise<Channel> {
     return joinChannel(socket, `request:${request_token}`, {
         share: share_token,
+        user_agent: navigator.userAgent,
     });
 }
 
diff --git a/lib/rook/request/actions.ex b/lib/rook/request/actions.ex
index 7c6a5d8..f68005b 100644
--- a/lib/rook/request/actions.ex
+++ b/lib/rook/request/actions.ex
@@ -4,8 +4,8 @@ defmodule Rook.Request.Actions do
   Should only be called from other Request modules.
   """
 
-  def start(token, share_token) do
-    GenServer.start(Rook.Request, [token, share_token, self()], name: via(token))
+  def start(token, share_token, info) do
+    GenServer.start(Rook.Request, [token, share_token, info, self()], name: via(token))
   end
 
   def accept_share(token, description) do
diff --git a/lib/rook/request/request.ex b/lib/rook/request/request.ex
index dabfd68..5f33057 100644
--- a/lib/rook/request/request.ex
+++ b/lib/rook/request/request.ex
@@ -31,10 +31,10 @@ defmodule Rook.Request do
 
   ## Server
 
-  def init([token, share_token, channel_pid]) do
+  def init([token, share_token, info, channel_pid]) do
     Process.flag(:trap_exit, true)
     Process.link(channel_pid)
-    Rook.Share.Events.new_request(share_token, token)
+    Rook.Share.Events.new_request(share_token, token, info)
     {:ok, %State{token: token, share_token: share_token, channel_pid: channel_pid}}
   end
 
diff --git a/lib/rook/share/events.ex b/lib/rook/share/events.ex
index 4ed8619..78d349f 100644
--- a/lib/rook/share/events.ex
+++ b/lib/rook/share/events.ex
@@ -4,8 +4,8 @@ defmodule Rook.Share.Events do
   Usually called by Request modules.
   """
 
-  def new_request(share_token, request_token) do
-    cast(share_token, {:new_request, request_token})
+  def new_request(share_token, request_token, info) do
+    cast(share_token, {:new_request, request_token, info})
   end
 
   def share_accepted(share_token, request_token, description) do
diff --git a/lib/rook/share/share.ex b/lib/rook/share/share.ex
index e1760c7..c825e59 100644
--- a/lib/rook/share/share.ex
+++ b/lib/rook/share/share.ex
@@ -37,10 +37,10 @@ defmodule Rook.Share do
     {:ok, %State{token: token, channel_pid: channel_pid}}
   end
 
-  def handle_cast({:new_request, request_token}, state) do
+  def handle_cast({:new_request, request_token, info}, state) do
     # TODO: Check whether request exists.
     %State{token: token, requests: requests} = state
-    notify(token, "new_request", %{token: request_token})
+    notify(token, "new_request", Map.put(info, :token, request_token))
     {:noreply, %{state | requests: [request_token | requests]}}
   end
 
diff --git a/lib/rook/utils/identity.ex b/lib/rook/utils/identity.ex
new file mode 100644
index 0000000..82fb7d9
--- /dev/null
+++ b/lib/rook/utils/identity.ex
@@ -0,0 +1,19 @@
+defmodule Rook.Identity do
+  def get_ip_from_connect_info(%{peer_data: %{address: ip}, x_headers: _x_headers}) do
+    ip_to_string(ip)
+  end
+
+  def get_location_from_ip(_ip) do
+    # TODO: Try to get location from IP
+    "Unknown Location"
+  end
+
+  def get_client_from_user_agent(user_agent) do
+    # TODO: Parse user agent to get client
+    "Unknown Client"
+  end
+
+  defp ip_to_string(ip) do
+    ip |> :inet.ntoa() |> to_string()
+  end
+end
diff --git a/lib/rook_web/channels/request_channel.ex b/lib/rook_web/channels/request_channel.ex
index cc84b0f..9773d30 100644
--- a/lib/rook_web/channels/request_channel.ex
+++ b/lib/rook_web/channels/request_channel.ex
@@ -1,10 +1,18 @@
 defmodule RookWeb.RequestChannel do
   use RookWeb, :channel
 
-  def join("request:" <> token, %{"share" => share_token}, socket) do
+  def join("request:" <> token, %{"share" => share_token, "user_agent" => user_agent}, socket) do
     if Rook.Token.match?(token, socket) do
       if Rook.Share.exists?(share_token) do
-        Rook.Request.Actions.start(token, share_token)
+        ip = socket.assigns[:ip]
+
+        info = %{
+          ip: ip,
+          location: Rook.Identity.get_location_from_ip(ip),
+          client: Rook.Identity.get_client_from_user_agent(user_agent)
+        }
+
+        Rook.Request.Actions.start(token, share_token, info)
         {:ok, socket}
       else
         {:error, %{reason: "No such share exists."}}
diff --git a/lib/rook_web/channels/user_socket.ex b/lib/rook_web/channels/user_socket.ex
index d6ce9c4..1a4dbd0 100644
--- a/lib/rook_web/channels/user_socket.ex
+++ b/lib/rook_web/channels/user_socket.ex
@@ -18,9 +18,10 @@ defmodule RookWeb.UserSocket do
   # See `Phoenix.Token` documentation for examples in
   # performing token verification on connect.
   @impl true
-  def connect(_params, socket, _connect_info) do
+  def connect(_params, socket, connect_info) do
     token = Rook.Token.token()
-    {:ok, assign(socket, :token, token)}
+    ip = Rook.Identity.get_ip_from_connect_info(connect_info)
+    {:ok, assign(socket, token: token, ip: ip)}
   end
 
   # Socket id's are topics that allow you to identify all sockets for a given user:
diff --git a/lib/rook_web/endpoint.ex b/lib/rook_web/endpoint.ex
index dd847f7..31c9790 100644
--- a/lib/rook_web/endpoint.ex
+++ b/lib/rook_web/endpoint.ex
@@ -11,7 +11,7 @@ defmodule RookWeb.Endpoint do
   ]
 
   socket "/socket", RookWeb.UserSocket,
-    websocket: true,
+    websocket: [connect_info: [:peer_data, :x_headers]],
     longpoll: false
 
   # Serve at "/" the static files from "priv/static" directory.