diff options
| author | Melonai <einebeere@gmail.com> | 2021-08-16 18:17:06 +0200 |
|---|---|---|
| committer | Melonai <einebeere@gmail.com> | 2021-08-16 18:17:06 +0200 |
| commit | a7af012b92f0dfd90cc3eb570e03144016646180 (patch) | |
| tree | f73d402f1d74459195967928346d26ad195a2a73 | |
| parent | 877f2aa4cc5890214f0c58813c4b498f8be1236d (diff) | |
| download | rook-a7af012b92f0dfd90cc3eb570e03144016646180.tar.zst rook-a7af012b92f0dfd90cc3eb570e03144016646180.zip | |
Ability to pass request info through pipeline
| -rw-r--r-- | assets/src/components/share/Request.svelte | 6 | ||||
| -rw-r--r-- | assets/src/models/incoming_request.ts | 16 | ||||
| -rw-r--r-- | assets/src/network/channel/messages/messages.ts | 3 | ||||
| -rw-r--r-- | assets/src/network/channel/share_connection.ts | 7 | ||||
| -rw-r--r-- | assets/src/network/channel/socket.ts | 1 | ||||
| -rw-r--r-- | lib/rook/request/actions.ex | 4 | ||||
| -rw-r--r-- | lib/rook/request/request.ex | 4 | ||||
| -rw-r--r-- | lib/rook/share/events.ex | 4 | ||||
| -rw-r--r-- | lib/rook/share/share.ex | 4 | ||||
| -rw-r--r-- | lib/rook/utils/identity.ex | 19 | ||||
| -rw-r--r-- | lib/rook_web/channels/request_channel.ex | 12 | ||||
| -rw-r--r-- | lib/rook_web/channels/user_socket.ex | 5 | ||||
| -rw-r--r-- | lib/rook_web/endpoint.ex | 2 |
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. |
