mirror of
https://github.com/Relintai/rcpp_framework.git
synced 2025-04-20 01:43:12 +02:00
Implement basic functionality for RBACUsers.
This commit is contained in:
parent
93e95a865f
commit
af266e345d
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
|
@ -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() {
|
||||
}
|
||||
|
@ -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();
|
||||
};
|
||||
|
@ -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() {
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user