Skip to content

Commit ceba50e

Browse files
tverlaanbearice
authored andcommitted
make code dry and update main radius module
1 parent a9fc749 commit ceba50e

5 files changed

Lines changed: 58 additions & 54 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ loop = fn(loop)->
1616

1717
IO.puts "From #{inspect host} : \n#{inspect p, pretty: true}"
1818

19-
resp = %Radius.Packet{code: "Access-Reject", id: p.id, auth: p.auth, secret: p.secret}
20-
Radius.send sk,host,resp
19+
resp = %Radius.Packet{code: "Access-Reject", id: p.id, secret: p.secret}
20+
Radius.send_reply(sk, host, resp, p.auth)
2121

2222
loop.(loop)
2323
end

example.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ loop = fn loop ->
6565

6666
IO.puts("From #{inspect(host)} : \n#{inspect(p, pretty: true)}")
6767

68-
resp = %Radius.Packet{code: "Access-Reject", id: p.id, auth: p.auth, secret: p.secret}
69-
Radius.send(sk, host, resp)
68+
resp = %Radius.Packet{code: "Access-Reject", id: p.id, secret: p.secret}
69+
Radius.send_reply(sk, host, resp, p.auth)
7070

7171
loop.(loop)
7272
end

lib/radius.ex

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,35 @@ defmodule Radius do
3131
sk :: socket
3232
packet:: %Radius.Packet{}
3333
"""
34+
@deprecated "Use send_reply/4 or send_request/3"
3435
def send(sk, {host, port}, packet) do
35-
%{raw: data} = Packet.encode_reply(packet, packet.auth)
36+
send_reply(sk, {host, port}, packet, packet.auth)
37+
end
38+
39+
@doc """
40+
encode and send reply packet
41+
"""
42+
@spec send_reply(
43+
socket :: port(),
44+
{host :: :inet.ip_address(), port :: :inet.port_number()},
45+
packet :: Packet.t(),
46+
request_authenticator :: binary()
47+
) :: :ok | {:error, any()}
48+
def send_reply(sk, {host, port}, packet, request_authenticator) do
49+
%{raw: data} = Packet.encode_reply(packet, request_authenticator)
50+
:gen_udp.send(sk, host, port, data)
51+
end
52+
53+
@doc """
54+
encode and send request packet
55+
"""
56+
@spec send_request(
57+
socket :: port(),
58+
{host :: :inet.ip_address(), port :: :inet.port_number()},
59+
packet :: Packet.t()
60+
) :: :ok | {:error, any()}
61+
def send_request(sk, {host, port}, packet) do
62+
%{raw: data} = Packet.encode_request(packet)
3663
:gen_udp.send(sk, host, port, data)
3764
end
3865
end

lib/radius/packet.ex

Lines changed: 4 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -208,59 +208,14 @@ defmodule Radius.Packet do
208208
"""
209209
@deprecated "Use encode_request/1-2 or encode_reply/1-2 instead"
210210
def encode(packet, options \\ []) do
211-
sign? = options |> Keyword.get(:sign, false)
212-
raw? = options |> Keyword.get(:raw, false)
213-
214-
{auth, reply?} =
215-
if packet.auth == nil do
216-
{:crypto.strong_rand_bytes(16), false}
217-
else
218-
{packet.auth, true}
219-
end
220-
221-
packet = %{packet | auth: auth}
222-
223211
packet =
224-
if sign? do
225-
attrs = packet.attrs ++ [{"Message-Authenticator", <<0::size(128)>>}]
226-
227-
%{packet | attrs: attrs}
228-
else
229-
packet
230-
end
231-
232-
attrs = encode_attrs(packet)
233-
234-
code = encode_code(packet.code)
235-
length = 20 + :erlang.iolist_size(attrs)
236-
header = <<code, packet.id, length::size(16), auth::binary>>
237-
238-
attrs =
239-
if sign? do
240-
signature = :crypto.mac(:hmac, :md5, packet.secret, [header, attrs])
241-
[last | attrs] = attrs |> Enum.reverse()
242-
crop_len = byte_size(last) - 16
243-
last = <<last::bytes-size(crop_len), signature::binary>>
244-
[last | attrs] |> Enum.reverse()
245-
else
246-
attrs
247-
end
248-
249-
header =
250-
if reply? and raw? == false do
251-
resp_auth =
252-
:crypto.hash_init(:md5)
253-
|> :crypto.hash_update(header)
254-
|> :crypto.hash_update(attrs)
255-
|> :crypto.hash_update(packet.secret)
256-
|> :crypto.hash_final()
257-
258-
<<header::bytes-size(4), resp_auth::binary>>
212+
if packet.auth == nil do
213+
encode_request(packet, options)
259214
else
260-
header
215+
encode_reply(packet, packet.auth, options)
261216
end
262217

263-
[header, attrs]
218+
packet.raw
264219
end
265220

266221
@doc """

test/radius_packet_test.exs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,28 @@ defmodule Radius.PacketTest do
8686
assert packet.auth == @sample_req.auth
8787
end
8888

89+
test "encode request - deprecated" do
90+
# cut authenticator as it will be generated on each encoding
91+
<<before::size(32), _random::size(128), rest::binary>> =
92+
@sample_req
93+
|> Map.put(:auth, nil)
94+
|> Radius.Packet.encode()
95+
|> IO.iodata_to_binary()
96+
97+
<<sample_before::size(32), _random::size(128), sample_rest::binary>> = @sample_binary_req
98+
assert <<before::size(32), rest::binary>> == <<sample_before::size(32), sample_rest::binary>>
99+
end
100+
101+
test "encode reply - deprecated" do
102+
reply =
103+
@sample_rep
104+
|> Map.put(:auth, @sample_req.auth)
105+
|> Radius.Packet.encode()
106+
|> IO.iodata_to_binary()
107+
108+
assert reply == @sample_binary_rep
109+
end
110+
89111
test "encode request" do
90112
# cut authenticator as it will be generated on each encoding
91113
<<before::size(32), _random::size(128), rest::binary>> =

0 commit comments

Comments
 (0)