From 6e14b46d90d29b3f6ebcc9d03a1bbb42fd62c1e4 Mon Sep 17 00:00:00 2001 From: keqingmoe Date: Sat, 28 Dec 2024 14:54:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD=EF=BC=8C=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=E5=92=8C=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/db/auth.h | 2 +- include/server/auth.h | 12 ++++-- include/server/response.h | 7 +++- src/db/auth.cpp | 11 +++-- src/server/auth/admin.c | 87 +++++++++++++++++++++++++++++++++++++++ src/server/auth/auth.c | 3 +- src/server/response.c | 28 ++++++++++++- 7 files changed, 136 insertions(+), 14 deletions(-) create mode 100644 src/server/auth/admin.c diff --git a/include/db/auth.h b/include/db/auth.h index 7db5f35..eb60a47 100644 --- a/include/db/auth.h +++ b/include/db/auth.h @@ -26,7 +26,7 @@ extern "C" int set_admin_password_hash(const char* hash); - int get_admin_password_hash(char** result); + int admin_login(const char* password, int* result); int has_admin_password_hash(int* result); diff --git a/include/server/auth.h b/include/server/auth.h index 6aa801c..17d7ade 100644 --- a/include/server/auth.h +++ b/include/server/auth.h @@ -3,10 +3,16 @@ #include "server/types.h" -int login_handler(mg_connection* conn, void* cbdata); -int register_handler(mg_connection* conn, void* cbdata); -int delete_handler(mg_connection* conn, void* cbdata); +int user_login_handler(mg_connection* conn, void* cbdata); +int user_register_handler(mg_connection* conn, void* cbdata); +int user_delete_handler(mg_connection* conn, void* cbdata); +int user_repasswd_handler(mg_connection* conn, void* cbdata); +int user_logout_handler(mg_connection* conn, void* cbdata); +int user_permission_handler(mg_connection* conn, void* cbdata); +int admin_handler(mg_connection* conn, void* cbdata); extern char* secret; +extern char* admin_session; + #endif // SERVER_AUTH_H \ No newline at end of file diff --git a/include/server/response.h b/include/server/response.h index d930bb4..e6ecfce 100644 --- a/include/server/response.h +++ b/include/server/response.h @@ -11,7 +11,6 @@ void res_auth_fail(mg_connection* conn); void res_check_exist_fail(mg_connection* conn); void res_user_exist(mg_connection* conn); void res_not_exist(mg_connection* conn); -void res_check_permission_fail(mg_connection* conn); void res_permission_denied(mg_connection* conn); void res_need_user_id(mg_connection* conn); void res_need_password(mg_connection* conn); @@ -37,6 +36,12 @@ void res_repasswd(mg_connection* conn); void res_logout_fail(mg_connection* conn); void res_logout(mg_connection* conn); +void res_check_permission_fail(mg_connection* conn); +void res_permission(mg_connection* conn, int permission); + +void res_repermission_fail(mg_connection* conn); +void res_repermission(mg_connection* conn); + void res_(mg_connection* conn); void res_(mg_connection* conn); void res_(mg_connection* conn); diff --git a/src/db/auth.cpp b/src/db/auth.cpp index 9f43e2b..c62641b 100644 --- a/src/db/auth.cpp +++ b/src/db/auth.cpp @@ -160,17 +160,16 @@ extern "C" return 1; } - int get_admin_password_hash(char** result) + int admin_login(const char* password, int* result) { auto value = std::string{}; auto status = user_db->Get(leveldb::ReadOptions{}, "admin_password_hash", &value); - if (status.ok()) { - *result = strdup(value.c_str()); - return 1; - } else { - std::println(stderr, "Failed to get admin password hash: {}", status.ToString()); + if (!status.ok()) { + std::println(stderr, "Failed to login: {}", status.ToString()); return 0; } + *result = validate_password(password, value.data()); + return 1; } int has_admin_password_hash(int* result) diff --git a/src/server/auth/admin.c b/src/server/auth/admin.c new file mode 100644 index 0000000..21def19 --- /dev/null +++ b/src/server/auth/admin.c @@ -0,0 +1,87 @@ +#include "server/auth.h" +#include "server/response.h" +#include "server/util.h" + +#include "db/auth.h" + +#include "hash/hash.h" + +#include + +#include + +#include +#include +#include + +typedef struct +{ + char* password; +} admin_form_t; + +static void admin_form_dtor(admin_form_t* form) +{ + if (form->password) free(form->password); +} + +static int field_found(const char* key, const char* filename, char* path, size_t pathlen, void* user_data) +{ + return MG_FORM_FIELD_HANDLE_GET; +} + +static int field_get(const char* key, const char* value, size_t valuelen, void* user_data) +{ + admin_form_t* form = (admin_form_t*)user_data; + if (strcmp(key, "password") == 0) { + form->password = kqm_strndup(value, valuelen); + return MG_FORM_FIELD_HANDLE_ABORT; + } + return MG_FORM_FIELD_HANDLE_GET; +} + +int admin_handler(mg_connection* conn, void* cbdata) +{ + const mg_request_info* post_body = mg_get_request_info(conn); + + if (post_body == NULL) { + res_null_req(conn); + return 1; + } + + if (strcmp(post_body->request_method, "POST")) { + res_must_post(conn); + return 1; + } + + admin_form_t form = {NULL}; + + mg_form_data_handler admin_callback = { + .field_found = field_found, + .field_get = field_get, + .field_store = NULL, + .user_data = &form, + }; + + mg_handle_form_request(conn, &admin_callback); + + if (!form.password) { + res_need_password(conn); + admin_form_dtor(&form); + return 1; + } + + int result; + int flag = admin_login(form.password, &result); + if (!flag) { + res_login_fail(conn); + } else if (!result) { + res_incorrect(conn); + } else { + if (admin_session) free(admin_session); + admin_session = kqm_random_password(16); + res_login(conn, admin_session); + } + + admin_form_dtor(&form); + return 1; +} diff --git a/src/server/auth/auth.c b/src/server/auth/auth.c index 25faddc..efcf777 100644 --- a/src/server/auth/auth.c +++ b/src/server/auth/auth.c @@ -3,4 +3,5 @@ #include char* secret = NULL; -char* admin_password_hash = NULL; + +char* admin_session = NULL; diff --git a/src/server/response.c b/src/server/response.c index 5cfc9f0..4856937 100644 --- a/src/server/response.c +++ b/src/server/response.c @@ -199,5 +199,29 @@ void res_logout(mg_connection* conn) "{\"success\":\"logout success\"}"); } -void res_(mg_connection* conn); -void res_(mg_connection* conn); \ No newline at end of file +void res_permission(mg_connection* conn, int permission) +{ + mg_printf(conn, + "HTTP/1.1 200 OK\r\n" + "Content-Type: application/json\r\n" + "Access-Control-Allow-Origin: *\r\n\r\n" + "{\"success\":\"query success\", \"permission\":\"%d\"}", + permission); +} + +void res_repermission_fail(mg_connection* conn) +{ + mg_printf(conn, + "HTTP/1.1 500 Internal Server Error\r\n" + "Content-Type: application/json\r\n" + "Access-Control-Allow-Origin: *\r\n\r\n" + "{\"error\":\"failed to repermission\"}"); +} +void res_repermission(mg_connection* conn) +{ + mg_printf(conn, + "HTTP/1.1 200 OK\r\n" + "Content-Type: application/json\r\n" + "Access-Control-Allow-Origin: *\r\n\r\n" + "{\"success\":\"repermission success\"}"); +}