Hot fix: now bad cookies do not ruin everything

This commit is contained in:
Андреев Григорий 2024-08-25 15:27:48 +03:00
parent 799e156f88
commit 90f8289bcd
7 changed files with 53 additions and 17 deletions

2
.gitignore vendored
View File

@ -14,3 +14,5 @@ local.sh
iu9-ca-web-chat.db iu9-ca-web-chat.db
log/ log/
core

View File

@ -149,8 +149,10 @@ struct CAWebChat {
"login_cookie.cpp", "login_cookie.cpp",
"backend_logic/server_data_interact.cpp", "backend_logic/server_data_interact.cpp",
"backend_logic/when_login.cpp", "backend_logic/when_login.cpp",
"backend_logic/when_list_rooms.cpp",
"backend_logic/when_internalapi_pollevents.cpp", "backend_logic/when_internalapi_pollevents.cpp",
"backend_logic/when_internalapi_getchatlist.cpp", "backend_logic/when_internalapi_getchatlist.cpp",
"backend_logic/when_internalapi_getchatinfo.cpp",
}; };
for (std::string& u: T.units) for (std::string& u: T.units)
u = "web_chat/iu9_ca_web_chat_lib/" + u; u = "web_chat/iu9_ca_web_chat_lib/" + u;

View File

@ -55,26 +55,31 @@ namespace een9 {
}; };
skip_ows(); skip_ows();
while (pos < hv.size()) { while (pos < hv.size()) {
std::string name_of_pechenye = read_to_space_or_eq(); if (!result.empty()) {
ASSERT(isCookieName(name_of_pechenye), "Incorrect Cookie name"); if (!isThis(';'))
THROW("Incorrect Cookie header line, missing ;");
pos++;
skip_ows(); skip_ows();
ASSERT(isThis('='), "Incorrect Cookie header line, missing ="); }
std::string name_of_pechenye = read_to_space_or_eq();
// ASSERT(isCookieName(name_of_pechenye), "Incorrect Cookie name");
skip_ows();
if (!isThis('='))
THROW("Incorrect Cookie header line, missing =");
pos++; pos++;
skip_ows(); skip_ows();
std::string value_of_pechenye; std::string value_of_pechenye;
if (isThis('"')) { if (isThis('"')) {
pos++; pos++;
value_of_pechenye = read_to_space_or_dq_or_semc(); value_of_pechenye = read_to_space_or_dq_or_semc();
ASSERT(isThis('"'), "Incorrect Cookie header line, missing \""); if (!isThis('"'))
THROW("Incorrect Cookie header line, missing \"");
pos++; pos++;
} else { } else {
value_of_pechenye = read_to_space_or_dq_or_semc(); value_of_pechenye = read_to_space_or_dq_or_semc();
} }
ASSERT(isCookieValue(value_of_pechenye), "Incorrect Cookie value"); // ASSERT(isCookieValue(value_of_pechenye), "Incorrect Cookie value");
if (result.empty()) result.emplace_back(name_of_pechenye, value_of_pechenye);
result.emplace_back();
result.back().first = std::move(name_of_pechenye);
result.back().second = std::move(value_of_pechenye);
skip_ows(); skip_ows();
} }
return result; return result;
@ -84,11 +89,15 @@ namespace een9 {
findAllClientCookies(const std::vector<std::pair<std::string, std::string>>& header) { findAllClientCookies(const std::vector<std::pair<std::string, std::string>>& header) {
std::vector<std::pair<std::string, std::string>> result; std::vector<std::pair<std::string, std::string>> result;
for (const std::pair<std::string, std::string>& line: header) { for (const std::pair<std::string, std::string>& line: header) {
try {
if (line.first == "Cookie") { if (line.first == "Cookie") {
std::vector<std::pair<std::string, std::string>> new_cookies = parseCookieHeader(line.second); std::vector<std::pair<std::string, std::string>> new_cookies = parseCookieHeader(line.second);
result.reserve(result.size() + new_cookies.size()); result.reserve(result.size() + new_cookies.size());
result.insert(result.end(), new_cookies.begin(), new_cookies.end()); result.insert(result.end(), new_cookies.begin(), new_cookies.end());
} }
} catch (const std::exception& e) {
printf("!!!findAllClientCookies failure\n");
}
} }
return result; return result;
} }

View File

@ -63,6 +63,8 @@ namespace iu9cawebchat {
std::string when_page_login(WorkerGuestData& wgd, const json::JSON& config_presentation, std::string when_page_login(WorkerGuestData& wgd, const json::JSON& config_presentation,
const een9::ClientRequest& req, const std::vector<LoginCookie>& login_cookies, const json::JSON& userinfo); const een9::ClientRequest& req, const std::vector<LoginCookie>& login_cookies, const json::JSON& userinfo);
std::string when_page_list_rooms(WorkerGuestData& wgd, const json::JSON& config_presentation,
const een9::ClientRequest& req, const std::vector<LoginCookie>& login_cookies, const json::JSON& userinfo);
json::JSON internalapi_pollEvents(SqliteConnection& conn, int64_t uid, const json::JSON& Sent); json::JSON internalapi_pollEvents(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);

View File

@ -0,0 +1,5 @@
#include "server_data_interact.h"
namespace iu9cawebchat {
// todo
}

View File

@ -0,0 +1,18 @@
#include "server_data_interact.h"
namespace iu9cawebchat {
std::string when_page_list_rooms(WorkerGuestData& wgd, const json::JSON& config_presentation,
const een9::ClientRequest& req, const std::vector<LoginCookie>& login_cookies, const json::JSON& userinfo) {
if (userinfo.isNull()) {
printf("Somebody entered /list-room with %s without being logged in\n", req.method.c_str());
if (!login_cookies.empty()) {
printf("Login cookies: \n");
for (auto& c: login_cookies) {
printf("%s as %s\n", c.nickname.c_str(), c.password.c_str());
}
}
return een9::form_http_server_response_307("/login");
}
return RTEE("list-rooms", config_presentation, wgd, userinfo);
}
}

View File

@ -82,20 +82,18 @@ namespace iu9cawebchat {
int64_t logged_in_user = -1; int64_t logged_in_user = -1;
initial_extraction_of_all_the_useful_info_from_cookies(*wgd.db, req, cookies, login_cookies, userinfo, logged_in_user); initial_extraction_of_all_the_useful_info_from_cookies(*wgd.db, req, cookies, login_cookies, userinfo, logged_in_user);
std::string result;
if (req.uri_path == "/" || req.uri_path == "/list-rooms") { if (req.uri_path == "/" || req.uri_path == "/list-rooms") {
if (logged_in_user < 0) return when_page_list_rooms(wgd, config_presentation, req, login_cookies, userinfo);
result = een9::form_http_server_response_307("/login");
return RTEE("list-rooms", config_presentation, wgd, userinfo);
} }
if (req.uri_path == "/login") { if (req.uri_path == "/login") {
return when_page_login(wgd, config_presentation, req, login_cookies, userinfo); return when_page_login(wgd, config_presentation, req, login_cookies, userinfo);
} }
if (req.uri_path == "/chat") { if (req.uri_path == "/chat") {
// todo: write it actually
return RTEE("chat", config_presentation, wgd, userinfo); return RTEE("chat", config_presentation, wgd, userinfo);
} }
if (req.uri_path == "/profile") { if (req.uri_path == "/profile") {
// todo: write it actually
return RTEE("profile", config_presentation, wgd, userinfo); return RTEE("profile", config_presentation, wgd, userinfo);
} }
// if (req.uri_path == "/registration") { // if (req.uri_path == "/registration") {