Skip to content

Commit 0f5b747

Browse files
committed
Server now accepts additional connection requests
1 parent 0e4361b commit 0f5b747

File tree

1 file changed

+26
-21
lines changed

1 file changed

+26
-21
lines changed

src/server.c

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -82,47 +82,52 @@ int server(char *config_file)
8282
poll_fds[1].events = POLLIN;
8383
poll(poll_fds, 2, -1);
8484

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+
}
8992

93+
// Handle connection requests
94+
if (packet.type == MSG_CONNECTION_REQUEST)
95+
{
96+
// Decrypt the packet
9097
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+
}
91102
if (packet_len != sizeof(struct connection_request_packet)) continue;
92-
struct connection_request_packet *con_req = (struct connection_request_packet *) &packet;
93103

94104
printf("Client connected\n");
105+
tunnel_addr = recv_addr;
95106
is_authenticated = 1;
107+
struct connection_request_packet *con_req = (struct connection_request_packet *) &packet;
96108
memcpy(session_key, con_req->session_key, 32);
97109

98110
uint64_t connection_accepted = MSG_CONNECTION_ACCEPTED;
99111
sendto(tunnel_socket, &connection_accepted, sizeof(connection_accepted), 0, (struct sockaddr *) &tunnel_addr, address_len);
100-
101112
continue;
102113
}
103114

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;
112116

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-
120117
// Decrypt the packet
121118
int packet_len = decrypt_packet(&packet, data_len, CLIENT_FLAG, session_key);
122119
if (packet_len == -1) {
123120
printf("Decryption failed\n");
124121
continue; // Forgery detected, ignore the packet
125122
}
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
126131
if (packet.type != MSG_SERVICE || packet_len < SERVICE_PACKET_HEADER_SIZE)
127132
{
128133
printf("Invalid packet type\n");

0 commit comments

Comments
 (0)