diff --git a/src/BasicChannel.h b/src/BasicChannel.h index 60b32a2..05a9e65 100644 --- a/src/BasicChannel.h +++ b/src/BasicChannel.h @@ -67,17 +67,20 @@ namespace ts { auto permission_manager = this->permissions(); /* copy the manager */ assert(permission_manager); const auto data = permission_manager->permission_value_flagged(permission); - if(!data.has_value) { - return !require_granted_value || granted_value.has_value; - } - if(!granted_value.has_value) { - return false; - } - if(data.value == -1) { + return BasicChannel::permission_granted(data,granted_value, require_granted_value); + } + + ts_always_inline + static bool permission_granted(const permission::v2::PermissionFlaggedValue& channel_permission_value, const permission::v2::PermissionFlaggedValue& granted_value, bool require_granted_value) { + if(!channel_permission_value.has_value || channel_permission_value.value == 0) { + return !require_granted_value || granted_value.has_value; + } + if(channel_permission_value.value == -1) { return granted_value.value == -1; } - return granted_value.value >= data.value; + return granted_value.value >= channel_permission_value.value; } + ts_always_inline bool talk_power_granted(const permission::v2::PermissionFlaggedValue& granted_value) { return this->permission_granted(permission::i_client_needed_talk_power, granted_value, false); } diff --git a/src/PermissionManager.cpp b/src/PermissionManager.cpp index db025c1..7bd6a4b 100644 --- a/src/PermissionManager.cpp +++ b/src/PermissionManager.cpp @@ -1173,7 +1173,7 @@ void v2::PermissionManager::set_permission(const PermissionType &permission, con } else if(action_value == v2::PermissionUpdateType::delete_value) { data.flags.value_set = false; data.flags.flag_value_update = true; - data.values.grant = permNotGranted; /* required for the database else it does not "deletes" the value */ + data.values.value = permNotGranted; /* required for the database else it does not "deletes" the value */ } if(action_grant == v2::PermissionUpdateType::set_value) { @@ -1248,7 +1248,7 @@ void v2::PermissionManager::set_channel_permission(const PermissionType &permiss if(action_grant == v2::PermissionUpdateType::set_value) { permission_container->flags.grant_set = true; permission_container->flags.flag_grant_update = true; - permission_container->values.grant = values.value; + permission_container->values.grant = values.grant; } else if(action_grant == v2::PermissionUpdateType::delete_value) { permission_container->flags.grant_set = false; permission_container->flags.flag_grant_update = true;