mirror of
https://github.com/Relintai/rcpp_framework.git
synced 2025-05-02 13:47:56 +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);
|
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() {
|
RBACController *RBACController::get_singleton() {
|
||||||
return _self;
|
return _self;
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,12 @@ public:
|
|||||||
void initialize();
|
void initialize();
|
||||||
virtual void register_permissions();
|
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();
|
static RBACController *get_singleton();
|
||||||
|
|
||||||
RBACController();
|
RBACController();
|
||||||
|
@ -1,5 +1,13 @@
|
|||||||
#include "rbac_rank.h"
|
#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() {
|
void RBACRank::sort_permissions() {
|
||||||
for (int i = 0; i < permissions.size(); ++i) {
|
for (int i = 0; i < permissions.size(); ++i) {
|
||||||
for (int j = i + 1; j < permissions.size(); ++j) {
|
for (int j = i + 1; j < permissions.size(); ++j) {
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include "rbac_permission.h"
|
#include "rbac_permission.h"
|
||||||
|
|
||||||
|
class Request;
|
||||||
|
|
||||||
class RBACRank : public Resource {
|
class RBACRank : public Resource {
|
||||||
RCPP_OBJECT(RBACRank, Resource);
|
RCPP_OBJECT(RBACRank, Resource);
|
||||||
|
|
||||||
@ -23,6 +25,8 @@ public:
|
|||||||
|
|
||||||
Vector<Ref<RBACPermission> > permissions;
|
Vector<Ref<RBACPermission> > permissions;
|
||||||
|
|
||||||
|
bool has_permission(Request *request, const int permission);
|
||||||
|
|
||||||
void sort_permissions();
|
void sort_permissions();
|
||||||
|
|
||||||
RBACRank();
|
RBACRank();
|
||||||
|
@ -1,5 +1,13 @@
|
|||||||
#include "rbac_user.h"
|
#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() :
|
RBACUser::RBACUser() :
|
||||||
User() {
|
User() {
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "core/string.h"
|
#include "core/string.h"
|
||||||
|
|
||||||
#include "modules/users/user.h"
|
#include "modules/users/user.h"
|
||||||
|
#include "modules/rbac/rbac_rank.h"
|
||||||
|
|
||||||
class Request;
|
class Request;
|
||||||
class FormValidator;
|
class FormValidator;
|
||||||
@ -12,6 +13,10 @@ class RBACUser : public User {
|
|||||||
RCPP_OBJECT(RBACUser, User);
|
RCPP_OBJECT(RBACUser, User);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Ref<RBACRank> rbac_rank;
|
||||||
|
|
||||||
|
bool has_permission(Request *request, const int permission);
|
||||||
|
|
||||||
RBACUser();
|
RBACUser();
|
||||||
~RBACUser();
|
~RBACUser();
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,81 @@
|
|||||||
#include "rbac_user_controller.h"
|
#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() :
|
RBACUserController::RBACUserController() :
|
||||||
UserController() {
|
UserController() {
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,17 @@
|
|||||||
|
|
||||||
#include "modules/users/user_controller.h"
|
#include "modules/users/user_controller.h"
|
||||||
|
|
||||||
|
class Request;
|
||||||
|
|
||||||
class RBACUserController : public UserController {
|
class RBACUserController : public UserController {
|
||||||
RCPP_OBJECT(RBACUserController, UserController);
|
RCPP_OBJECT(RBACUserController, UserController);
|
||||||
|
|
||||||
public:
|
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();
|
||||||
~RBACUserController();
|
~RBACUserController();
|
||||||
|
|
||||||
|
@ -1,5 +1,51 @@
|
|||||||
#include "rbac_user_model.h"
|
#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() :
|
RBACUserModel::RBACUserModel() :
|
||||||
UserModel() {
|
UserModel() {
|
||||||
|
@ -7,6 +7,13 @@ class RBACUserModel : public UserModel {
|
|||||||
RCPP_OBJECT(RBACUserModel, UserModel);
|
RCPP_OBJECT(RBACUserModel, UserModel);
|
||||||
|
|
||||||
public:
|
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();
|
||||||
~RBACUserModel();
|
~RBACUserModel();
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ Ref<User> UserModel::get_user(const int id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ref<User> user;
|
Ref<User> user;
|
||||||
user.instance();
|
user = create_user();
|
||||||
|
|
||||||
user->id = id;
|
user->id = id;
|
||||||
user->name_user_input = r->get_cell(0);
|
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;
|
Ref<User> user;
|
||||||
user.instance();
|
user = create_user();
|
||||||
|
|
||||||
user->id = r->get_cell_int(0);
|
user->id = r->get_cell_int(0);
|
||||||
user->name_user_input = user_name_input;
|
user->name_user_input = user_name_input;
|
||||||
@ -138,8 +138,7 @@ Vector<Ref<User> > UserModel::get_all() {
|
|||||||
Ref<QueryResult> r = b->run();
|
Ref<QueryResult> r = b->run();
|
||||||
|
|
||||||
while (r->next_row()) {
|
while (r->next_row()) {
|
||||||
Ref<User> user;
|
Ref<User> user = create_user();
|
||||||
user.instance();
|
|
||||||
|
|
||||||
user->id = r->get_cell_int(0);
|
user->id = r->get_cell_int(0);
|
||||||
user->name_user_input = r->get_cell(1);
|
user->name_user_input = r->get_cell(1);
|
||||||
@ -158,6 +157,13 @@ Vector<Ref<User> > UserModel::get_all() {
|
|||||||
return users;
|
return users;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<User> UserModel::create_user() {
|
||||||
|
Ref<User> u;
|
||||||
|
u.instance();
|
||||||
|
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
|
||||||
bool UserModel::is_username_taken(const String &user_name_input) {
|
bool UserModel::is_username_taken(const String &user_name_input) {
|
||||||
Ref<QueryBuilder> b = DatabaseManager::get_singleton()->ddb->get_query_builder();
|
Ref<QueryBuilder> b = DatabaseManager::get_singleton()->ddb->get_query_builder();
|
||||||
|
|
||||||
|
@ -12,11 +12,13 @@ class UserModel : public Object {
|
|||||||
RCPP_OBJECT(UserModel, Object);
|
RCPP_OBJECT(UserModel, Object);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Ref<User> get_user(const int id);
|
virtual Ref<User> get_user(const int id);
|
||||||
Ref<User> get_user(const String &user_name_input);
|
virtual Ref<User> get_user(const String &user_name_input);
|
||||||
void save_user(Ref<User> &user);
|
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_username_taken(const String &user_name_input);
|
||||||
bool is_email_taken(const String &email_input);
|
bool is_email_taken(const String &email_input);
|
||||||
|
Loading…
Reference in New Issue
Block a user