Skip to content

Commit 51a7533

Browse files
authored
fix: invalid JWT on join (#1498)
1 parent f3e4cfc commit 51a7533

File tree

4 files changed

+222
-42
lines changed

4 files changed

+222
-42
lines changed

lib/realtime_web/channels/realtime_channel/logging.ex

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,25 @@ defmodule RealtimeWeb.RealtimeChannel.Logging do
99
@doc """
1010
Logs an error message
1111
"""
12-
def log_error(socket, code, msg), do: log(socket, :error, code, msg)
12+
@spec log_error(socket :: Phoenix.Socket.t(), code :: binary(), msg :: any()) ::
13+
{:error, %{reason: binary}}
14+
def log_error(socket, code, msg) do
15+
msg = build_msg(code, msg)
16+
emit_system_error(:error, code)
17+
log(socket, :error, msg)
18+
{:error, %{reason: msg}}
19+
end
1320

1421
@doc """
1522
Logs an error if the log level is set to error
1623
"""
17-
@spec maybe_log_error(socket :: Phoenix.Socket.t(), code :: binary(), msg :: any()) :: :ok
24+
@spec maybe_log_error(socket :: Phoenix.Socket.t(), code :: binary(), msg :: any()) :: {:error, %{reason: binary}}
1825
def maybe_log_error(socket, code, msg), do: maybe_log(socket, :error, code, msg)
1926

2027
@doc """
2128
Logs a warning if the log level is set to warning
2229
"""
23-
@spec maybe_log_warning(socket :: Phoenix.Socket.t(), code :: binary(), msg :: any()) :: :ok
30+
@spec maybe_log_warning(socket :: Phoenix.Socket.t(), code :: binary(), msg :: any()) :: {:error, %{reason: binary}}
2431
def maybe_log_warning(socket, code, msg), do: maybe_log(socket, :warning, code, msg)
2532

2633
@doc """
@@ -29,19 +36,23 @@ defmodule RealtimeWeb.RealtimeChannel.Logging do
2936
@spec maybe_log_info(socket :: Phoenix.Socket.t(), msg :: any()) :: :ok
3037
def maybe_log_info(socket, msg), do: maybe_log(socket, :info, nil, msg)
3138

32-
defp log(%{assigns: %{tenant: tenant, access_token: access_token}}, level, code, msg) do
39+
defp build_msg(code, msg) do
40+
msg = stringify!(msg)
41+
if code, do: "#{code}: #{msg}", else: msg
42+
end
43+
44+
defp log(%{assigns: %{tenant: tenant, access_token: access_token}}, level, msg) do
3345
Logger.metadata(external_id: tenant, project: tenant)
34-
emit_system_error(level, code)
3546
if level in [:error, :warning], do: update_metadata_with_token_claims(access_token)
3647

37-
msg = stringify!(msg)
38-
msg = if code, do: "#{code}: #{msg}", else: msg
3948
Logger.log(level, msg)
40-
if level in [:error, :warning], do: {:error, %{reason: msg}}, else: :ok
4149
end
4250

4351
defp maybe_log(%{assigns: %{log_level: log_level}} = socket, level, code, msg) do
44-
if Logger.compare_levels(log_level, level) != :gt, do: log(socket, level, code, msg), else: :ok
52+
msg = build_msg(code, msg)
53+
emit_system_error(level, code)
54+
if Logger.compare_levels(log_level, level) != :gt, do: log(socket, level, msg)
55+
if level in [:error, :warning], do: {:error, %{reason: msg}}, else: :ok
4556
end
4657

4758
@system_errors [

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule Realtime.MixProject do
44
def project do
55
[
66
app: :realtime,
7-
version: "2.42.2",
7+
version: "2.42.3",
88
elixir: "~> 1.17.3",
99
elixirc_paths: elixirc_paths(Mix.env()),
1010
start_permanent: Mix.env() == :prod,

test/realtime_web/channels/realtime_channel/logging_test.exs

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,28 @@ defmodule RealtimeWeb.RealtimeChannel.LoggingTest do
2727
for log_level <- log_levels do
2828
socket = %{assigns: %{log_level: log_level, tenant: random_string(), access_token: "test_token"}}
2929

30-
assert capture_log(fn -> Logging.maybe_log_error(socket, "TestCode", "test message") end) =~
31-
"TestCode: test message"
32-
33-
assert capture_log(fn -> Logging.maybe_log_error(socket, "TestCode", %{a: "b"}) end) =~
34-
"TestCode: %{a: \"b\"}"
30+
assert capture_log(fn ->
31+
assert Logging.maybe_log_error(socket, "TestCode", "test message") ==
32+
{:error, %{reason: "TestCode: test message"}}
33+
end) =~ "TestCode: test message"
34+
35+
assert capture_log(fn ->
36+
assert Logging.maybe_log_error(socket, "TestCode", %{a: "b"}) ==
37+
{:error, %{reason: "TestCode: %{a: \"b\"}"}}
38+
end) =~ "TestCode: %{a: \"b\"}"
3539
end
3640
end
3741

3842
test "does not log error message when log_level is higher than error" do
3943
socket = %{assigns: %{log_level: :critical, tenant: random_string(), access_token: "test_token"}}
40-
assert capture_log(fn -> Logging.maybe_log_error(socket, "TestCode", "test message") end) == ""
44+
45+
assert capture_log(fn ->
46+
assert Logging.maybe_log_error(socket, "TestCode", "test message") ==
47+
{:error, %{reason: "TestCode: test message"}}
48+
end) == ""
4149
end
4250

43-
test "returns {:error, %{reason: msg}} when log_level is error" do
51+
test "also returns {:error, %{reason: msg}} when log_level is error" do
4452
socket = %{assigns: %{log_level: :error, tenant: random_string(), access_token: "test_token"}}
4553

4654
assert Logging.maybe_log_error(socket, "TestCode", "test message") ==
@@ -55,20 +63,29 @@ defmodule RealtimeWeb.RealtimeChannel.LoggingTest do
5563
for log_level <- log_levels do
5664
socket = %{assigns: %{log_level: log_level, tenant: random_string(), access_token: "test_token"}}
5765

58-
assert capture_log(fn -> Logging.maybe_log_warning(socket, "TestCode", "test message") end) =~
66+
assert capture_log(fn ->
67+
assert Logging.maybe_log_warning(socket, "TestCode", "test message") ==
68+
{:error, %{reason: "TestCode: test message"}}
69+
end) =~
5970
"TestCode: test message"
6071

61-
assert capture_log(fn -> Logging.maybe_log_warning(socket, "TestCode", %{a: "b"}) end) =~
62-
"TestCode: %{a: \"b\"}"
72+
assert capture_log(fn ->
73+
assert Logging.maybe_log_warning(socket, "TestCode", %{a: "b"}) ==
74+
{:error, %{reason: "TestCode: %{a: \"b\"}"}}
75+
end) =~ "TestCode: %{a: \"b\"}"
6376
end
6477
end
6578

6679
test "does not log error message when log_level is higher than warning" do
6780
socket = %{assigns: %{log_level: :error, tenant: random_string(), access_token: "test_token"}}
68-
assert capture_log(fn -> Logging.maybe_log_warning(socket, "TestCode", "test message") end) == ""
81+
82+
assert capture_log(fn ->
83+
assert Logging.maybe_log_warning(socket, "TestCode", "test message") ==
84+
{:error, %{reason: "TestCode: test message"}}
85+
end) == ""
6986
end
7087

71-
test "returns {:error, %{reason: msg}} when log_level is warning" do
88+
test "also returns {:error, %{reason: msg}} when log_level is warning" do
7289
socket = %{assigns: %{log_level: :warning, tenant: random_string(), access_token: "test_token"}}
7390

7491
assert Logging.maybe_log_warning(socket, "TestCode", "test message") ==
@@ -109,11 +126,15 @@ defmodule RealtimeWeb.RealtimeChannel.LoggingTest do
109126
socket = %{assigns: %{log_level: :error, tenant: random_string(), access_token: "test_token"}}
110127

111128
for error <- Logging.system_errors() do
112-
Logging.maybe_log_error(socket, error, "test error")
129+
assert Logging.maybe_log_error(socket, error, "test error") ==
130+
{:error, %{reason: "#{error}: test error"}}
131+
113132
assert_receive {[:realtime, :channel, :error], %{code: ^error}, %{code: ^error}}
114133
end
115134

116-
Logging.maybe_log_error(socket, "TestError", "test error")
135+
assert Logging.maybe_log_error(socket, "TestError", "test error") ==
136+
{:error, %{reason: "TestError: test error"}}
137+
117138
refute_receive {[:realtime, :channel, :error], :_, :_}
118139
end
119140

0 commit comments

Comments
 (0)