2021-10-31 21:45:12 +01:00
|
|
|
#include "rbac_controller.h"
|
|
|
|
|
2021-11-01 23:48:25 +01:00
|
|
|
#include "core/error_macros.h"
|
|
|
|
|
2021-10-31 21:45:12 +01:00
|
|
|
#include "core/html/form_validator.h"
|
|
|
|
#include "core/html/html_builder.h"
|
|
|
|
#include "core/http/cookie.h"
|
|
|
|
#include "core/http/http_session.h"
|
|
|
|
#include "core/http/request.h"
|
|
|
|
#include "core/http/session_manager.h"
|
|
|
|
#include "rbac_model.h"
|
|
|
|
|
|
|
|
void RBACController::handle_request_main(Request *request) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBACController::create_validators() {
|
|
|
|
}
|
|
|
|
|
2021-11-01 15:12:09 +01:00
|
|
|
void RBACController::admin_handle_request_main(Request *request) {
|
2021-11-01 21:21:03 +01:00
|
|
|
String seg = request->get_current_path_segment();
|
2021-11-01 16:39:30 +01:00
|
|
|
|
2021-11-01 21:21:03 +01:00
|
|
|
if (seg == "") {
|
|
|
|
admin_render_rank_list(request);
|
|
|
|
return;
|
2021-11-01 23:48:25 +01:00
|
|
|
} else if (seg == "new_rank") {
|
|
|
|
request->push_path();
|
|
|
|
|
|
|
|
admin_handle_new_rank(request);
|
|
|
|
} else if (seg == "edit_rank") {
|
|
|
|
request->push_path();
|
|
|
|
|
|
|
|
admin_handle_edit_rank(request);
|
2021-11-02 00:18:57 +01:00
|
|
|
} else if (seg == "edit_permissions") {
|
|
|
|
request->push_path();
|
|
|
|
|
|
|
|
admin_handle_edit_permission(request);
|
2021-11-01 21:21:03 +01:00
|
|
|
}
|
2021-11-01 23:48:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void RBACController::admin_handle_new_rank(Request *request) {
|
|
|
|
|
|
|
|
if (request->get_method() == HTTP_METHOD_POST) {
|
|
|
|
Ref<RBACRank> rank;
|
|
|
|
rank.instance();
|
|
|
|
|
|
|
|
rank->name = request->get_parameter("name");
|
|
|
|
rank->name_internal = request->get_parameter("name_internal");
|
|
|
|
rank->settings = request->get_parameter("settings");
|
|
|
|
rank->rank_permissions = request->get_parameter("rank_permissions").to_int();
|
2021-11-01 21:21:03 +01:00
|
|
|
|
2021-11-01 23:48:25 +01:00
|
|
|
RBACModel::get_singleton()->save_rank(rank);
|
|
|
|
|
|
|
|
_permissions[rank->id] = rank;
|
|
|
|
|
|
|
|
request->send_redirect(request->get_url_root_parent() + "edit_rank/" + String::num(rank->id));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
RBACAdminRankViewData data;
|
|
|
|
render_rank_view(request, &data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBACController::admin_handle_edit_rank(Request *request) {
|
|
|
|
String seg = request->get_current_path_segment();
|
|
|
|
|
|
|
|
//check whether it's numeric
|
|
|
|
//if (!seg.is)
|
|
|
|
|
|
|
|
int id = seg.to_int();
|
|
|
|
|
|
|
|
if (id == 0) {
|
|
|
|
RLOG_MSG("RBACController::admin_handle_edit_rank: id == 0!\n");
|
|
|
|
request->send_redirect(request->get_url_root_parent());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ref<RBACRank> rank = _permissions[id];
|
|
|
|
|
|
|
|
if (!rank.is_valid()) {
|
|
|
|
RLOG_MSG("RBACController::admin_handle_edit_rank: !rank.is_valid()\n");
|
|
|
|
request->send_redirect(request->get_url_root_parent());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
RBACAdminRankViewData data;
|
|
|
|
data.rank = rank;
|
|
|
|
|
|
|
|
if (request->get_method() == HTTP_METHOD_POST) {
|
|
|
|
rank->name = request->get_parameter("name");
|
|
|
|
rank->name_internal = request->get_parameter("name_internal");
|
|
|
|
rank->settings = request->get_parameter("settings");
|
|
|
|
rank->rank_permissions = request->get_parameter("rank_permissions").to_int();
|
|
|
|
|
|
|
|
RBACModel::get_singleton()->save_rank(rank);
|
|
|
|
|
|
|
|
data.messages.push_back("Save Success!");
|
|
|
|
}
|
|
|
|
|
|
|
|
render_rank_view(request, &data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBACController::render_rank_view(Request *request, RBACAdminRankViewData *data) {
|
|
|
|
int id = 0;
|
|
|
|
String name = "";
|
|
|
|
String name_internal = "";
|
|
|
|
String settings = "";
|
|
|
|
int rank_permissions = 0;
|
|
|
|
|
|
|
|
if (data->rank.is_valid()) {
|
|
|
|
id = data->rank->id;
|
|
|
|
name = data->rank->name;
|
|
|
|
name_internal = data->rank->name_internal;
|
|
|
|
settings = data->rank->settings;
|
|
|
|
rank_permissions = data->rank->rank_permissions;
|
|
|
|
}
|
|
|
|
|
|
|
|
HTMLBuilder b;
|
|
|
|
|
|
|
|
b.h4()->f()->a()->href(request->get_url_root_parent())->f()->w("<- Back")->ca()->ch4();
|
|
|
|
b.h4()->f()->w("RBAC Editor")->ch4();
|
|
|
|
|
|
|
|
b.div()->cls("messages");
|
|
|
|
for (int i = 0; i < data->messages.size(); ++i) {
|
|
|
|
b.w(data->messages[i])->br();
|
|
|
|
}
|
|
|
|
b.cdiv();
|
|
|
|
|
|
|
|
b.form()->method("POST")->action(request->get_url_root() + String::num(id));
|
|
|
|
{
|
|
|
|
//b.input()->type("hidden")->name("id")->value(String::num(id))->f()->cinput();
|
|
|
|
b.w("Name:")->br();
|
|
|
|
b.input()->type("text")->name("name")->value(name)->f()->br();
|
|
|
|
b.w("Name (Internal):")->br();
|
|
|
|
b.input()->type("text")->name("name_internal")->value(name_internal)->f()->cinput()->br();
|
|
|
|
b.w("Custom Settings:")->br();
|
|
|
|
b.input()->type("text")->name("settings")->value(settings)->f()->cinput()->br();
|
|
|
|
|
|
|
|
//todo rank_permissions (checkboxes + register api)
|
|
|
|
|
|
|
|
b.input()->type("submit")->value("Save");
|
|
|
|
}
|
|
|
|
b.cform();
|
|
|
|
|
|
|
|
request->body += b.result;
|
2021-11-01 21:21:03 +01:00
|
|
|
}
|
|
|
|
|
2021-11-02 00:18:57 +01:00
|
|
|
void RBACController::admin_handle_edit_permission(Request *request) {
|
|
|
|
|
|
|
|
String seg = request->get_current_path_segment();
|
|
|
|
|
|
|
|
//check whether it's numeric
|
|
|
|
//if (!seg.is)
|
|
|
|
|
|
|
|
int id = seg.to_int();
|
|
|
|
|
|
|
|
if (id == 0) {
|
|
|
|
RLOG_MSG("RBACController::admin_handle_edit_permission: id == 0!\n");
|
|
|
|
request->send_redirect(request->get_url_root_parent());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ref<RBACRank> rank = _permissions[id];
|
|
|
|
|
|
|
|
if (!rank.is_valid()) {
|
|
|
|
RLOG_MSG("RBACController::admin_handle_edit_permission: !rank.is_valid()\n");
|
|
|
|
request->send_redirect(request->get_url_root_parent());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
RBACAdminEditPermissionView data;
|
|
|
|
data.rank = rank;
|
|
|
|
|
|
|
|
request->push_path();
|
|
|
|
|
|
|
|
String seg2 = request->get_current_path_segment();
|
|
|
|
|
|
|
|
if (seg2 == "new") {
|
|
|
|
admin_render_edit_permission_entry_view(request, &data);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
admin_render_edit_permission_main_view(request, &data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBACController::admin_render_edit_permission_main_view(Request *request, RBACAdminEditPermissionView *data) {
|
|
|
|
HTMLBuilder b;
|
|
|
|
|
|
|
|
Ref<RBACRank> rank = data->rank;
|
|
|
|
|
|
|
|
b.h4()->f()->a()->href(request->get_url_root_parent())->f()->w("<- Back")->ca()->ch4();
|
|
|
|
b.h4()->f()->w("RBAC Editor")->ch4();
|
|
|
|
|
|
|
|
b.div()->cls("heading");
|
|
|
|
{
|
|
|
|
b.w("[ Id ]: ")->wn(rank->id)->w(", [ Name ]: ")->w(rank->name)->w(", [ Name Internal ]: ")->w(rank->name_internal);
|
|
|
|
}
|
|
|
|
b.cdiv();
|
|
|
|
|
|
|
|
b.br();
|
|
|
|
|
|
|
|
for (int i = 0; i < rank->permissions.size(); ++i) {
|
|
|
|
b.div()->cls("row");
|
|
|
|
{
|
|
|
|
//todo
|
|
|
|
}
|
|
|
|
b.cdiv();
|
|
|
|
}
|
|
|
|
|
|
|
|
b.br();
|
|
|
|
|
|
|
|
b.a()->href(request->get_url_root("new"));
|
|
|
|
b.w("New Permission");
|
|
|
|
b.ca();
|
|
|
|
|
|
|
|
request->body += b.result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBACController::admin_render_edit_permission_entry_view(Request *request, RBACAdminEditPermissionView* data) {
|
|
|
|
HTMLBuilder b;
|
|
|
|
|
|
|
|
Ref<RBACRank> rank = data->rank;
|
|
|
|
|
|
|
|
b.h4()->f()->a()->href(request->get_url_root_parent(2))->f()->w("<- Back")->ca()->ch4();
|
|
|
|
b.h4()->f()->w("RBAC Editor")->ch4();
|
|
|
|
|
|
|
|
b.br();
|
|
|
|
|
|
|
|
request->body += b.result;
|
|
|
|
}
|
|
|
|
|
2021-11-01 21:21:03 +01:00
|
|
|
void RBACController::admin_render_rank_list(Request *request) {
|
|
|
|
HTMLBuilder b;
|
|
|
|
|
|
|
|
b.h4()->f()->a()->href(request->get_url_root_parent())->f()->w("<- Back")->ca()->ch4();
|
2021-11-01 23:48:25 +01:00
|
|
|
b.h4()->f()->w("RBAC Editor")->ch4();
|
2021-11-01 21:21:03 +01:00
|
|
|
|
|
|
|
for (std::map<int, Ref<RBACRank> >::iterator p = _permissions.begin(); p != _permissions.end(); p++) {
|
|
|
|
Ref<RBACRank> r = p->second;
|
|
|
|
|
|
|
|
if (!r.is_valid()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
b.div()->cls("row");
|
|
|
|
{
|
|
|
|
b.a()->href(request->get_url_root("edit_permissions/") + String::num(r->id));
|
2021-11-01 23:48:25 +01:00
|
|
|
b.w("[ Id ]: ")->wn(r->id)->w(", [ Name ]: ")->w(r->name)->w(", [ Name Internal ]: ")->w(r->name_internal);
|
2021-11-01 21:21:03 +01:00
|
|
|
b.ca();
|
2021-11-01 23:48:25 +01:00
|
|
|
|
|
|
|
b.w(" - ");
|
|
|
|
|
2021-11-01 21:21:03 +01:00
|
|
|
b.a()->href(request->get_url_root("edit_rank/") + String::num(r->id));
|
2021-11-01 23:48:25 +01:00
|
|
|
b.w("[ Edit Names ]");
|
2021-11-01 21:21:03 +01:00
|
|
|
b.ca();
|
|
|
|
}
|
|
|
|
b.cdiv();
|
|
|
|
}
|
|
|
|
|
2021-11-01 23:48:25 +01:00
|
|
|
b.br();
|
2021-11-02 00:18:57 +01:00
|
|
|
|
2021-11-01 21:21:03 +01:00
|
|
|
b.a()->href(request->get_url_root("new_rank"));
|
|
|
|
b.w("New Rank");
|
|
|
|
b.ca();
|
|
|
|
|
|
|
|
request->body += b.result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBACController::admin_render_rank_editor(Request *request) {
|
|
|
|
}
|
|
|
|
|
|
|
|
String RBACController::admin_get_section_name() {
|
|
|
|
return "Role Based Access Control";
|
2021-11-01 15:12:09 +01:00
|
|
|
}
|
|
|
|
|
2021-11-01 01:39:55 +01:00
|
|
|
void RBACController::admin_add_section_links(Vector<AdminSectionLinkInfo> *links) {
|
2021-11-01 21:21:03 +01:00
|
|
|
links->push_back(AdminSectionLinkInfo("Editor", ""));
|
2021-11-01 01:39:55 +01:00
|
|
|
}
|
|
|
|
|
2021-11-01 16:39:30 +01:00
|
|
|
void RBACController::initialize() {
|
|
|
|
_permissions = RBACModel::get_singleton()->load_permissions();
|
|
|
|
}
|
|
|
|
|
2021-10-31 21:45:12 +01:00
|
|
|
RBACController *RBACController::get_singleton() {
|
|
|
|
return _self;
|
|
|
|
}
|
|
|
|
|
|
|
|
RBACController::RBACController() :
|
2021-10-31 23:12:05 +01:00
|
|
|
AdminController() {
|
2021-10-31 21:45:12 +01:00
|
|
|
|
|
|
|
if (_self) {
|
|
|
|
printf("RBACController::RBACController(): Error! self is not null!/n");
|
|
|
|
}
|
|
|
|
|
|
|
|
_self = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
RBACController::~RBACController() {
|
|
|
|
if (_self == this) {
|
|
|
|
_self = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RBACController *RBACController::_self = nullptr;
|