Fixed another issue

This commit is contained in:
WolverinDEV 2019-09-22 14:07:24 +02:00
parent 7fbb560775
commit cb73d9df32
2 changed files with 47 additions and 31 deletions

View File

@ -8,6 +8,8 @@
#include <vector> #include <vector>
#include <map> #include <map>
#define _NDEBUG
namespace ts { namespace ts {
namespace permission { namespace permission {
enum PermissionType : uint16_t; enum PermissionType : uint16_t;
@ -174,7 +176,7 @@ namespace ts {
* bits [64 - sizeof(error::type);64] => error type | Usually evaluates to [48;64] * bits [64 - sizeof(error::type);64] => error type | Usually evaluates to [48;64]
* bits [64 - sizeof(error::type) - sizeof(permission::PermissionType);64 - sizeof(error::type)] => permission id | Usually evaluates to [32;48] * bits [64 - sizeof(error::type) - sizeof(permission::PermissionType);64 - sizeof(error::type)] => permission id | Usually evaluates to [32;48]
*/ */
uint64_t data; uint64_t data = 0;
/* Test for mode 1 as described before */ /* Test for mode 1 as described before */
static_assert(sizeof(permission::PermissionType) * 8 + sizeof(error::type) * 8 <= 63); static_assert(sizeof(permission::PermissionType) * 8 + sizeof(error::type) * 8 <= 63);
@ -192,7 +194,7 @@ namespace ts {
} }
inline bool is_detailed() { inline bool is_detailed() {
return (this->data & 0x1) == 0; return (this->data & 0x1UL) == 0;
} }
inline detailed_command_result* release_details() { inline detailed_command_result* release_details() {
@ -201,7 +203,7 @@ namespace ts {
return result; return result;
} }
#ifndef NDEBUG /* We dont need to secure that because gcc deduct us to an uint64_t and the only advantage is the mem leak test which is deactivated anyways */ #ifndef _NDEBUG /* We dont need to secure that because gcc deduct us to an uint64_t and the only advantage is the mem leak test which is deactivated anyways */
command_result(command_result&) = delete; command_result(command_result&) = delete;
command_result(const command_result&) = delete; command_result(const command_result&) = delete;
command_result(command_result&& other) : data(other.data) { command_result(command_result&& other) : data(other.data) {
@ -209,9 +211,7 @@ namespace ts {
} }
#endif #endif
command_result() { command_result() = default;
this->data = 0;
}
explicit command_result(permission::PermissionType permission) { explicit command_result(permission::PermissionType permission) {
this->data = 0x01; /* the the type to 1 */ this->data = 0x01; /* the the type to 1 */
@ -237,7 +237,7 @@ namespace ts {
details_ptr->extra_properties["extra_msg"] = message; details_ptr->extra_properties["extra_msg"] = message;
} }
#ifndef NDEBUG #ifndef _NDEBUG
/* if we're not using any debug we dont have to use a deconstructor. A deconstructor prevent a direct uint64_t return as described above */ /* if we're not using any debug we dont have to use a deconstructor. A deconstructor prevent a direct uint64_t return as described above */
~command_result() { ~command_result() {
if((this->data & 0x01) == 0x00) { if((this->data & 0x01) == 0x00) {
@ -246,8 +246,8 @@ namespace ts {
} }
} }
#endif #endif
}; };
static_assert(sizeof(command_result) == 8);
struct ErrorType { struct ErrorType {
public: public:
@ -330,4 +330,6 @@ namespace ts {
public: public:
CommandResultPermissionError(permission::PermissionType error, const std::string &extraMsg = ""); CommandResultPermissionError(permission::PermissionType error, const std::string &extraMsg = "");
}; };
} }
#undef _NDEBUG

View File

@ -1269,7 +1269,6 @@ void v2::PermissionManager::set_channel_permission(const PermissionType &permiss
} else if(action_value == v2::PermissionUpdateType::delete_value) { } else if(action_value == v2::PermissionUpdateType::delete_value) {
permission_container->flags.value_set = false; permission_container->flags.value_set = false;
permission_container->flags.flag_value_update = true; permission_container->flags.flag_value_update = true;
permission_container->values.value = permNotGranted; /* required for the database else it does not "deletes" the value */
} }
if(action_grant == v2::PermissionUpdateType::set_value) { if(action_grant == v2::PermissionUpdateType::set_value) {
@ -1279,7 +1278,6 @@ void v2::PermissionManager::set_channel_permission(const PermissionType &permiss
} else if(action_grant == v2::PermissionUpdateType::delete_value) { } else if(action_grant == v2::PermissionUpdateType::delete_value) {
permission_container->flags.grant_set = false; permission_container->flags.grant_set = false;
permission_container->flags.flag_grant_update = true; permission_container->flags.flag_grant_update = true;
permission_container->values.grant = permNotGranted; /* required for the database else it does not "deletes" the value */
} }
if(flag_skip >= 0) { if(flag_skip >= 0) {
@ -1395,18 +1393,19 @@ const std::vector<v2::PermissionDBUpdateEntry> v2::PermissionManager::flush_db_u
/* we only need an update it the permission has a DB reference or we will set the permission */ /* we only need an update it the permission has a DB reference or we will set the permission */
if(permission.flags.database_reference || permission.flags.permission_set()) { if(permission.flags.database_reference || permission.flags.permission_set()) {
/* /*
PermissionType permission; PermissionType permission;
ChannelId channel_id; ChannelId channel_id;
PermissionValues values; PermissionValues values;
PermissionUpdateType update_value; PermissionUpdateType update_value;
PermissionUpdateType update_grant; PermissionUpdateType update_grant;
bool flag_new: 1; bool flag_db: 1;
bool flag_delete: 1;
bool flag_skip: 1; bool flag_skip: 1;
bool flag_negate: 1; bool flag_negate: 1;
*/ */
result.push_back(v2::PermissionDBUpdateEntry{ auto& entry = result.emplace_back(v2::PermissionDBUpdateEntry{
(PermissionType) (block_index * PERMISSIONS_BULK_ENTRY_COUNT + permission_index), (PermissionType) (block_index * PERMISSIONS_BULK_ENTRY_COUNT + permission_index),
(ChannelId) 0, (ChannelId) 0,
@ -1419,6 +1418,14 @@ const std::vector<v2::PermissionDBUpdateEntry> v2::PermissionManager::flush_db_u
(bool) permission.flags.skip, (bool) permission.flags.skip,
(bool) permission.flags.negate (bool) permission.flags.negate
}); });
/* required for the database */
if(!permission.flags.value_set)
entry.values.value = permNotGranted;
if(!permission.flags.grant_set)
entry.values.grant = permNotGranted;
permission.flags.database_reference = permission.flags.permission_set(); permission.flags.database_reference = permission.flags.permission_set();
} }
@ -1437,21 +1444,28 @@ const std::vector<v2::PermissionDBUpdateEntry> v2::PermissionManager::flush_db_u
/* we only need an update it the permission has a DB reference or we will set the permission */ /* we only need an update it the permission has a DB reference or we will set the permission */
if(permission->flags.database_reference || permission->flags.permission_set()) { if(permission->flags.database_reference || permission->flags.permission_set()) {
result.push_back(
v2::PermissionDBUpdateEntry{
permission->permission,
permission->channel_id,
permission->values, auto& entry = result.emplace_back(v2::PermissionDBUpdateEntry{
permission->flags.flag_value_update ? (permission->flags.value_set ? PermissionUpdateType::set_value : PermissionUpdateType::delete_value) : PermissionUpdateType::do_nothing, permission->permission,
permission->flags.flag_grant_update ? (permission->flags.grant_set ? PermissionUpdateType::set_value : PermissionUpdateType::delete_value) : PermissionUpdateType::do_nothing, permission->channel_id,
permission->values,
(PermissionUpdateType) (permission->flags.flag_value_update ? (permission->flags.value_set ? PermissionUpdateType::set_value : PermissionUpdateType::delete_value) : PermissionUpdateType::do_nothing),
(PermissionUpdateType) (permission->flags.flag_grant_update ? (permission->flags.grant_set ? PermissionUpdateType::set_value : PermissionUpdateType::delete_value) : PermissionUpdateType::do_nothing),
(bool) permission->flags.database_reference,
(bool) !permission->flags.permission_set(), /* db delete */
(bool) permission->flags.skip,
(bool) permission->flags.negate
});
/* required for the database */
if(!permission->flags.value_set)
entry.values.value = permNotGranted;
if(!permission->flags.grant_set)
entry.values.grant = permNotGranted;
(bool) permission->flags.database_reference,
(bool) !permission->flags.permission_set(), /* db delete */
(bool) permission->flags.skip,
(bool) permission->flags.negate
}
);
permission->flags.database_reference = permission->flags.permission_set(); permission->flags.database_reference = permission->flags.permission_set();
} }