@@ -82,47 +82,52 @@ int server(char *config_file)
82
82
poll_fds [1 ].events = POLLIN ;
83
83
poll (poll_fds , 2 , -1 );
84
84
85
- if (!is_authenticated )
86
- {
87
- int data_len = recvfrom (tunnel_socket , & packet , BUFFER_SIZE , 0 , (struct sockaddr * ) & tunnel_addr , & address_len );
88
- if (data_len < GENERIC_PACKET_HEADER_SIZE || packet .type != MSG_CONNECTION_REQUEST ) continue ;
85
+ // Receive a packet from the tunnel client
86
+ struct sockaddr_in recv_addr ;
87
+ socklen_t recv_addr_len = sizeof (recv_addr );
88
+ int data_len = recvfrom (tunnel_socket , & packet , BUFFER_SIZE , 0 , (struct sockaddr * ) & recv_addr , & recv_addr_len );
89
+ if (data_len == -1 ) {
90
+ goto recv_from_minecraft ;
91
+ }
89
92
93
+ // Handle connection requests
94
+ if (packet .type == MSG_CONNECTION_REQUEST )
95
+ {
96
+ // Decrypt the packet
90
97
int packet_len = decrypt_packet (& packet , data_len , CLIENT_FLAG , config .secret_key );
98
+ if (packet_len == -1 ) {
99
+ printf ("Rejected connection request\n" );
100
+ continue ; // Forgery detected, ignore the packet
101
+ }
91
102
if (packet_len != sizeof (struct connection_request_packet )) continue ;
92
- struct connection_request_packet * con_req = (struct connection_request_packet * ) & packet ;
93
103
94
104
printf ("Client connected\n" );
105
+ tunnel_addr = recv_addr ;
95
106
is_authenticated = 1 ;
107
+ struct connection_request_packet * con_req = (struct connection_request_packet * ) & packet ;
96
108
memcpy (session_key , con_req -> session_key , 32 );
97
109
98
110
uint64_t connection_accepted = MSG_CONNECTION_ACCEPTED ;
99
111
sendto (tunnel_socket , & connection_accepted , sizeof (connection_accepted ), 0 , (struct sockaddr * ) & tunnel_addr , address_len );
100
-
101
112
continue ;
102
113
}
103
114
104
- struct sockaddr_in recv_addr ;
105
- socklen_t recv_addr_len = sizeof (recv_addr );
106
-
107
- // Receive a packet from the tunnel client
108
- int data_len = recvfrom (tunnel_socket , & packet , BUFFER_SIZE , 0 , (struct sockaddr * ) & recv_addr , & recv_addr_len );
109
- if (data_len == -1 ) {
110
- goto recv_from_minecraft ;
111
- }
115
+ if (!is_authenticated ) continue ;
112
116
113
- // Reject all packets not from the tunnel client
114
- if (recv_addr .sin_addr .s_addr != tunnel_addr .sin_addr .s_addr || recv_addr .sin_port != tunnel_addr .sin_port )
115
- {
116
- printf ("Received packet from unknown source.\n" );
117
- continue ;
118
- }
119
-
120
117
// Decrypt the packet
121
118
int packet_len = decrypt_packet (& packet , data_len , CLIENT_FLAG , session_key );
122
119
if (packet_len == -1 ) {
123
120
printf ("Decryption failed\n" );
124
121
continue ; // Forgery detected, ignore the packet
125
122
}
123
+ // Reject all packets not from the tunnel client
124
+ if (recv_addr .sin_addr .s_addr != tunnel_addr .sin_addr .s_addr || recv_addr .sin_port != tunnel_addr .sin_port )
125
+ {
126
+ printf ("Received packet from unknown source.\n" );
127
+ continue ;
128
+ }
129
+
130
+ // Handle service packets
126
131
if (packet .type != MSG_SERVICE || packet_len < SERVICE_PACKET_HEADER_SIZE )
127
132
{
128
133
printf ("Invalid packet type\n" );
0 commit comments