Fixed a mass disconnect due to too long channel names
This commit is contained in:
parent
818cffd368
commit
73cf372a84
@ -1,32 +1,32 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include <bitset>
|
|
||||||
#include <algorithm>
|
|
||||||
#include "../../build.h"
|
|
||||||
#include "../ConnectedClient.h"
|
|
||||||
#include "../InternalClient.h"
|
|
||||||
#include "../../server/VoiceServer.h"
|
|
||||||
#include "../voice/VoiceClient.h"
|
|
||||||
#include "PermissionManager.h"
|
|
||||||
#include "../../InstanceHandler.h"
|
#include "../../InstanceHandler.h"
|
||||||
#include "../../server/QueryServer.h"
|
#include "../../build.h"
|
||||||
#include "../music/MusicClient.h"
|
#include "../../manager/ActionLogger.h"
|
||||||
#include "../query/QueryClient.h"
|
|
||||||
#include "../../weblist/WebListManager.h"
|
|
||||||
#include "../../manager/ConversationManager.h"
|
#include "../../manager/ConversationManager.h"
|
||||||
#include "../../manager/PermissionNameMapper.h"
|
#include "../../manager/PermissionNameMapper.h"
|
||||||
#include "../../manager/ActionLogger.h"
|
#include "../../server/QueryServer.h"
|
||||||
|
#include "../../server/VoiceServer.h"
|
||||||
|
#include "../../weblist/WebListManager.h"
|
||||||
|
#include "../ConnectedClient.h"
|
||||||
|
#include "../InternalClient.h"
|
||||||
|
#include "../music/MusicClient.h"
|
||||||
|
#include "../query/QueryClient.h"
|
||||||
|
#include "../voice/VoiceClient.h"
|
||||||
|
#include "PermissionManager.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <bitset>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "./bulk_parsers.h"
|
#include "./bulk_parsers.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
|
||||||
#include <Properties.h>
|
#include <Properties.h>
|
||||||
|
#include <bbcode/bbcodes.h>
|
||||||
#include <log/LogUtils.h>
|
#include <log/LogUtils.h>
|
||||||
#include <misc/sassert.h>
|
|
||||||
#include <misc/base64.h>
|
#include <misc/base64.h>
|
||||||
#include <misc/digest.h>
|
#include <misc/digest.h>
|
||||||
#include <bbcode/bbcodes.h>
|
#include <misc/sassert.h>
|
||||||
|
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -186,7 +186,8 @@ command_result ConnectedClient::handleCommandChannelGroupAdd(Command &cmd) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else return command_result{error::group_invalid_id};
|
} else
|
||||||
|
return command_result{error::group_invalid_id};
|
||||||
return command_result{error::ok};
|
return command_result{error::ok};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,7 +490,8 @@ command_result ConnectedClient::handleCommandChannelGroupClientList(Command &cmd
|
|||||||
result[index]["cgid"] = group_id;
|
result[index]["cgid"] = group_id;
|
||||||
result[index]["cldbid"] = cldbid;
|
result[index]["cldbid"] = cldbid;
|
||||||
index++;
|
index++;
|
||||||
}, result, index);
|
},
|
||||||
|
result, index);
|
||||||
if (index == 0) return command_result{error::database_empty_result};
|
if (index == 0) return command_result{error::database_empty_result};
|
||||||
this->sendCommand(result);
|
this->sendCommand(result);
|
||||||
return command_result{error::ok};
|
return command_result{error::ok};
|
||||||
@ -531,8 +533,7 @@ command_result ConnectedClient::handleCommandChannelGroupAddPerm(Command &cmd) {
|
|||||||
log::PermissionTarget::CHANNEL_GROUP,
|
log::PermissionTarget::CHANNEL_GROUP,
|
||||||
permission::v2::PermissionUpdateType::set_value,
|
permission::v2::PermissionUpdateType::set_value,
|
||||||
0, "",
|
0, "",
|
||||||
channelGroup->groupId(), channelGroup->name()
|
channelGroup->groupId(), channelGroup->name());
|
||||||
);
|
|
||||||
|
|
||||||
updateList |= ppermission.is_group_property();
|
updateList |= ppermission.is_group_property();
|
||||||
}
|
}
|
||||||
@ -579,8 +580,7 @@ command_result ConnectedClient::handleCommandChannelGroupDelPerm(Command &cmd) {
|
|||||||
log::PermissionTarget::CHANNEL_GROUP,
|
log::PermissionTarget::CHANNEL_GROUP,
|
||||||
permission::v2::PermissionUpdateType::delete_value,
|
permission::v2::PermissionUpdateType::delete_value,
|
||||||
0, "",
|
0, "",
|
||||||
channelGroup->groupId(), channelGroup->name()
|
channelGroup->groupId(), channelGroup->name());
|
||||||
);
|
|
||||||
updateList |= ppermission.is_group_property();
|
updateList |= ppermission.is_group_property();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -642,8 +642,10 @@ command_result ConnectedClient::handleCommandChannelCreate(Command &cmd) {
|
|||||||
if (!cmd[0].has("channel_flag_password")) cmd[0]["channel_flag_password"] = false;
|
if (!cmd[0].has("channel_flag_password")) cmd[0]["channel_flag_password"] = false;
|
||||||
|
|
||||||
if (cmd[0]["channel_flag_permanent"].as<bool>()) test_permission(1, permission::b_channel_create_permanent);
|
if (cmd[0]["channel_flag_permanent"].as<bool>()) test_permission(1, permission::b_channel_create_permanent);
|
||||||
else if (cmd[0]["channel_flag_semi_permanent"].as<bool>()) test_permission(1, permission::b_channel_create_semi_permanent);
|
else if (cmd[0]["channel_flag_semi_permanent"].as<bool>())
|
||||||
else test_permission(1, permission::b_channel_create_temporary);
|
test_permission(1, permission::b_channel_create_semi_permanent);
|
||||||
|
else
|
||||||
|
test_permission(1, permission::b_channel_create_temporary);
|
||||||
|
|
||||||
if (!cmd[0]["channel_flag_permanent"].as<bool>() && !this->server) return command_result{error::parameter_invalid, "You can only create a permanent channel"};
|
if (!cmd[0]["channel_flag_permanent"].as<bool>() && !this->server) return command_result{error::parameter_invalid, "You can only create a permanent channel"};
|
||||||
|
|
||||||
@ -719,16 +721,14 @@ command_result ConnectedClient::handleCommandChannelCreate(Command &cmd) {
|
|||||||
if (!permission::v2::permission_granted(created_perm + 1, max_channels))
|
if (!permission::v2::permission_granted(created_perm + 1, max_channels))
|
||||||
return command_result{permission::i_client_max_permanent_channels};
|
return command_result{permission::i_client_max_permanent_channels};
|
||||||
}
|
}
|
||||||
}
|
} else if (cmd[0]["channel_flag_semi_permanent"].as<bool>()) {
|
||||||
else if (cmd[0]["channel_flag_semi_permanent"].as<bool>()) {
|
|
||||||
max_channels = this->calculate_permission(permission::i_client_max_semi_channels, parent_channel_id, false, permission_cache);
|
max_channels = this->calculate_permission(permission::i_client_max_semi_channels, parent_channel_id, false, permission_cache);
|
||||||
|
|
||||||
if (max_channels.has_value) {
|
if (max_channels.has_value) {
|
||||||
if (!permission::v2::permission_granted(created_semi + 1, max_channels))
|
if (!permission::v2::permission_granted(created_semi + 1, max_channels))
|
||||||
return command_result{permission::i_client_max_semi_channels};
|
return command_result{permission::i_client_max_semi_channels};
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
max_channels = this->calculate_permission(permission::i_client_max_temporary_channels, parent_channel_id, false, permission_cache);
|
max_channels = this->calculate_permission(permission::i_client_max_temporary_channels, parent_channel_id, false, permission_cache);
|
||||||
|
|
||||||
if (max_channels.has_value) {
|
if (max_channels.has_value) {
|
||||||
@ -771,7 +771,6 @@ command_result ConnectedClient::handleCommandChannelCreate(Command &cmd) {
|
|||||||
if (last)
|
if (last)
|
||||||
cmd["channel_order"] = last->entry->channelId();
|
cmd["channel_order"] = last->entry->channelId();
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd["channel_name"].string().length() < 1) {
|
if (cmd["channel_name"].string().length() < 1) {
|
||||||
@ -813,14 +812,12 @@ command_result ConnectedClient::handleCommandChannelCreate(Command &cmd) {
|
|||||||
permission::i_channel_needed_modify_power,
|
permission::i_channel_needed_modify_power,
|
||||||
{default_modify_power.has_value ? default_modify_power.value : 0, 0},
|
{default_modify_power.has_value ? default_modify_power.value : 0, 0},
|
||||||
permission::v2::PermissionUpdateType::set_value,
|
permission::v2::PermissionUpdateType::set_value,
|
||||||
permission::v2::PermissionUpdateType::do_nothing
|
permission::v2::PermissionUpdateType::do_nothing);
|
||||||
);
|
|
||||||
permission_manager->set_permission(
|
permission_manager->set_permission(
|
||||||
permission::i_channel_needed_delete_power,
|
permission::i_channel_needed_delete_power,
|
||||||
{default_delete_power.has_value ? default_delete_power.value : 0, 0},
|
{default_delete_power.has_value ? default_delete_power.value : 0, 0},
|
||||||
permission::v2::PermissionUpdateType::set_value,
|
permission::v2::PermissionUpdateType::set_value,
|
||||||
permission::v2::PermissionUpdateType::do_nothing
|
permission::v2::PermissionUpdateType::do_nothing);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* log channel create */
|
/* log channel create */
|
||||||
@ -914,8 +911,7 @@ command_result ConnectedClient::handleCommandChannelCreate(Command &cmd) {
|
|||||||
"channel created",
|
"channel created",
|
||||||
ViewReasonId::VREASON_USER_ACTION,
|
ViewReasonId::VREASON_USER_ACTION,
|
||||||
true,
|
true,
|
||||||
tree_channel_lock
|
tree_channel_lock);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return command_result{error::ok};
|
return command_result{error::ok};
|
||||||
@ -1126,8 +1122,7 @@ command_result ConnectedClient::handleCommandChannelEdit(Command &cmd) {
|
|||||||
logCritical(
|
logCritical(
|
||||||
this->getServerId(),
|
this->getServerId(),
|
||||||
"The client " + this->getDisplayName() + " tried to change a editable channel property but we haven't found a permission. Please report this error. (Channel property: {})",
|
"The client " + this->getDisplayName() + " tried to change a editable channel property but we haven't found a permission. Please report this error. (Channel property: {})",
|
||||||
key
|
key);
|
||||||
);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
keys.push_back(&property);
|
keys.push_back(&property);
|
||||||
@ -1568,13 +1563,11 @@ command_result ConnectedClient::handleCommandChannelMove(Command &cmd) {
|
|||||||
serverInstance->action_logger()->channel_logger.log_channel_edit(this->getServerId(), this->ref(), type_update->channelId(),
|
serverInstance->action_logger()->channel_logger.log_channel_edit(this->getServerId(), this->ref(), type_update->channelId(),
|
||||||
property::describe(property::CHANNEL_FLAG_PERMANENT),
|
property::describe(property::CHANNEL_FLAG_PERMANENT),
|
||||||
"",
|
"",
|
||||||
type_update->properties()[property::CHANNEL_FLAG_PERMANENT].value()
|
type_update->properties()[property::CHANNEL_FLAG_PERMANENT].value());
|
||||||
);
|
|
||||||
serverInstance->action_logger()->channel_logger.log_channel_edit(this->getServerId(), this->ref(), type_update->channelId(),
|
serverInstance->action_logger()->channel_logger.log_channel_edit(this->getServerId(), this->ref(), type_update->channelId(),
|
||||||
property::describe(property::CHANNEL_FLAG_SEMI_PERMANENT),
|
property::describe(property::CHANNEL_FLAG_SEMI_PERMANENT),
|
||||||
"",
|
"",
|
||||||
type_update->properties()[property::CHANNEL_FLAG_SEMI_PERMANENT].value()
|
type_update->properties()[property::CHANNEL_FLAG_SEMI_PERMANENT].value());
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->server) {
|
if (this->server) {
|
||||||
@ -1697,8 +1690,7 @@ command_result ConnectedClient::handleCommandChannelAddPerm(Command &cmd) {
|
|||||||
log::PermissionTarget::CHANNEL,
|
log::PermissionTarget::CHANNEL,
|
||||||
permission::v2::PermissionUpdateType::set_value,
|
permission::v2::PermissionUpdateType::set_value,
|
||||||
channelId, channel->name(),
|
channelId, channel->name(),
|
||||||
0, ""
|
0, "");
|
||||||
);
|
|
||||||
|
|
||||||
updateClients |= ppermission.is_client_view_property();
|
updateClients |= ppermission.is_client_view_property();
|
||||||
update_join_permissions = ppermission.permission_type() == permission::i_channel_needed_join_power;
|
update_join_permissions = ppermission.permission_type() == permission::i_channel_needed_join_power;
|
||||||
@ -1744,8 +1736,7 @@ command_result ConnectedClient::handleCommandChannelDelPerm(Command &cmd) {
|
|||||||
log::PermissionTarget::CHANNEL,
|
log::PermissionTarget::CHANNEL,
|
||||||
permission::v2::PermissionUpdateType::delete_value,
|
permission::v2::PermissionUpdateType::delete_value,
|
||||||
channelId, channel->name(),
|
channelId, channel->name(),
|
||||||
0, ""
|
0, "");
|
||||||
);
|
|
||||||
|
|
||||||
updateClients |= ppermission.is_client_view_property();
|
updateClients |= ppermission.is_client_view_property();
|
||||||
update_join_permissions = ppermission.permission_type() == permission::i_channel_needed_join_power;
|
update_join_permissions = ppermission.permission_type() == permission::i_channel_needed_join_power;
|
||||||
@ -1856,8 +1847,7 @@ command_result ConnectedClient::handleCommandChannelClientDelPerm(Command &cmd)
|
|||||||
log::PermissionTarget::CLIENT_CHANNEL,
|
log::PermissionTarget::CLIENT_CHANNEL,
|
||||||
permission::v2::PermissionUpdateType::delete_value,
|
permission::v2::PermissionUpdateType::delete_value,
|
||||||
cldbid, "",
|
cldbid, "",
|
||||||
channel->channelId(), channel->name()
|
channel->channelId(), channel->name());
|
||||||
);
|
|
||||||
update_view |= ppermission.is_client_view_property();
|
update_view |= ppermission.is_client_view_property();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1880,7 +1870,8 @@ command_result ConnectedClient::handleCommandChannelClientDelPerm(Command &cmd)
|
|||||||
for (const auto &update_entry : elm->channels->update_channel_path(l_channel, this->server->channelTree->findLinkedChannel(elm->currentChannel->channelId()))) {
|
for (const auto &update_entry : elm->channels->update_channel_path(l_channel, this->server->channelTree->findLinkedChannel(elm->currentChannel->channelId()))) {
|
||||||
if (update_entry.first)
|
if (update_entry.first)
|
||||||
elm->notifyChannelShow(update_entry.second->channel(), update_entry.second->previous_channel);
|
elm->notifyChannelShow(update_entry.second->channel(), update_entry.second->previous_channel);
|
||||||
else deleted.push_back(update_entry.second->channelId());
|
else
|
||||||
|
deleted.push_back(update_entry.second->channelId());
|
||||||
}
|
}
|
||||||
if (!deleted.empty())
|
if (!deleted.empty())
|
||||||
elm->notifyChannelHide(deleted, false); /* we've locked the tree before */
|
elm->notifyChannelHide(deleted, false); /* we've locked the tree before */
|
||||||
@ -1924,8 +1915,7 @@ command_result ConnectedClient::handleCommandChannelClientAddPerm(Command &cmd)
|
|||||||
log::PermissionTarget::CLIENT_CHANNEL,
|
log::PermissionTarget::CLIENT_CHANNEL,
|
||||||
permission::v2::PermissionUpdateType::set_value,
|
permission::v2::PermissionUpdateType::set_value,
|
||||||
cldbid, "",
|
cldbid, "",
|
||||||
channel->channelId(), channel->name()
|
channel->channelId(), channel->name());
|
||||||
);
|
|
||||||
update_view |= ppermission.is_client_view_property();
|
update_view |= ppermission.is_client_view_property();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1949,7 +1939,8 @@ command_result ConnectedClient::handleCommandChannelClientAddPerm(Command &cmd)
|
|||||||
for (const auto &update_entry : elm->channels->update_channel_path(l_channel, this->server->channelTree->findLinkedChannel(elm->currentChannel->channelId()))) {
|
for (const auto &update_entry : elm->channels->update_channel_path(l_channel, this->server->channelTree->findLinkedChannel(elm->currentChannel->channelId()))) {
|
||||||
if (update_entry.first)
|
if (update_entry.first)
|
||||||
elm->notifyChannelShow(update_entry.second->channel(), update_entry.second->previous_channel);
|
elm->notifyChannelShow(update_entry.second->channel(), update_entry.second->previous_channel);
|
||||||
else deleted.push_back(update_entry.second->channelId());
|
else
|
||||||
|
deleted.push_back(update_entry.second->channelId());
|
||||||
}
|
}
|
||||||
if (!deleted.empty())
|
if (!deleted.empty())
|
||||||
elm->notifyChannelHide(deleted, false); /* we've locked the tree before */
|
elm->notifyChannelHide(deleted, false); /* we've locked the tree before */
|
||||||
@ -2000,17 +1991,3 @@ command_result ConnectedClient::handleCommandChannelInfo(Command &cmd) {
|
|||||||
|
|
||||||
return command_result{error::ok};
|
return command_result{error::ok};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user