added new packet types
This commit is contained in:
@@ -28,7 +28,7 @@ Result(ClientConnection*) ClientConnection_accept(ServerCredentials* server_cred
|
||||
// correct session key will be received from client later
|
||||
Array_memset(conn->session_key, 0);
|
||||
EncryptedSocketTCP_construct(&conn->sock, sock_tcp, NETWORK_BUFFER_SIZE, conn->session_key);
|
||||
try_void(socket_setTimeout(sock_tcp, SOCKET_TIMEOUT_MS_DEFAULT));
|
||||
try_void(socket_TCP_enableAliveChecks_default(sock_tcp));
|
||||
|
||||
// decrypt the rsa messages using server private key
|
||||
RSADecryptor rsa_dec;
|
||||
@@ -38,12 +38,8 @@ Result(ClientConnection*) ClientConnection_accept(ServerCredentials* server_cred
|
||||
PacketHeader packet_header = {0};
|
||||
try_void(EncryptedSocketTCP_recvStructRSA(&conn->sock, &rsa_dec, &packet_header));
|
||||
try_void(PacketHeader_validateMagic(&packet_header));
|
||||
if(packet_header.type != PacketType_ClientHandshake){
|
||||
Return RESULT_ERROR_FMT(
|
||||
"received message of unexpected type: %u",
|
||||
packet_header.type
|
||||
);
|
||||
}
|
||||
try_void(PacketHeader_validateType(&packet_header, PacketType_ClientHandshake));
|
||||
try_void(PacketHeader_validateContentSize(&packet_header, sizeof(ClientHandshake)));
|
||||
|
||||
// receive ClientHandshake
|
||||
ClientHandshake client_handshake = {0};
|
||||
@@ -54,10 +50,8 @@ Result(ClientConnection*) ClientConnection_accept(ServerCredentials* server_cred
|
||||
EncryptedSocketTCP_changeKey(&conn->sock, conn->session_key);
|
||||
|
||||
// send PacketHeader and ServerHandshake over encrypted TCP socket
|
||||
PacketHeader_construct(&packet_header,
|
||||
PROTOCOL_VERSION, PacketType_ServerHandshake, sizeof(ServerHandshake));
|
||||
ServerHandshake server_handshake = {0};
|
||||
ServerHandshake_construct(&server_handshake,
|
||||
ServerHandshake_construct(&server_handshake, &packet_header,
|
||||
session_id);
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &packet_header));
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &server_handshake));
|
||||
|
||||
@@ -58,7 +58,7 @@ Result(void) server_run(cstr server_endpoint_cstr, cstr config_path){
|
||||
|
||||
logDebug(log_ctx, "initializing main socket");
|
||||
EndpointIPv4 server_end;
|
||||
EndpointIPv4_parse(server_endpoint_cstr, &server_end);
|
||||
try_void(EndpointIPv4_parse(server_endpoint_cstr, &server_end));
|
||||
try(Socket main_socket, i, socket_open_TCP());
|
||||
try_void(socket_bind(main_socket, server_end));
|
||||
try_void(socket_listen(main_socket, 512));
|
||||
@@ -84,7 +84,7 @@ static void* handle_connection(void* _args){
|
||||
char log_ctx[64];
|
||||
sprintf(log_ctx, "Session-" IFWIN("%llx", "%lx"), args->session_id);
|
||||
|
||||
Result(void) r = try_handle_connection(args, log_ctx);
|
||||
ResultVar(void) r = try_handle_connection(args, log_ctx);
|
||||
if(r.error){
|
||||
str error_s = Error_toStr(r.error);
|
||||
logError(log_ctx, "%s", error_s.data);
|
||||
@@ -115,9 +115,88 @@ static Result(void) try_handle_connection(ConnectionHandlerArgs* args, cstr log_
|
||||
logInfo(log_ctx, "session accepted");
|
||||
|
||||
// handle unauthorized requests
|
||||
bool ahtorized = false;
|
||||
PacketHeader req_header = {0};
|
||||
PacketHeader res_header = {0};
|
||||
while(!ahtorized){
|
||||
sleepMsec(50);
|
||||
//TODO: implement some additional check if socket is dead or not
|
||||
|
||||
try_void(EncryptedSocketTCP_recvStruct(&conn->sock, &req_header));
|
||||
try_void(PacketHeader_validateMagic(&req_header));
|
||||
//TODO: move request handlers to separate functions
|
||||
switch(req_header.type){
|
||||
default:{
|
||||
Array(u8) err_buf = Array_alloc(u8, 128);
|
||||
bool err_complete = false;
|
||||
Defer(if(!err_complete) free(err_buf.data));
|
||||
sprintf(err_buf.data, "Received unexpected packet of type %u",
|
||||
req_header.type);
|
||||
err_buf.size = strlen(err_buf.data);
|
||||
|
||||
PacketHeader_construct(&res_header,
|
||||
PROTOCOL_VERSION, PacketType_ErrorMessage, err_buf.size);
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res_header));
|
||||
//TODO: limit ErrorMessage size to fit into EncryptedSocketTCP.internal_buffer_size
|
||||
try_void(EncryptedSocketTCP_send(&conn->sock, err_buf));
|
||||
|
||||
err_complete = true;
|
||||
Return RESULT_ERROR(err_buf.data, true);
|
||||
}
|
||||
|
||||
case PacketType_ServerPublicInfoRequest:{
|
||||
ServerPublicInfoRequest req = {0};
|
||||
try_void(PacketHeader_validateContentSize(&req_header, sizeof(req)));
|
||||
try_void(EncryptedSocketTCP_recvStruct(&conn->sock, &req));
|
||||
|
||||
//TODO: try find requested info
|
||||
Array(u8) content;
|
||||
|
||||
PacketHeader_construct(&res_header,
|
||||
PROTOCOL_VERSION, PacketType_ServerPublicInfoResponse, content.size);
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res_header));
|
||||
try_void(EncryptedSocketTCP_send(&conn->sock, content));
|
||||
break;
|
||||
}
|
||||
|
||||
case PacketType_LoginRequest:{
|
||||
LoginRequest req = {0};
|
||||
try_void(PacketHeader_validateContentSize(&req_header, sizeof(req)));
|
||||
try_void(EncryptedSocketTCP_recvStruct(&conn->sock, &req));
|
||||
|
||||
//TODO: try authorize client
|
||||
u64 user_id;
|
||||
u64 landing_channel_id;
|
||||
|
||||
LoginResponse res = {0};
|
||||
LoginResponse_construct(&res, &res_header, user_id, landing_channel_id);
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res_header));
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res));
|
||||
ahtorized = true;
|
||||
logInfo(log_ctx, "client authorized");
|
||||
break;
|
||||
}
|
||||
|
||||
case PacketType_RegisterRequest:{
|
||||
RegisterRequest req = {0};
|
||||
try_void(PacketHeader_validateContentSize(&req_header, sizeof(req)));
|
||||
try_void(EncryptedSocketTCP_recvStruct(&conn->sock, &req));
|
||||
|
||||
//TODO: try register client
|
||||
u64 user_id;
|
||||
|
||||
RegisterResponse res = {0};
|
||||
RegisterResponse_construct(&res, &res_header, user_id);
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res_header));
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// handle authorized requests
|
||||
while(true){
|
||||
|
||||
sleepMsec(10);
|
||||
sleepMsec(50);
|
||||
}
|
||||
|
||||
Return RESULT_VOID;
|
||||
|
||||
Reference in New Issue
Block a user