@@ -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
144177end
0 commit comments