Files
tcp-chat/src/server/responses/Login.c

65 lines
2.0 KiB
C

#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;
}