Implement basic functionality for RBACUsers.

This commit is contained in:
Relintai 2021-11-10 19:35:02 +01:00
parent 93e95a865f
commit af266e345d
12 changed files with 201 additions and 8 deletions

View File

@ -580,6 +580,24 @@ void RBACController::register_permissions() {
register_rank_permission("Admin Panel", RBAC_PERMISSION_ADMIN_PANEL);
}
Ref<RBACRank> RBACController::get_rank(int rank_id) {
return _ranks[rank_id];
}
int RBACController::get_default_rank_id() {
//todo
return 0;
}
Ref<RBACRank> RBACController::get_default_rank() {
return _ranks[get_default_rank_id()];
}
bool RBACController::continue_on_missing_default_rank() {
//todo, add setting
return false;
}
RBACController *RBACController::get_singleton() {
return _self;
}

View File

@ -64,6 +64,12 @@ public:
void initialize();
virtual void register_permissions();
Ref<RBACRank> get_rank(int rank_id);
int get_default_rank_id();
Ref<RBACRank> get_default_rank();
bool continue_on_missing_default_rank();
static RBACController *get_singleton();
RBACController();

View File

@ -1,5 +1,13 @@
#include "rbac_rank.h"
#include "core/http/request.h"
bool RBACRank::has_permission(Request *request, const int permission) {
//todo try to find a match from the permissions array
return (base_permissions & permission) != 0;
}
void RBACRank::sort_permissions() {
for (int i = 0; i < permissions.size(); ++i) {
for (int j = i + 1; j < permissions.size(); ++j) {

View File

@ -8,6 +8,8 @@
#include "rbac_permission.h"
class Request;
class RBACRank : public Resource {
RCPP_OBJECT(RBACRank, Resource);
@ -23,6 +25,8 @@ public:
Vector<Ref<RBACPermission> > permissions;
bool has_permission(Request *request, const int permission);
void sort_permissions();
RBACRank();

View File

@ -1,5 +1,13 @@
#include "rbac_user.h"
bool RBACUser::has_permission(Request *request, const int permission) {
if (!rbac_rank.is_valid()) {
return false;
}
return rbac_rank->has_permission(request, permission);
}
RBACUser::RBACUser() :
User() {
}

View File

@ -4,6 +4,7 @@
#include "core/string.h"
#include "modules/users/user.h"
#include "modules/rbac/rbac_rank.h"
class Request;
class FormValidator;
@ -12,6 +13,10 @@ class RBACUser : public User {
RCPP_OBJECT(RBACUser, User);
public:
Ref<RBACRank> rbac_rank;
bool has_permission(Request *request, const int permission);
RBACUser();
~RBACUser();
};

View File

@ -1,5 +1,81 @@
#include "rbac_user_controller.h"
#include "core/http/http_session.h"
#include "core/http/request.h"
#include "rbac_user_model.h"
#include "modules/rbac/rbac_controller.h"
#include "modules/rbac/rbac_default_permissions.h"
#include "rbac_user.h"
void RBACUserController::rbac_user_session_setup_middleware(Object *instance, Request *request) {
if (request->session) {
int user_id = request->session->get_int("user_id");
if (user_id != 0) {
Ref<RBACUser> u = UserModel::get_singleton()->get_user(user_id);
if (u.is_valid()) {
request->reference_data["user"] = u;
} else {
//log
request->session->remove_int("user_id");
}
}
}
request->next_stage();
}
void RBACUserController::rbac_default_user_session_middleware(Object *instance, Request *request) {
Ref<RBACRank> rank;
if (request->session) {
int user_id = request->session->get_int("user_id");
if (user_id != 0) {
Ref<RBACUser> u = UserModel::get_singleton()->get_user(user_id);
if (u.is_valid()) {
rank = u->rbac_rank;
request->reference_data["user"] = u;
} else {
//log
request->session->remove_int("user_id");
}
}
}
if (!rank.is_valid()) {
rank = RBACController::get_singleton()->get_default_rank();
if (!rank.is_valid()) {
if (RBACController::get_singleton()->continue_on_missing_default_rank()) {
RLOG_ERR("RBACController::get_singleton()->get_default_rank() has not been set up properly!!! Continuing!");
request->next_stage();
} else {
RLOG_ERR("RBACController::get_singleton()->get_default_rank() has not been set up properly!!! Sending 404!");
request->send_error(404);
}
return;
}
}
if (rank->has_permission(request, RBAC_PERMISSION_READ)) {
//todo implement redirect perm
request->send_error(404);
return;
}
request->next_stage();
}
RBACUserController::RBACUserController() :
UserController() {
}

View File

@ -3,10 +3,17 @@
#include "modules/users/user_controller.h"
class Request;
class RBACUserController : public UserController {
RCPP_OBJECT(RBACUserController, UserController);
public:
//just session setup
static void rbac_user_session_setup_middleware(Object *instance, Request *request);
//this one also handles missing read permission / redirect
static void rbac_default_user_session_middleware(Object *instance, Request *request);
RBACUserController();
~RBACUserController();

View File

@ -1,5 +1,51 @@
#include "rbac_user_model.h"
#include "modules/rbac_users/rbac_user.h"
#include "modules/rbac/rbac_controller.h"
Ref<User> RBACUserModel::get_user(const int id) {
Ref<RBACUser> u = UserModel::get_user(id);
if (u.is_valid()) {
u->rbac_rank = RBACController::get_singleton()->get_rank(u->rank);
}
return u;
}
Ref<User> RBACUserModel::get_user(const String &user_name_input) {
Ref<RBACUser> u = UserModel::get_user(user_name_input);
if (u.is_valid()) {
u->rbac_rank = RBACController::get_singleton()->get_rank(u->rank);
}
return u;
}
Vector<Ref<User> > RBACUserModel::get_all() {
Vector<Ref<User> > users = UserModel::get_all();
for (int i = 0; i < users.size(); ++i) {
Ref<RBACUser> u = users[i];
if (u.is_valid()) {
u->rbac_rank = RBACController::get_singleton()->get_rank(u->rank);
}
}
return users;
}
Ref<User> RBACUserModel::create_user() {
Ref<RBACUser> u;
u.instance();
u->rank = RBACController::get_singleton()->get_default_rank_id();
u->rbac_rank = RBACController::get_singleton()->get_rank(u->rank);
return u;
}
RBACUserModel::RBACUserModel() :
UserModel() {

View File

@ -7,6 +7,13 @@ class RBACUserModel : public UserModel {
RCPP_OBJECT(RBACUserModel, UserModel);
public:
Ref<User> get_user(const int id);
Ref<User> get_user(const String &user_name_input);
Vector<Ref<User> > get_all();
Ref<User> create_user();
RBACUserModel();
~RBACUserModel();

View File

@ -29,7 +29,7 @@ Ref<User> UserModel::get_user(const int id) {
}
Ref<User> user;
user.instance();
user = create_user();
user->id = id;
user->name_user_input = r->get_cell(0);
@ -64,7 +64,7 @@ Ref<User> UserModel::get_user(const String &user_name_input) {
}
Ref<User> user;
user.instance();
user = create_user();
user->id = r->get_cell_int(0);
user->name_user_input = user_name_input;
@ -138,8 +138,7 @@ Vector<Ref<User> > UserModel::get_all() {
Ref<QueryResult> r = b->run();
while (r->next_row()) {
Ref<User> user;
user.instance();
Ref<User> user = create_user();
user->id = r->get_cell_int(0);
user->name_user_input = r->get_cell(1);
@ -158,6 +157,13 @@ Vector<Ref<User> > UserModel::get_all() {
return users;
}
Ref<User> UserModel::create_user() {
Ref<User> u;
u.instance();
return u;
}
bool UserModel::is_username_taken(const String &user_name_input) {
Ref<QueryBuilder> b = DatabaseManager::get_singleton()->ddb->get_query_builder();

View File

@ -12,11 +12,13 @@ class UserModel : public Object {
RCPP_OBJECT(UserModel, Object);
public:
Ref<User> get_user(const int id);
Ref<User> get_user(const String &user_name_input);
void save_user(Ref<User> &user);
virtual Ref<User> get_user(const int id);
virtual Ref<User> get_user(const String &user_name_input);
virtual void save_user(Ref<User> &user);
Vector<Ref<User> > get_all();
virtual Vector<Ref<User> > get_all();
virtual Ref<User> create_user();
bool is_username_taken(const String &user_name_input);
bool is_email_taken(const String &email_input);