diff --git a/include/admin_filter.h b/include/admin_filter.h index 6cb4f2f..6014051 100644 --- a/include/admin_filter.h +++ b/include/admin_filter.h @@ -16,4 +16,4 @@ public: virtual void doFilter(const HttpRequestPtr &, FilterCallback &&, FilterChainCallback &&) override; -}; \ No newline at end of file +}; diff --git a/include/bank_api.h b/include/bank_api.h index 2bcafdb..d54d432 100644 --- a/include/bank_api.h +++ b/include/bank_api.h @@ -45,19 +45,19 @@ public: //Usage METHOD_ADD(api::GetBal, "/v1/user/balance?name={name}", Get, Options); #if MAX_LOG_SIZE > 0 - METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options, "UserFilter"); + METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options, "UserFilterDefault"); #else METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options); #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"); + METHOD_ADD(api::SendFunds, "/v1/user/transfer", Post, Options, "JsonFilter", "UserFilterDefault"); //expects ["to"](string) and ["amount"](32 bits) + METHOD_ADD(api::VerifyPassword, "/v1/user/verify_password", Post, Options, "UserFilterSparse"); //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", "UserFilterDefault"); //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) //System Usage METHOD_ADD(api::Help, "/v1/help", Get, Options); @@ -69,7 +69,7 @@ public: //User Managment METHOD_ADD(api::AddUser, "/v1/user/register", Post, Options, "JsonFilter"); //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/delete", Delete, Options, "UserFilter"); + METHOD_ADD(api::DelUser, "/v1/delete", Delete, Options, "UserFilterDefault"); METHOD_ADD(api::AdminDelUser, "/v1/admin/delete", Delete, Options, "JsonFilter", "AdminFilter"); //expects ["name"](string) #endif METHOD_ADD(api::ApiVersion, "/version", Get, Options); diff --git a/include/user_filter.h b/include/user_filter.h index 30fa064..1da1df9 100644 --- a/include/user_filter.h +++ b/include/user_filter.h @@ -5,7 +5,8 @@ using namespace drogon; -class UserFilter : public HttpFilter +template +class UserFilter : public HttpFilter, false> { private: Bank &bank; @@ -16,4 +17,7 @@ public: virtual void doFilter(const HttpRequestPtr &, FilterCallback &&, FilterChainCallback &&) override; -}; \ No newline at end of file +}; + +using UserFilterDefault = UserFilter; +using UserFilterSparse = UserFilter; \ No newline at end of file diff --git a/main.cpp b/main.cpp index 7f217f3..b57a84d 100644 --- a/main.cpp +++ b/main.cpp @@ -101,7 +101,8 @@ int main(int argc, char **argv) } auto API = std::make_shared(bank); - auto user_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 accept_filter = std::make_shared(); @@ -111,7 +112,8 @@ int main(int argc, char **argv) }); app() .loadConfigFile(config_location) - .registerFilter(user_filter) + .registerFilter(user_filter_default) + .registerFilter(user_filter_sparse) .registerFilter(admin_filter) .registerController(API) #if MULTI_THREADED diff --git a/src/admin_filter.cpp b/src/admin_filter.cpp index 7c009af..6196113 100644 --- a/src/admin_filter.cpp +++ b/src/admin_filter.cpp @@ -21,13 +21,12 @@ void AdminFilter::doFilter(const HttpRequestPtr &req, if (middle != std::string::npos) { base64_result[middle] = '\0'; - const std::string &username = results_view.substr(0, middle).data(); + 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))) { - req->setBody(username); //feels sub optimal fccb(); return; } diff --git a/src/user_filter.cpp b/src/user_filter.cpp index b09be19..7ba6660 100644 --- a/src/user_filter.cpp +++ b/src/user_filter.cpp @@ -1,10 +1,14 @@ #include "user_filter.h" -UserFilter::UserFilter(Bank &b) : bank(b) {} +template <> +UserFilter::UserFilter(Bank &b) : bank(b) {} +template <> +UserFilter::UserFilter(Bank &b) : bank(b) {} -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) @@ -22,10 +26,13 @@ void UserFilter::doFilter(const HttpRequestPtr &req, { base64_result[middle] = '\0'; base64_result[new_sz] = '\0'; - const std::string &username = results_view.substr(0, middle).data(); + const std::string &username(results_view.substr(0, middle).data()); 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; }