Skip to content

Commit 05653c9

Browse files
committed
refactor: improve code readability by adding comments and reformatting
1 parent 14bb02a commit 05653c9

File tree

9 files changed

+235
-105
lines changed

9 files changed

+235
-105
lines changed

config/config.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import Config
22

33
config :vpn_server,
44
users: %{
5-
"admin" => "admin123" # Replace with secure credentials in production
5+
# Replace with secure credentials in production
6+
"admin" => "admin123"
67
},
78
ip_pool_start: "10.0.0.2",
89
ip_pool_end: "10.0.0.254",

lib/vpn_server/config.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ defmodule VpnServer.Config do
1313
def new do
1414
%__MODULE__{
1515
users: %{
16-
"admin" => "admin123" # Replace with secure credentials in production
16+
# Replace with secure credentials in production
17+
"admin" => "admin123"
1718
},
1819
ip_pool_start: "10.0.0.2",
1920
ip_pool_end: "10.0.0.254",
@@ -25,8 +26,10 @@ defmodule VpnServer.Config do
2526
case get_user_password(username) do
2627
{:ok, stored_password} when stored_password == password ->
2728
{:ok, username}
29+
2830
{:ok, _} ->
2931
{:error, :invalid_password}
32+
3033
{:error, _} ->
3134
{:error, :user_not_found}
3235
end
@@ -36,6 +39,7 @@ defmodule VpnServer.Config do
3639
case Application.get_env(:vpn_server, :users) do
3740
nil ->
3841
{:error, :user_not_found}
42+
3943
users ->
4044
case Map.get(users, username) do
4145
nil -> {:error, :user_not_found}

lib/vpn_server/pptp_protocol.ex

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,18 @@ defmodule VpnServer.PPTPProtocol do
3232

3333
def parse_packet(data) do
3434
case data do
35-
<<version::8, _reserved::8, message_type::little-16, length::little-16,
36-
call_id::little-16, seq_num::little-32, ack_num::little-32, payload::binary>> ->
37-
{:ok, %__MODULE__{
38-
version: version,
39-
message_type: message_type,
40-
length: length,
41-
call_id: call_id,
42-
sequence_number: seq_num,
43-
acknowledgment_number: ack_num,
44-
payload: payload
45-
}}
35+
<<version::8, _reserved::8, message_type::little-16, length::little-16, call_id::little-16,
36+
seq_num::little-32, ack_num::little-32, payload::binary>> ->
37+
{:ok,
38+
%__MODULE__{
39+
version: version,
40+
message_type: message_type,
41+
length: length,
42+
call_id: call_id,
43+
sequence_number: seq_num,
44+
acknowledgment_number: ack_num,
45+
payload: payload
46+
}}
4647

4748
_ ->
4849
{:error, :invalid_packet_format}
@@ -59,7 +60,8 @@ defmodule VpnServer.PPTPProtocol do
5960

6061
<<
6162
packet.version::8,
62-
0::8, # Reserved
63+
# Reserved
64+
0::8,
6365
packet.message_type::little-16,
6466
total_length::little-16,
6567
packet.call_id::little-16,

lib/vpn_server/server.ex

Lines changed: 62 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,32 @@ defmodule VpnServer.Server do
22
use GenServer
33
require Logger
44

5-
@default_port 1723 # Standard PPTP port
5+
# Standard PPTP port
6+
@default_port 1723
67

78
def start_link(opts \\ []) do
89
port = Keyword.get(opts, :port, @default_port)
9-
GenServer.start_link(__MODULE__, %{
10-
port: port,
11-
config: nil,
12-
listen_socket: nil,
13-
acceptor_pid: nil
14-
}, name: __MODULE__)
10+
11+
GenServer.start_link(
12+
__MODULE__,
13+
%{
14+
port: port,
15+
config: nil,
16+
listen_socket: nil,
17+
acceptor_pid: nil
18+
},
19+
name: __MODULE__
20+
)
1521
end
1622

1723
def init(state) do
18-
{:ok, listen_socket} = :gen_tcp.listen(state.port, [
19-
:binary,
20-
packet: :raw,
21-
active: false,
22-
reuseaddr: true
23-
])
24+
{:ok, listen_socket} =
25+
:gen_tcp.listen(state.port, [
26+
:binary,
27+
packet: :raw,
28+
active: false,
29+
reuseaddr: true
30+
])
2431

2532
config = VpnServer.Config.new()
2633
Logger.info("VPN Server listening on port #{state.port}")
@@ -55,6 +62,7 @@ defmodule VpnServer.Server do
5562
{:ok, response} ->
5663
:gen_tcp.send(socket, response)
5764
handle_client(socket, config)
65+
5866
{:error, reason} ->
5967
Logger.error("Failed to process PPTP packet: #{inspect(reason)}")
6068
:gen_tcp.close(socket)
@@ -78,9 +86,11 @@ defmodule VpnServer.Server do
7886
ip_address = assign_ip_address()
7987
{:ok, _pid} = VpnServer.Session.start_link(socket, username, ip_address)
8088
create_success_response(packet)
89+
8190
{:error, reason} ->
8291
create_error_response(packet, reason)
8392
end
93+
8494
{:error, reason} ->
8595
{:error, reason}
8696
end
@@ -92,6 +102,7 @@ defmodule VpnServer.Server do
92102
case extract_credentials(packet.payload) do
93103
{:ok, {username, password}} ->
94104
VpnServer.Config.authenticate_user(username, password)
105+
95106
{:error, reason} ->
96107
{:error, reason}
97108
end
@@ -115,30 +126,52 @@ defmodule VpnServer.Server do
115126
defp create_success_response(packet) do
116127
# Create a PPTP Control-Connection-Reply packet
117128
response = <<
118-
1, # version
119-
0, # reserved
120-
2, 0, # message_type (Control-Connection-Reply)
121-
12, 0,# length (little-endian)
122-
packet.call_id::little-16, # call_id (little-endian)
123-
packet.sequence_number::little-32, # sequence_number (little-endian)
124-
packet.sequence_number::little-32, # acknowledgment_number (little-endian)
125-
"Authentication successful"::binary # payload
129+
# version
130+
1,
131+
# reserved
132+
0,
133+
# message_type (Control-Connection-Reply)
134+
2,
135+
0,
136+
# length (little-endian)
137+
12,
138+
0,
139+
# call_id (little-endian)
140+
packet.call_id::little-16,
141+
# sequence_number (little-endian)
142+
packet.sequence_number::little-32,
143+
# acknowledgment_number (little-endian)
144+
packet.sequence_number::little-32,
145+
# payload
146+
"Authentication successful"::binary
126147
>>
148+
127149
{:ok, response}
128150
end
129151

130152
defp create_error_response(packet, reason) do
131153
# Create a PPTP Control-Connection-Reply packet with error
132154
response = <<
133-
1, # version
134-
0, # reserved
135-
2, 0, # message_type (Control-Connection-Reply)
136-
12, 0,# length (little-endian)
137-
packet.call_id::little-16, # call_id (little-endian)
138-
packet.sequence_number::little-32, # sequence_number (little-endian)
139-
packet.sequence_number::little-32, # acknowledgment_number (little-endian)
140-
"Authentication failed: #{inspect(reason)}"::binary # payload
155+
# version
156+
1,
157+
# reserved
158+
0,
159+
# message_type (Control-Connection-Reply)
160+
2,
161+
0,
162+
# length (little-endian)
163+
12,
164+
0,
165+
# call_id (little-endian)
166+
packet.call_id::little-16,
167+
# sequence_number (little-endian)
168+
packet.sequence_number::little-32,
169+
# acknowledgment_number (little-endian)
170+
packet.sequence_number::little-32,
171+
# payload
172+
"Authentication failed: #{inspect(reason)}"::binary
141173
>>
174+
142175
{:ok, response}
143176
end
144177
end

lib/vpn_server/session.ex

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ defmodule VpnServer.Session do
3131
case VpnServer.PPTPProtocol.parse_packet(data) do
3232
{:ok, packet} ->
3333
handle_packet(packet, state)
34+
3435
{:error, reason} ->
3536
Logger.error("Failed to parse PPTP packet: #{inspect(reason)}")
3637
{:noreply, state}
@@ -49,32 +50,42 @@ defmodule VpnServer.Session do
4950

5051
defp handle_packet(packet, state) do
5152
case packet.message_type do
52-
1 -> # Start-Control-Connection-Request
53+
# Start-Control-Connection-Request
54+
1 ->
5355
handle_control_connection_request(packet, state)
54-
3 -> # Echo-Request
56+
57+
# Echo-Request
58+
3 ->
5559
handle_echo_request(packet, state)
56-
5 -> # Outgoing-Call-Request
60+
61+
# Outgoing-Call-Request
62+
5 ->
5763
handle_outgoing_call_request(packet, state)
64+
5865
_ ->
5966
Logger.warning("Unhandled PPTP message type: #{packet.message_type}")
6067
{:noreply, state}
6168
end
6269
end
6370

6471
defp handle_control_connection_request(packet, state) do
65-
response = VpnServer.PPTPProtocol.create_control_connection_reply(
66-
packet.call_id,
67-
packet.sequence_number
68-
)
72+
response =
73+
VpnServer.PPTPProtocol.create_control_connection_reply(
74+
packet.call_id,
75+
packet.sequence_number
76+
)
77+
6978
:gen_tcp.send(state.socket, VpnServer.PPTPProtocol.build_packet(response))
7079
{:noreply, %{state | sequence_number: state.sequence_number + 1}}
7180
end
7281

7382
defp handle_echo_request(packet, state) do
74-
response = VpnServer.PPTPProtocol.create_echo_reply(
75-
packet.call_id,
76-
packet.sequence_number
77-
)
83+
response =
84+
VpnServer.PPTPProtocol.create_echo_reply(
85+
packet.call_id,
86+
packet.sequence_number
87+
)
88+
7889
:gen_tcp.send(state.socket, VpnServer.PPTPProtocol.build_packet(response))
7990
{:noreply, %{state | sequence_number: state.sequence_number + 1}}
8091
end
@@ -84,13 +95,15 @@ defmodule VpnServer.Session do
8495
# For now, just acknowledge the request
8596
response = %VpnServer.PPTPProtocol{
8697
version: 1,
87-
message_type: 6, # Outgoing-Call-Reply
98+
# Outgoing-Call-Reply
99+
message_type: 6,
88100
length: 12,
89101
call_id: packet.call_id,
90102
sequence_number: state.sequence_number,
91103
acknowledgment_number: packet.sequence_number,
92104
payload: <<>>
93105
}
106+
94107
:gen_tcp.send(state.socket, VpnServer.PPTPProtocol.build_packet(response))
95108
{:noreply, %{state | sequence_number: state.sequence_number + 1}}
96109
end

test/vpn_server/config_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule VpnServer.ConfigTest do
77
Application.put_env(:vpn_server, :users, %{
88
"test_user" => "test_password"
99
})
10+
1011
:ok
1112
end
1213

0 commit comments

Comments
 (0)