From 206176426dbe6728f37d6757cde16d67ebf00fde Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christopher=20Cot=C3=A9?= Date: Wed, 8 Dec 2021 16:09:06 -0500 Subject: [PATCH] verify callee is valid --- lib/router/session.ex | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/router/session.ex b/lib/router/session.ex index acbe30c..256ff34 100644 --- a/lib/router/session.ex +++ b/lib/router/session.ex @@ -437,7 +437,7 @@ defmodule Wampex.Router.Session do case is_authorized?(am, peer, :call, proc, method) do true -> with {callees, _index} <- RealmSession.callees(db, realm, proc), - {id, {pid, node}} <- get_live_callee(callees) do + {id, {pid, node}} <- get_live_callee(proxy, callees, 10) do opts = Map.put(opts, "procedure", proc) opts = Map.put(opts, "session_id", session_id) @@ -787,13 +787,35 @@ defmodule Wampex.Router.Session do defp get_auth_module(auth, _methods), do: auth - defp get_live_callee([]) do + defp get_live_callee(_proxy, [], 0) do + Logger.error("No live callees, tried all replicas") + {:error, :no_live_callees} + end + + defp get_live_callee(_proxy, [], _) do Logger.error("No live callees, empty result from lookup") {:error, :no_live_callees} end - defp get_live_callee(callees) do - Enum.random(callees) + defp get_live_callee(proxy, callees, tries) when is_list(callees) do + {_id, {pid, node}} = c = Enum.random(callees) + + nodes = [Node.self() | Node.list()] + + with true <- node in nodes, + true <- GenServer.call({proxy, node}, {:is_up, pid}) do + c + else + false -> + Logger.error("#{inspect(c)} is ian invalid callee") + get_live_callee(proxy, callees, tries - 1) + end + end + + defp get_live_callee(proxy, result, tries) do + Logger.error("No live callees, Proxy: #{inspect(proxy)} Result: #{inspect(result)} Tries: #{tries}") + + {:error, :no_live_callees} end defp send_to_peer(msg, transport, pid) do -- 2.45.3