diff --git a/CMakeLists.txt b/CMakeLists.txt index 09f073b..3b97205 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,6 @@ add_subdirectory(third_party/xxHash/cmake_unofficial third_party/xxHash/build EX target_sources(${PROJECT_NAME} PRIVATE src/json_filter.cpp - src/admin_filter.cpp src/bank_api.cpp src/bank.cpp src/change_flag.cpp diff --git a/include/admin_filter.h b/include/admin_filter.h deleted file mode 100644 index 6014051..0000000 --- a/include/admin_filter.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include -#include -#include "bank.h" - -using namespace drogon; - -class AdminFilter : public HttpFilter -{ -private: - Bank &bank; - -public: - AdminFilter(Bank &); - - virtual void doFilter(const HttpRequestPtr &, - FilterCallback &&, - FilterChainCallback &&) override; -}; diff --git a/include/bank_api.h b/include/bank_api.h index 6d29df0..b1d5622 100644 --- a/include/bank_api.h +++ b/include/bank_api.h @@ -1,7 +1,6 @@ #pragma once #include #include "json_filter.h" -#include "admin_filter.h" #include "user_filter.h" using namespace drogon; @@ -47,31 +46,31 @@ public: //Usage METHOD_ADD(api::GetBal, "/v1/user/balance?name={name}", Get, Options, "JsonFilter"); #if MAX_LOG_SIZE > 0 - METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options, "UserFilter", "JsonFilter"); + METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options, "UserFilter", "JsonFilter"); #else METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options, "JsonFilter"); #endif - METHOD_ADD(api::SendFunds, "/v1/user/transfer", Post, Options, "JsonFilter", "UserFilter"); //expects ["to"](string) and ["amount"](32 bits) - METHOD_ADD(api::VerifyPassword, "/v1/user/verify_password", Post, Options, "UserFilter", "JsonFilter"); + METHOD_ADD(api::SendFunds, "/v1/user/transfer", Post, Options, "JsonFilter", "UserFilter"); //expects ["to"](string) and ["amount"](32 bits) + METHOD_ADD(api::VerifyPassword, "/v1/user/verify_password", Post, Options, "UserFilter", "JsonFilter"); //Meta Usage - METHOD_ADD(api::ChangePassword, "/v1/user/change_password", Patch, Options, "JsonFilter", "UserFilter"); //expects ["new_pass"](string) - METHOD_ADD(api::AdminChangePassword, "/v1/user/change_password", Patch, Options, "JsonFilter", "AdminFilter"); //expects ["name"](string) and ["new_pass"](string) - METHOD_ADD(api::SetBal, "/v1/admin/set_balance", Patch, Options, "JsonFilter", "AdminFilter"); //expects ["name"](string) and ["amount"](32 bits) - METHOD_ADD(api::AddBal, "/v1/admin/add_balance", Post, Options, "JsonFilter", "AdminFilter"); //expects ["name"](string) and ["amount"](32 bits) - METHOD_ADD(api::SubBal, "/v1/admin/sub_balance", Post, Options, "JsonFilter", "AdminFilter"); //expects ["name"](string) and ["amount"](32 bits) + METHOD_ADD(api::ChangePassword, "/v1/user/change_password", Patch, Options, "JsonFilter", "UserFilter"); //expects ["new_pass"](string) + METHOD_ADD(api::AdminChangePassword, "/v1/user/change_password", Patch, Options, "JsonFilter", "UserFilter"); //expects ["name"](string) and ["new_pass"](string) + METHOD_ADD(api::SetBal, "/v1/admin/set_balance", Patch, Options, "JsonFilter", "UserFilter"); //expects ["name"](string) and ["amount"](32 bits) + METHOD_ADD(api::AddBal, "/v1/admin/add_balance", Post, Options, "JsonFilter", "UserFilter"); //expects ["name"](string) and ["amount"](32 bits) + METHOD_ADD(api::SubBal, "/v1/admin/sub_balance", Post, Options, "JsonFilter", "UserFilter"); //expects ["name"](string) and ["amount"](32 bits) //System Usage METHOD_ADD(api::Help, "/v1/help", Get, Options); - METHOD_ADD(api::Close, "/v1/admin/shutdown", Post, Options, "AdminFilter", "JsonFilter"); + METHOD_ADD(api::Close, "/v1/admin/shutdown", Post, Options, "UserFilter", "JsonFilter"); METHOD_ADD(api::Contains, "/v1/user/exists?name={name}", Get, Options, "JsonFilter"); - METHOD_ADD(api::AdminVerifyAccount, "/v1/admin/verify_account", Post, Options, "AdminFilter", "JsonFilter"); + METHOD_ADD(api::AdminVerifyAccount, "/v1/admin/verify_account", Post, Options, "UserFilter", "JsonFilter"); //User Managment - METHOD_ADD(api::AddUser, "/v1/user/register", Post, Options); //expects ["name"](string) ["pass"](string) - METHOD_ADD(api::AdminAddUser, "/v1/admin/user/register", Post, Options, "JsonFilter", "AdminFilter"); //expects ["name"](string) ["balance"](32 bits) ["pass"](string) - METHOD_ADD(api::DelUser, "/v1/user/delete", Delete, Options, "UserFilter", "JsonFilter"); - METHOD_ADD(api::AdminDelUser, "/v1/admin/user/delete", Delete, Options, "JsonFilter", "AdminFilter"); //expects ["name"](string) + METHOD_ADD(api::AddUser, "/v1/user/register", Post, Options); //expects ["name"](string) ["pass"](string) + METHOD_ADD(api::AdminAddUser, "/v1/admin/user/register", Post, Options, "JsonFilter", "UserFilter"); //expects ["name"](string) ["balance"](32 bits) ["pass"](string) + METHOD_ADD(api::DelUser, "/v1/user/delete", Delete, Options, "UserFilter", "JsonFilter"); + METHOD_ADD(api::AdminDelUser, "/v1/admin/user/delete", Delete, Options, "JsonFilter", "UserFilter"); //expects ["name"](string) #endif METHOD_ADD(api::ApiProperties, "/properties", Get, Options); diff --git a/include/user_filter.h b/include/user_filter.h index 1da1df9..cf31ac3 100644 --- a/include/user_filter.h +++ b/include/user_filter.h @@ -5,19 +5,16 @@ using namespace drogon; -template -class UserFilter : public HttpFilter, false> +template +class UserFilter : public HttpFilter, false> { private: Bank &bank; public: - UserFilter(Bank &); + UserFilter(Bank &b); virtual void doFilter(const HttpRequestPtr &, FilterCallback &&, FilterChainCallback &&) override; -}; - -using UserFilterDefault = UserFilter; -using UserFilterSparse = UserFilter; \ No newline at end of file +}; \ No newline at end of file diff --git a/main.cpp b/main.cpp index e918eea..dfe2eea 100644 --- a/main.cpp +++ b/main.cpp @@ -101,9 +101,9 @@ int main(int argc, char **argv) } auto API = std::make_shared(bank); - auto user_filter_default = std::make_shared(bank); - auto user_filter_sparse = std::make_shared(bank); - auto admin_filter = std::make_shared(bank); + auto user_filter_default = std::make_shared>(bank); + auto user_filter_sparse = std::make_shared>(bank); + auto admin_filter = std::make_shared>(bank); auto json_resp_and_req_filter = std::make_shared>(); auto json_resp_filter = std::make_shared>(); diff --git a/src/admin_filter.cpp b/src/admin_filter.cpp deleted file mode 100644 index 6196113..0000000 --- a/src/admin_filter.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "admin_filter.h" - -AdminFilter::AdminFilter(Bank &b) : bank(b) {} - -void AdminFilter::doFilter(const HttpRequestPtr &req, - FilterCallback &&fcb, - FilterChainCallback &&fccb) -{ - std::string_view auth_header = req->getHeader("Authorization"); - if (auth_header.size() > 6) - { - if (auth_header.substr(0, 6) == "Basic ") - { - std::string_view base64_input = auth_header.substr(6); - char base64_result[(base64_input.size() * 3) / 4]; - size_t new_sz; - base64_decode(base64_input.data(), base64_input.size(), base64_result, &new_sz, 0); - - std::string_view results_view(base64_result, new_sz); - std::size_t middle = results_view.find(':'); - if (middle != std::string::npos) - { - base64_result[middle] = '\0'; - const std::string &username(results_view.substr(0, middle).data()); - if (bank.AdminVerifyAccount(username)) - { - base64_result[new_sz] = '\0'; - if (bank.VerifyPassword(std::move(username), results_view.substr(middle + 1))) - { - fccb(); - return; - } - } - } - } - } - const auto &resp = HttpResponse::newHttpJsonResponse("Invalid Credentials"); - resp->setStatusCode(k401Unauthorized); - fcb(resp); -} \ No newline at end of file diff --git a/src/user_filter.cpp b/src/user_filter.cpp index 7ba6660..caf22ad 100644 --- a/src/user_filter.cpp +++ b/src/user_filter.cpp @@ -1,14 +1,18 @@ #include "user_filter.h" +template +UserFilter::UserFilter(Bank &b) : bank(b) {} template <> -UserFilter::UserFilter(Bank &b) : bank(b) {} +UserFilter::UserFilter(Bank &b) : bank(b) {} template <> -UserFilter::UserFilter(Bank &b) : bank(b) {} +UserFilter::UserFilter(Bank &b) : bank(b) {} +template <> +UserFilter::UserFilter(Bank &b) : bank(b) {} -template -void UserFilter::doFilter(const HttpRequestPtr &req, - FilterCallback &&fcb, - FilterChainCallback &&fccb) +template +void UserFilter::doFilter(const HttpRequestPtr &req, + FilterCallback &&fcb, + FilterChainCallback &&fccb) { std::string_view auth_header = req->getHeader("Authorization"); if (auth_header.size() > 6) @@ -25,16 +29,32 @@ void UserFilter::doFilter(const HttpRequestPtr &req, if (middle != std::string::npos) { base64_result[middle] = '\0'; - base64_result[new_sz] = '\0'; const std::string &username(results_view.substr(0, middle).data()); - if (bank.VerifyPassword(username, results_view.substr(middle + 1))) + if constexpr (require_admin) { - if constexpr (set_body_flag) + base64_result[new_sz] = '\0'; + if (bank.VerifyPassword(username, results_view.substr(middle + 1))) { - req->setBody(username); //feels sub optimal + if constexpr (set_body_flag) + { + req->setBody(username); //feels sub optimal + } + fccb(); + return; + } + } + else + { + + if (bank.AdminVerifyAccount(username)) + { + base64_result[new_sz] = '\0'; + if (bank.VerifyPassword(std::move(username), results_view.substr(middle + 1))) + { + fccb(); + return; + } } - fccb(); - return; } } }