From 93779768fc5ea5bcf7f48e4040b9ad10a18f3c4a Mon Sep 17 00:00:00 2001 From: keqingmoe Date: Sun, 29 Dec 2024 20:58:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=93=8D=E4=BD=9C=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20JSON=20=E5=AD=98=E5=82=A8=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E7=AE=80=E5=8C=96=E7=94=A8=E6=88=B7=20ID=20?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=8C=E5=A2=9E=E5=BC=BA=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E5=92=8C=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/db/auth.cpp | 95 +++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 51 deletions(-) diff --git a/src/db/auth.cpp b/src/db/auth.cpp index 6030e69..494b53a 100644 --- a/src/db/auth.cpp +++ b/src/db/auth.cpp @@ -7,26 +7,13 @@ #include #include +#include + using leveldb_ptr = leveldb::DB*; auto user_db = leveldb_ptr{nullptr}; auto iter_round = 10000; -auto filter(const std::string_view id) -> bool -{ - return id.contains(':'); -} - -auto mangle_user_id(const std::string_view id) -> std::string -{ - return std::format("{}:user_id", id); -} - -auto mangle_permission(const std::string_view id) -> std::string -{ - return std::format("{}:permission", id); -} - extern "C" { auto open_user_db() -> int @@ -35,7 +22,7 @@ extern "C" opts.create_if_missing = true; - auto status = leveldb::DB::Open(opts, "db/user", &user_db); + auto status = leveldb::DB::Open(opts, "db/users", &user_db); if (!status.ok()) { std::println(stderr, "Failed to open user database: {}", status.ToString()); @@ -51,10 +38,8 @@ extern "C" auto check_user_exists(const char* user_id, int* result) -> int { - if (filter(user_id)) return 0; - auto value = std::string{}; - auto status = user_db->Get(leveldb::ReadOptions{}, mangle_user_id(user_id), &value); + auto status = user_db->Get(leveldb::ReadOptions{}, user_id, &value); if (status.ok()) { *result = 1; } else if (status.IsNotFound()) { @@ -68,10 +53,16 @@ extern "C" auto set_user_password(const char* user_id, const char* password) -> int { - if (filter(user_id)) return 0; + auto value = std::string{}; + auto status = user_db->Get(leveldb::ReadOptions{}, user_id, &value); + if (!status.ok()) { + std::println(stderr, "Failed to set user password: {}", status.ToString()); + return 0; + } + auto json = nlohmann::json::parse(value); + json["hash"] = generate_hash(password, iter_round); - auto hash = generate_hash(password, iter_round); - auto status = user_db->Put(leveldb::WriteOptions{}, mangle_user_id(user_id), hash); + status = user_db->Put(leveldb::WriteOptions{}, user_id, json.dump()); if (!status.ok()) { std::println(stderr, "Failed to set user password: {}", status.ToString()); return 0; @@ -81,26 +72,24 @@ extern "C" auto login(const char* user_id, const char* password, int* result) -> int { - if (filter(user_id)) return 0; - auto value = std::string{}; - auto status = user_db->Get(leveldb::ReadOptions{}, mangle_user_id(user_id), &value); + auto status = user_db->Get(leveldb::ReadOptions{}, user_id, &value); if (!status.ok()) { if (!status.IsNotFound()) std::println(stderr, "Failed to login: {}", status.ToString()); return 0; } - *result = validate_password(password, value.data()); + auto json = nlohmann::json::parse(value); + *result = validate_password(password, json["hash"]); return 1; } int registe(const char* user_id, const char* password) { - if (filter(user_id)) return 0; - - auto batch = leveldb::WriteBatch{}; - batch.Put(mangle_user_id(user_id), generate_hash(password, iter_round)); - batch.Put(mangle_permission(user_id), "2"); - auto status = user_db->Write(leveldb::WriteOptions{}, &batch); + auto json = nlohmann::json{ + {"hash", generate_hash(password, iter_round)}, + {"permission", 2} + }; + auto status = user_db->Put(leveldb::WriteOptions{}, user_id, json.dump()); if (!status.ok()) { std::println(stderr, "Failed to register: {}", status.ToString()); return 0; @@ -110,12 +99,7 @@ extern "C" auto delete_user(const char* user_id) -> int { - if (filter(user_id)) return 0; - - auto batch = leveldb::WriteBatch{}; - batch.Delete(mangle_user_id(user_id)); - batch.Delete(mangle_permission(user_id)); - auto status = user_db->Write(leveldb::WriteOptions{}, &batch); + auto status = user_db->Delete(leveldb::WriteOptions{}, user_id); if (!status.ok()) { std::println(stderr, "Failed to delete: {}", status.ToString()); return 0; @@ -125,24 +109,29 @@ extern "C" int get_user_permission(const char* user_id, int* result) { - if (filter(user_id)) return 0; - auto value = std::string{}; - auto status = user_db->Get(leveldb::ReadOptions{}, mangle_permission(user_id), &value); - if (status.ok()) { - *result = std::stoi(value); - } else { + auto status = user_db->Get(leveldb::ReadOptions{}, user_id, &value); + if (!status.ok()) { if (!status.IsNotFound()) std::println(stderr, "Failed to get user permission: {}", status.ToString()); return 0; } + auto json = nlohmann::json::parse(value); + json["permission"].get_to(*result); return 1; } int set_user_permission(const char* user_id, int permission) { - if (filter(user_id)) return 0; + auto value = std::string{}; + auto status = user_db->Get(leveldb::ReadOptions{}, user_id, &value); + if (!status.ok()) { + std::println(stderr, "Failed to set user password: {}", status.ToString()); + return 0; + } + auto json = nlohmann::json::parse(value); + json["permission"] = permission; - auto status = user_db->Put(leveldb::WriteOptions{}, mangle_permission(user_id), std::to_string(permission)); + status = user_db->Put(leveldb::WriteOptions{}, user_id, json.dump()); if (!status.ok()) { std::println(stderr, "Failed to set user permission: {}", status.ToString()); return 0; @@ -152,8 +141,10 @@ extern "C" int set_admin_password(const char* password) { - auto hash = generate_hash(password, iter_round); - auto status = user_db->Put(leveldb::WriteOptions{}, "admin_password_hash", hash); + auto json = nlohmann::json{ + {"admin_password_hash", generate_hash(password, iter_round)} + }; + auto status = user_db->Put(leveldb::WriteOptions{}, "@", json.dump()); if (!status.ok()) { std::println(stderr, "Failed to set admin password: {}", status.ToString()); return 0; @@ -164,19 +155,21 @@ extern "C" int admin_login(const char* password, int* result) { auto value = std::string{}; - auto status = user_db->Get(leveldb::ReadOptions{}, "admin_password_hash", &value); + auto status = user_db->Get(leveldb::ReadOptions{}, "@", &value); if (!status.ok()) { std::println(stderr, "Failed to login admin: {}", status.ToString()); return 0; } - *result = validate_password(password, value.data()); + auto json = nlohmann::json::parse(value); + json["admin_password_hash"].get_to(value); + *result = validate_password(password, value); return 1; } int has_admin_password(int* result) { auto value = std::string{}; - auto status = user_db->Get(leveldb::ReadOptions{}, "admin_password_hash", &value); + auto status = user_db->Get(leveldb::ReadOptions{}, "@", &value); if (status.ok()) { *result = 1; } else if (status.IsNotFound()) {