65 lines
2.0 KiB
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;
|
|
}
|