#include "responses.h" #define srv conn->server #define LOGGER srv->logger #define LOG_FUNC srv->log_func #define LOG_CONTEXT log_ctx declare_RequestHandler(Login) { Deferral(4); logInfo("requested %s", req_type_name); // receive request LoginRequest req; try_void(PacketHeader_validateContentSize(req_head, sizeof(req))); try_void(EncryptedSocketTCP_recvStruct(&conn->sock, &req)); if(conn->authorized){ try_void(sendErrorMessage(log_ctx, conn, res_head, LogSeverity_Warn, STR("is authorized in already") )); Return RESULT_VOID; } // validate username str username = str_null; str name_error_str = validateUsername_cstr(req.username, &username); if(name_error_str.data){ Defer(str_destroy(name_error_str)); try_void(sendErrorMessage(log_ctx, conn, res_head, LogSeverity_Warn, name_error_str)); Return RESULT_VOID; } // get user by id try(u64 user_id, i, User_findByUsername(conn->queries, username)); if(user_id == 0){ try_void(sendErrorMessage(log_ctx, conn, res_head, LogSeverity_Warn, STR("Username is not registered") )); Return RESULT_VOID; } // TODO: get user token Array(u8) token = Array_u8_construct(req.token, sizeof(req.token)); try(bool authorized, i, User_tryAuthorize(conn->queries, user_id, token)); // validate token hash if(!authorized){ try_void(sendErrorMessage(log_ctx, conn, res_head, LogSeverity_Warn, STR("wrong password") )); Return RESULT_VOID; } // authorize conn->authorized = true; conn->user_id = user_id; logInfo("authorized user '%s' with id "FMT_i64, username.data, user_id); // send response LoginResponse res; LoginResponse_construct(&res, res_head, user_id, srv->landing_channel_id); try_void(EncryptedSocketTCP_sendStruct(&conn->sock, res_head)); try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res)); Return RESULT_VOID; }