From 0e95b8f945b02770de35dfc06bdddbaf246631d2 Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 7 Jan 2022 17:33:22 +0100 Subject: [PATCH] Merged RBACController with RBACModel. --- modules/rbac/rbac_controller.cpp | 249 ++++++++++++++++++++++++++++- modules/rbac/rbac_controller.h | 33 +++- modules/rbac/rbac_model.cpp | 260 ------------------------------- modules/rbac/rbac_model.h | 40 ----- 4 files changed, 268 insertions(+), 314 deletions(-) delete mode 100644 modules/rbac/rbac_model.cpp delete mode 100644 modules/rbac/rbac_model.h diff --git a/modules/rbac/rbac_controller.cpp b/modules/rbac/rbac_controller.cpp index ba663ae..689e592 100644 --- a/modules/rbac/rbac_controller.cpp +++ b/modules/rbac/rbac_controller.cpp @@ -9,9 +9,14 @@ #include "core/http/request.h" #include "core/http/session_manager.h" #include "rbac_default_permissions.h" -#include "rbac_model.h" #include "modules/users/user.h" +#include "core/database/database.h" +#include "core/database/database_manager.h" +#include "core/database/query_builder.h" +#include "core/database/query_result.h" +#include "core/database/table_builder.h" + void RBACController::handle_request_main(Request *request) { } @@ -73,7 +78,7 @@ void RBACController::admin_handle_new_rank(Request *request) { rank->rank_permissions = rank_permissions; - RBACModel::get_singleton()->save_rank(rank); + db_save_rank(rank); _ranks[rank->id] = rank; @@ -139,7 +144,7 @@ void RBACController::admin_handle_edit_rank(Request *request) { rank->rank_permissions = rank_permissions; - RBACModel::get_singleton()->save_rank(rank); + db_save_rank(rank); data.messages.push_back("Save Success!"); } @@ -456,7 +461,7 @@ bool RBACController::admin_process_permission_editor_entry_edit_create_post(Requ //set this up in the form by default //perm->sort_order = request->get_parameter("sort_order").to_int(); - RBACModel::get_singleton()->save_permission(perm); + db_save_permission(perm); if (perm->id == 0) { RLOG_ERR("RBACController::admin_process_permission_editor_entry_edit_create_post: perm->id == 0!\n"); @@ -567,9 +572,9 @@ void RBACController::clear_registered_permissions() { } void RBACController::initialize() { - _ranks = RBACModel::get_singleton()->load_ranks(); - _default_rank_id = RBACModel::get_singleton()->get_default_rank(); - _default_user_rank_id = RBACModel::get_singleton()->get_default_user_rank(); + _ranks = db_load_ranks(); + _default_rank_id = db_get_default_rank(); + _default_user_rank_id = db_get_default_user_rank(); register_permissions(); } @@ -612,6 +617,233 @@ bool RBACController::continue_on_missing_default_rank() { return false; } +//DB + +std::map > RBACController::db_load_ranks() { + std::map > ranks; + + Ref qb = get_query_builder(); + + qb->select("id,name,name_internal,settings,base_permissions,rank_permissions")->from(_rbac_ranks_table); + Ref res = qb->run(); + + while (res->next_row()) { + Ref r; + r.instance(); + + r->id = res->get_cell_int(0); + r->name = res->get_cell_str(1); + r->name_internal = res->get_cell_str(2); + r->settings = res->get_cell_str(3); + r->base_permissions = res->get_cell_int(4); + r->rank_permissions = res->get_cell_int(5); + + ranks[r->id] = r; + } + + qb->reset(); + qb->select("id,rank_id,name,url,sort_order,permissions")->from(_rbac_permissions_table); + res = qb->run(); + + while (res->next_row()) { + Ref p; + p.instance(); + + p->id = res->get_cell_int(0); + p->rank_id = res->get_cell_int(1); + p->name = res->get_cell_str(2); + p->url = res->get_cell_str(3); + p->sort_order = res->get_cell_int(4); + p->permissions = res->get_cell_int(5); + + Ref r = ranks[p->rank_id]; + + if (!r.is_valid()) { + RLOG_ERR("RBACModel::load_permissions: !r.is_valid()!"); + continue; + } + + r->permissions.push_back(p); + } + + for (std::map >::iterator i = ranks.begin(); i != ranks.end(); ++i) { + Ref r = i->second; + + if (r.is_valid()) { + r->sort_permissions(); + } + } + + return ranks; +} + +void RBACController::db_save(const Ref &rank) { + db_save_rank(rank); + + for (int i = 0; i < rank->permissions.size(); ++i) { + Ref permission = rank->permissions[i]; + + int rid = rank->id; + + if (permission->rank_id != rid) { + permission->rank_id = rid; + } + + db_save_permission(permission); + } +} + +void RBACController::db_save_rank(const Ref &rank) { + Ref qb = get_query_builder(); + + if (rank->id == 0) { + qb->insert(_rbac_ranks_table, "name,name_internal,settings,base_permissions,rank_permissions")->values(); + qb->val(rank->name)->val(rank->name_internal)->val(rank->settings)->val(rank->base_permissions)->val(rank->rank_permissions); + qb->cvalues(); + qb->select_last_insert_id(); + Ref res = qb->run(); + //qb->print(); + + Ref r = rank; + + r->id = res->get_last_insert_rowid(); + } else { + qb->update(_rbac_ranks_table)->set(); + qb->setp("name", rank->name); + qb->setp("name_internal", rank->name_internal); + qb->setp("settings", rank->settings); + qb->setp("base_permissions", rank->base_permissions); + qb->setp("rank_permissions", rank->rank_permissions); + qb->cset(); + qb->where()->wp("id", rank->id); + qb->end_command(); + qb->run_query(); + //qb->print(); + } +} + +void RBACController::db_save_permission(const Ref &permission) { + Ref qb = get_query_builder(); + + if (permission->id == 0) { + qb->insert(_rbac_permissions_table, "rank_id,name,url,sort_order,permissions")->values(); + qb->val(permission->rank_id)->val(permission->name)->val(permission->url); + qb->val(permission->sort_order)->val(permission->permissions); + qb->cvalues(); + qb->select_last_insert_id(); + Ref res = qb->run(); + //qb->print(); + + Ref r = permission; + + r->id = res->get_last_insert_rowid(); + } else { + qb->update(_rbac_permissions_table)->set(); + qb->setp("rank_id", permission->rank_id); + qb->setp("name", permission->name); + qb->setp("url", permission->url); + qb->setp("sort_order", permission->sort_order); + qb->setp("permissions", permission->permissions); + qb->cset(); + qb->where()->wp("id", permission->id); + qb->end_command(); + qb->run_query(); + //qb->print(); + } +} + +int RBACController::db_get_default_rank() { + //todo, load this, and save it to a table (probably a new settings class) + return 3; +} + +int RBACController::db_get_default_user_rank() { + //todo, load this, and save it to a table (probably a new settings class) + return 2; +} + +String RBACController::db_get_redirect_url() { + //todo, load this, and save it to a table (probably a new settings class) + return String("/user/login"); +} + +void RBACController::create_table() { + Ref tb = get_table_builder(); + + tb->create_table(_rbac_ranks_table); + tb->integer("id")->auto_increment()->next_row(); + tb->varchar("name", 60)->not_null()->next_row(); + tb->varchar("name_internal", 100)->not_null()->next_row(); + tb->varchar("settings", 200)->not_null()->next_row(); + tb->integer("base_permissions")->not_null()->next_row(); + tb->integer("rank_permissions")->not_null()->next_row(); + tb->primary_key("id"); + tb->ccreate_table(); + //tb->run_query(); + //tb->print(); + + //tb->result = ""; + + tb->create_table(_rbac_permissions_table); + tb->integer("id")->auto_increment()->next_row(); + tb->integer("rank_id")->not_null()->next_row(); + tb->varchar("name", 60)->not_null()->next_row(); + tb->varchar("url", 100)->not_null()->next_row(); + tb->integer("sort_order")->not_null()->next_row(); + tb->integer("permissions")->not_null()->next_row(); + + tb->primary_key("id"); + tb->foreign_key("rank_id")->references(_rbac_ranks_table, "id"); + tb->ccreate_table(); + tb->run_query(); + //tb->print(); +} +void RBACController::drop_table() { + Ref tb = get_table_builder(); + + tb->drop_table_if_exists(_rbac_permissions_table)->drop_table_if_exists(_rbac_ranks_table)->run_query(); + //tb->print(); +} +void RBACController::migrate() { + drop_table(); + create_table(); + create_default_entries(); +} + +void RBACController::create_default_entries() { + Ref admin; + admin.instance(); + + admin->name = "Admin"; + admin->base_permissions = User::PERMISSION_ALL; + admin->rank_permissions = RBAC_RANK_PERMISSION_ADMIN_PANEL; + + db_save_rank(admin); + + Ref user; + user.instance(); + + user->name = "User"; + //user->base_permissions = User::PERMISSION_READ; + //user->rank_permissions = 0; + + //temporary! + user->base_permissions = User::PERMISSION_ALL; + user->rank_permissions = RBAC_RANK_PERMISSION_ADMIN_PANEL; + + db_save_rank(user); + + Ref guest; + guest.instance(); + + guest->name = "Guest"; + guest->base_permissions = User::PERMISSION_READ; + guest->rank_permissions = RBAC_RANK_PERMISSION_USE_REDIRECT; + + db_save_rank(guest); +} + + RBACController *RBACController::get_singleton() { return _self; } @@ -626,6 +858,9 @@ RBACController::RBACController() : _default_rank_id = 0; _default_user_rank_id = 0; + _rbac_ranks_table = "rbac_ranks"; + _rbac_permissions_table = "rbac_permissions"; + _self = this; } diff --git a/modules/rbac/rbac_controller.h b/modules/rbac/rbac_controller.h index aec7d55..a845648 100644 --- a/modules/rbac/rbac_controller.h +++ b/modules/rbac/rbac_controller.h @@ -50,15 +50,15 @@ public: }; void admin_permission_editor(Request *request); - void admin_render_permission_editor_main_view(Request *request, RBACAdminEditPermissionView* data); - void admin_render_permission_editor_entry_edit_create_view(Request *request, RBACAdminEditPermissionView* data); - bool admin_process_permission_editor_entry_edit_create_post(Request *request, RBACAdminEditPermissionView* data); + void admin_render_permission_editor_main_view(Request *request, RBACAdminEditPermissionView *data); + void admin_render_permission_editor_entry_edit_create_view(Request *request, RBACAdminEditPermissionView *data); + bool admin_process_permission_editor_entry_edit_create_post(Request *request, RBACAdminEditPermissionView *data); void admin_render_rank_list(Request *request); void admin_render_rank_editor(Request *request); - void register_permission(const String& name, const int val); - void register_rank_permission(const String& name, const int val); + void register_permission(const String &name, const int val); + void register_rank_permission(const String &name, const int val); void clear_registered_permissions(); void initialize(); @@ -68,7 +68,7 @@ public: int get_default_user_rank_id(); Ref get_default_user_rank(); - + int get_default_rank_id(); Ref get_default_rank(); @@ -76,6 +76,22 @@ public: bool continue_on_missing_default_rank(); + // db + + virtual std::map > db_load_ranks(); + + virtual void db_save(const Ref &rank); + virtual void db_save_rank(const Ref &rank); + virtual void db_save_permission(const Ref &permission); + virtual int db_get_default_rank(); + virtual int db_get_default_user_rank(); + virtual String db_get_redirect_url(); + + void create_table(); + void drop_table(); + void migrate(); + void create_default_entries(); + static RBACController *get_singleton(); RBACController(); @@ -96,12 +112,15 @@ protected: PermissionEntry() { } - PermissionEntry(const String& p_name, const int p_val) { + PermissionEntry(const String &p_name, const int p_val) { name = p_name; value = p_val; } }; + String _rbac_ranks_table; + String _rbac_permissions_table; + Vector _registered_permissions; Vector _registered_rank_permissions; }; diff --git a/modules/rbac/rbac_model.cpp b/modules/rbac/rbac_model.cpp deleted file mode 100644 index 5cfa220..0000000 --- a/modules/rbac/rbac_model.cpp +++ /dev/null @@ -1,260 +0,0 @@ -#include "rbac_model.h" - -#include "core/database/database.h" -#include "core/database/database_manager.h" -#include "core/database/query_builder.h" -#include "core/database/query_result.h" -#include "core/database/table_builder.h" - -#define RBAC_RANK_TABLE "rbac_ranks" -#define RBAC_PERMISSION_TABLE "rbac_permissions" - -#include "rbac_default_permissions.h" - -#include "modules/users/user.h" - -std::map > RBACModel::load_ranks() { - std::map > ranks; - - Ref qb = DatabaseManager::get_singleton()->ddb->get_query_builder(); - - qb->select("id,name,name_internal,settings,base_permissions,rank_permissions")->from(RBAC_RANK_TABLE); - Ref res = qb->run(); - - while (res->next_row()) { - Ref r; - r.instance(); - - r->id = res->get_cell_int(0); - r->name = res->get_cell_str(1); - r->name_internal = res->get_cell_str(2); - r->settings = res->get_cell_str(3); - r->base_permissions = res->get_cell_int(4); - r->rank_permissions = res->get_cell_int(5); - - ranks[r->id] = r; - } - - qb->reset(); - qb->select("id,rank_id,name,url,sort_order,permissions")->from(RBAC_PERMISSION_TABLE); - res = qb->run(); - - while (res->next_row()) { - Ref p; - p.instance(); - - p->id = res->get_cell_int(0); - p->rank_id = res->get_cell_int(1); - p->name = res->get_cell_str(2); - p->url = res->get_cell_str(3); - p->sort_order = res->get_cell_int(4); - p->permissions = res->get_cell_int(5); - - Ref r = ranks[p->rank_id]; - - if (!r.is_valid()) { - RLOG_ERR("RBACModel::load_permissions: !r.is_valid()!"); - continue; - } - - r->permissions.push_back(p); - } - - for (std::map >::iterator i = ranks.begin(); i != ranks.end(); ++i) { - Ref r = i->second; - - if (r.is_valid()) { - r->sort_permissions(); - } - } - - return ranks; -} - -void RBACModel::save(const Ref &rank) { - save_rank(rank); - - for (int i = 0; i < rank->permissions.size(); ++i) { - Ref permission = rank->permissions[i]; - - int rid = rank->id; - - if (permission->rank_id != rid) { - permission->rank_id = rid; - } - - save_permission(permission); - } -} - -void RBACModel::save_rank(const Ref &rank) { - Ref qb = DatabaseManager::get_singleton()->ddb->get_query_builder(); - - if (rank->id == 0) { - qb->insert(RBAC_RANK_TABLE, "name,name_internal,settings,base_permissions,rank_permissions")->values(); - qb->val(rank->name)->val(rank->name_internal)->val(rank->settings)->val(rank->base_permissions)->val(rank->rank_permissions); - qb->cvalues(); - qb->select_last_insert_id(); - Ref res = qb->run(); - //qb->print(); - - Ref r = rank; - - r->id = res->get_last_insert_rowid(); - } else { - qb->update(RBAC_RANK_TABLE)->set(); - qb->setp("name", rank->name); - qb->setp("name_internal", rank->name_internal); - qb->setp("settings", rank->settings); - qb->setp("base_permissions", rank->base_permissions); - qb->setp("rank_permissions", rank->rank_permissions); - qb->cset(); - qb->where()->wp("id", rank->id); - qb->end_command(); - qb->run_query(); - //qb->print(); - } -} - -void RBACModel::save_permission(const Ref &permission) { - Ref qb = DatabaseManager::get_singleton()->ddb->get_query_builder(); - - if (permission->id == 0) { - qb->insert(RBAC_PERMISSION_TABLE, "rank_id,name,url,sort_order,permissions")->values(); - qb->val(permission->rank_id)->val(permission->name)->val(permission->url); - qb->val(permission->sort_order)->val(permission->permissions); - qb->cvalues(); - qb->select_last_insert_id(); - Ref res = qb->run(); - //qb->print(); - - Ref r = permission; - - r->id = res->get_last_insert_rowid(); - } else { - qb->update(RBAC_PERMISSION_TABLE)->set(); - qb->setp("rank_id", permission->rank_id); - qb->setp("name", permission->name); - qb->setp("url", permission->url); - qb->setp("sort_order", permission->sort_order); - qb->setp("permissions", permission->permissions); - qb->cset(); - qb->where()->wp("id", permission->id); - qb->end_command(); - qb->run_query(); - //qb->print(); - } -} - -int RBACModel::get_default_rank() { - //todo, load this, and save it to a table (probably a new settings class) - return 3; -} - -int RBACModel::get_default_user_rank() { - //todo, load this, and save it to a table (probably a new settings class) - return 2; -} - -String RBACModel::get_redirect_url() { - //todo, load this, and save it to a table (probably a new settings class) - return String("/user/login"); -} - -void RBACModel::create_table() { - Ref tb = DatabaseManager::get_singleton()->ddb->get_table_builder(); - - tb->create_table(RBAC_RANK_TABLE); - tb->integer("id")->auto_increment()->next_row(); - tb->varchar("name", 60)->not_null()->next_row(); - tb->varchar("name_internal", 100)->not_null()->next_row(); - tb->varchar("settings", 200)->not_null()->next_row(); - tb->integer("base_permissions")->not_null()->next_row(); - tb->integer("rank_permissions")->not_null()->next_row(); - tb->primary_key("id"); - tb->ccreate_table(); - //tb->run_query(); - //tb->print(); - - //tb->result = ""; - - tb->create_table(RBAC_PERMISSION_TABLE); - tb->integer("id")->auto_increment()->next_row(); - tb->integer("rank_id")->not_null()->next_row(); - tb->varchar("name", 60)->not_null()->next_row(); - tb->varchar("url", 100)->not_null()->next_row(); - tb->integer("sort_order")->not_null()->next_row(); - tb->integer("permissions")->not_null()->next_row(); - - tb->primary_key("id"); - tb->foreign_key("rank_id")->references(RBAC_RANK_TABLE, "id"); - tb->ccreate_table(); - tb->run_query(); - //tb->print(); -} -void RBACModel::drop_table() { - Ref tb = DatabaseManager::get_singleton()->ddb->get_table_builder(); - - tb->drop_table_if_exists(RBAC_PERMISSION_TABLE)->drop_table_if_exists(RBAC_RANK_TABLE)->run_query(); - //tb->print(); -} -void RBACModel::migrate() { - drop_table(); - create_table(); - create_default_entries(); -} - -void RBACModel::create_default_entries() { - Ref admin; - admin.instance(); - - admin->name = "Admin"; - admin->base_permissions = User::PERMISSION_ALL; - admin->rank_permissions = RBAC_RANK_PERMISSION_ADMIN_PANEL; - - save_rank(admin); - - Ref user; - user.instance(); - - user->name = "User"; - //user->base_permissions = User::PERMISSION_READ; - //user->rank_permissions = 0; - - //temporary! - user->base_permissions = User::PERMISSION_ALL; - user->rank_permissions = RBAC_RANK_PERMISSION_ADMIN_PANEL; - - save_rank(user); - - Ref guest; - guest.instance(); - - guest->name = "Guest"; - guest->base_permissions = User::PERMISSION_READ; - guest->rank_permissions = RBAC_RANK_PERMISSION_USE_REDIRECT; - - save_rank(guest); -} - -RBACModel *RBACModel::get_singleton() { - return _self; -} - -RBACModel::RBACModel() : - WebNode() { - - if (_self) { - printf("RBACModel::RBACModel(): Error! self is not null!/n"); - } - - _self = this; -} - -RBACModel::~RBACModel() { - if (_self == this) { - _self = nullptr; - } -} - -RBACModel *RBACModel::_self = nullptr; diff --git a/modules/rbac/rbac_model.h b/modules/rbac/rbac_model.h deleted file mode 100644 index 69d1a65..0000000 --- a/modules/rbac/rbac_model.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef RBAC_MODEL_H -#define RBAC_MODEL_H - -#include "core/http/web_node.h" - -#include -#include "core/containers/vector.h" -#include "core/string.h" - -#include "rbac_permission.h" -#include "rbac_rank.h" - -class RBACModel : public WebNode { - RCPP_OBJECT(RBACModel, WebNode); - -public: - virtual std::map > load_ranks(); - - virtual void save(const Ref &rank); - virtual void save_rank(const Ref &rank); - virtual void save_permission(const Ref &permission); - virtual int get_default_rank(); - virtual int get_default_user_rank(); - virtual String get_redirect_url(); - - void create_table(); - void drop_table(); - void migrate(); - virtual void create_default_entries(); - - static RBACModel *get_singleton(); - - RBACModel(); - ~RBACModel(); - -protected: - static RBACModel *_self; -}; - -#endif \ No newline at end of file