Fixed some bugs related to the new server setup
This commit is contained in:
parent
ceb77a2c85
commit
41f5b30f56
@ -1 +1 @@
|
||||
Subproject commit 8c2608f90739a42cd727c8c8eab3d60bbb6dca53
|
||||
Subproject commit 4dfe9fbf023777cbc6dbb278cd1e161fe464edb4
|
@ -118,7 +118,7 @@ bool InstanceHandler::setupDefaultGroups() {
|
||||
groups.push_back(group);
|
||||
}
|
||||
|
||||
debugMessage(LOG_INSTANCE, "Read " + to_string(groups.size()) + " default groups");
|
||||
debugMessage(LOG_INSTANCE, "Read {} default groups", groups.size());
|
||||
for(const auto& info : groups) {
|
||||
debugMessage(LOG_INSTANCE, "Creating default group {} with type {}", info->name, to_string(info->target));
|
||||
//Query groups
|
||||
@ -131,8 +131,8 @@ bool InstanceHandler::setupDefaultGroups() {
|
||||
create_result = serverInstance->group_manager()->channel_groups()->create_group(groups::GroupType::GROUP_TYPE_TEMPLATE, info->name, c_group);
|
||||
created_group = c_group;
|
||||
} else {
|
||||
std::shared_ptr<groups::ChannelGroup> s_group{};
|
||||
create_result = serverInstance->group_manager()->channel_groups()->create_group(info->target == 0 ? groups::GroupType::GROUP_TYPE_QUERY : groups::GroupType::GROUP_TYPE_TEMPLATE, info->name, s_group);
|
||||
std::shared_ptr<groups::ServerGroup> s_group{};
|
||||
create_result = serverInstance->group_manager()->server_groups()->create_group(info->target == 0 ? groups::GroupType::GROUP_TYPE_QUERY : groups::GroupType::GROUP_TYPE_TEMPLATE, info->name, s_group);
|
||||
created_group = s_group;
|
||||
}
|
||||
|
||||
|
@ -62,8 +62,8 @@ ClientPermissionCalculator::ClientPermissionCalculator(
|
||||
if(server) {
|
||||
this->virtual_server_id = server->getServerId();
|
||||
this->group_manager_ = server->group_manager();
|
||||
this->default_server_group = [server]{ return server->default_server_group(); };
|
||||
this->default_channel_group = [server]{ return server->default_channel_group(); };
|
||||
|
||||
std::shared_ptr<BasicChannel> channel{};
|
||||
try {
|
||||
std::shared_lock channel_lock{server->get_channel_tree_lock()};
|
||||
@ -94,6 +94,7 @@ void ClientPermissionCalculator::initialize_client(DataClient* client) {
|
||||
auto server = client->getServer();
|
||||
if(server) {
|
||||
this->group_manager_ = server->group_manager();
|
||||
this->default_server_group = [server]{ return server->default_server_group(); };
|
||||
this->default_channel_group = [server]{ return server->default_channel_group(); };
|
||||
} else {
|
||||
this->group_manager_ = serverInstance->group_manager();
|
||||
@ -340,6 +341,12 @@ const std::vector<std::shared_ptr<groups::ServerGroup>>& ClientPermissionCalcula
|
||||
this->assigned_server_groups_->push_back(group);
|
||||
}
|
||||
}
|
||||
if(this->assigned_server_groups_->empty() && this->default_server_group) {
|
||||
auto default_group = this->default_server_group();
|
||||
if(default_group) {
|
||||
this->assigned_server_groups_->push_back(default_group);
|
||||
}
|
||||
}
|
||||
|
||||
return *this->assigned_server_groups_;
|
||||
}
|
||||
|
@ -65,6 +65,7 @@ namespace ts::server {
|
||||
std::shared_ptr<groups::GroupManager> group_manager_{};
|
||||
std::shared_ptr<permission::v2::PermissionManager> channel_permissions{};
|
||||
std::function<std::shared_ptr<groups::ChannelGroup>()> default_channel_group{[]{ return nullptr; }};
|
||||
std::function<std::shared_ptr<groups::ServerGroup>()> default_server_group{[]{ return nullptr; }};
|
||||
|
||||
/* fields which will be set when calculating permissions */
|
||||
std::shared_ptr<permission::v2::PermissionManager> client_permissions{};
|
||||
|
@ -1028,15 +1028,15 @@ bool VirtualServer::resetPermissions(std::string& new_permission_token) {
|
||||
|
||||
this->ensureValidDefaultGroups();
|
||||
|
||||
this->task_notify_channel_group_list.enqueue();
|
||||
this->task_notify_server_group_list.enqueue();
|
||||
|
||||
for(const auto& client : this->getClients()) {
|
||||
client->task_update_displayed_groups.enqueue();
|
||||
client->task_update_needed_permissions.enqueue();
|
||||
client->task_update_channel_client_properties.enqueue();
|
||||
}
|
||||
|
||||
this->task_notify_channel_group_list.enqueue();
|
||||
this->task_notify_server_group_list.enqueue();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1169,11 +1169,33 @@ void VirtualServer::update_channel_from_permissions(const std::shared_ptr<BasicC
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<groups::ServerGroup> VirtualServer::default_server_group() {
|
||||
auto group_id = this->properties()[property::VIRTUALSERVER_DEFAULT_SERVER_GROUP].as_or<GroupId>(0);
|
||||
auto group = this->group_manager()->server_groups()->find_group(groups::GroupCalculateMode::GLOBAL, group_id);
|
||||
if(!group) {
|
||||
auto groups = this->group_manager()->server_groups()->available_groups(groups::GroupCalculateMode::GLOBAL);
|
||||
if(groups.empty()) {
|
||||
logCritical(this->serverId, "Having no available server groups.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* TODO: Log warning? */
|
||||
group = groups.back();
|
||||
}
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
std::shared_ptr<groups::ChannelGroup> VirtualServer::default_channel_group() {
|
||||
auto group_id = this->properties()[property::VIRTUALSERVER_DEFAULT_CHANNEL_GROUP].as_or<GroupId>(0);
|
||||
auto group = this->group_manager()->channel_groups()->find_group(groups::GroupCalculateMode::GLOBAL, group_id);
|
||||
if(!group) {
|
||||
auto groups = this->group_manager()->channel_groups()->available_groups(groups::GroupCalculateMode::GLOBAL);
|
||||
if(groups.empty()) {
|
||||
logCritical(this->serverId, "Having no available channel groups.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* TODO: Log warning? */
|
||||
group = groups.back();
|
||||
}
|
||||
|
@ -72,6 +72,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
namespace groups {
|
||||
class ServerGroup;
|
||||
class ChannelGroup;
|
||||
class GroupManager;
|
||||
}
|
||||
@ -182,6 +183,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
[[nodiscard]] inline auto group_manager() { return this->groups_manager_; }
|
||||
[[nodiscard]] std::shared_ptr<groups::ServerGroup> default_server_group();
|
||||
[[nodiscard]] std::shared_ptr<groups::ChannelGroup> default_channel_group();
|
||||
|
||||
bool notifyServerEdited(std::shared_ptr<ConnectedClient>, std::deque<std::string> keys);
|
||||
|
@ -1047,6 +1047,10 @@ void ConnectedClient::update_displayed_client_groups(bool& server_groups_changed
|
||||
|
||||
if(!server_group_assignments.empty()) {
|
||||
server_group_assignments = server_group_assignments.substr(1);
|
||||
} else if(auto default_group{ref_server->default_server_group()}; default_group) {
|
||||
server_group_assignments = std::to_string(default_group->group_id());
|
||||
} else {
|
||||
server_group_assignments = "0";
|
||||
}
|
||||
|
||||
std::unique_lock view_lock{this->channel_lock};
|
||||
|
@ -91,28 +91,28 @@ command_result ConnectedClient::handleCommandServerEdit(Command &cmd) {
|
||||
SERVEREDIT_CHK_PROP_CACHED("virtualserver_default_server_group", permission::b_virtualserver_modify_default_servergroup, GroupId)
|
||||
if(target_server) {
|
||||
auto target_group = group_manager->server_groups()->find_group(groups::GroupCalculateMode::GLOBAL, cmd["virtualserver_default_server_group"].as<GroupId>());
|
||||
if (target_group) {
|
||||
if (!target_group) {
|
||||
return command_result{error::group_invalid_id};
|
||||
}
|
||||
}
|
||||
} SERVEREDIT_CHK_PROP_CACHED("virtualserver_default_channel_group", permission::b_virtualserver_modify_default_channelgroup, GroupId)
|
||||
if(target_server) {
|
||||
auto target_group = group_manager->channel_groups()->find_group(groups::GroupCalculateMode::GLOBAL, cmd["virtualserver_default_channel_group"].as<GroupId>());
|
||||
if (target_group) {
|
||||
if (!target_group) {
|
||||
return command_result{error::group_invalid_id};
|
||||
}
|
||||
}
|
||||
} SERVEREDIT_CHK_PROP_CACHED("virtualserver_default_channel_admin_group", permission::b_virtualserver_modify_default_channeladmingroup, GroupId)
|
||||
if(target_server) {
|
||||
auto target_group = group_manager->channel_groups()->find_group(groups::GroupCalculateMode::GLOBAL, cmd["virtualserver_default_channel_admin_group"].as<GroupId>());
|
||||
if (target_group) {
|
||||
if (!target_group) {
|
||||
return command_result{error::group_invalid_id};
|
||||
}
|
||||
}
|
||||
} SERVEREDIT_CHK_PROP_CACHED("virtualserver_default_music_group", permission::b_virtualserver_modify_default_musicgroup, GroupId)
|
||||
if(target_server) {
|
||||
auto target_group = group_manager->server_groups()->find_group(groups::GroupCalculateMode::GLOBAL, cmd["virtualserver_default_server_group"].as<GroupId>());
|
||||
if (target_group) {
|
||||
if (!target_group) {
|
||||
return command_result{error::group_invalid_id};
|
||||
}
|
||||
}
|
||||
@ -366,10 +366,14 @@ command_result ConnectedClient::handleCommandServerGroupClientList(Command &cmd)
|
||||
}
|
||||
|
||||
if(index == 0) {
|
||||
return ts::command_result{error::database_empty_result};
|
||||
if(this->getType() != ClientType::CLIENT_TEAMSPEAK) {
|
||||
/* TS3 clients don't want a error here. They're fine with just not receiving a notify */
|
||||
return ts::command_result{error::database_empty_result};
|
||||
}
|
||||
} else {
|
||||
this->sendCommand(notify);
|
||||
}
|
||||
|
||||
this->sendCommand(notify);
|
||||
return command_result{error::ok};
|
||||
}
|
||||
|
||||
|
@ -734,6 +734,11 @@ void GroupAssignmentManager::handle_channel_group_deleted(GroupId group_id) {
|
||||
void GroupAssignmentManager::reset_all() {
|
||||
auto sql = sql::command{this->sql_manager(), "DELETE FROM `assignedGroups` WHERE `serverId` = :sid", variable{":sid", this->server_id()}};
|
||||
sql.executeLater().waitAndGetLater(LOG_SQL_CMD, {-1, "failed to delete all assignments"});
|
||||
|
||||
{
|
||||
std::lock_guard cache_lock{*this->client_cache_lock};
|
||||
this->client_cache.clear();
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<TemporaryAssignmentsLock> GroupAssignmentManager::create_tmp_assignment_lock(ClientDbId cldbid) {
|
||||
|
@ -122,12 +122,12 @@ void AbstractGroupManager::reset_groups(std::map<GroupId, GroupId> &mapping) {
|
||||
|
||||
/* Delete all old groups */
|
||||
{
|
||||
LOG_SQL_CMD(sql::command(this->sql_manager(), "DELETE FROM `permissions` WHERE `serverId` = :serverId AND `type` = :type AND `id` IN (SELECT `groupId` FROM `groups` WHERE `serverId` = :serverId AND AND `target` = :target)",
|
||||
LOG_SQL_CMD(sql::command(this->sql_manager(), "DELETE FROM `permissions` WHERE `serverId` = :serverId AND `type` = :type AND `id` IN (SELECT `groupId` FROM `groups` WHERE `serverId` = :serverId AND `target` = :target)",
|
||||
variable{":serverId", this->server_id()},
|
||||
variable{":type", ts::permission::SQL_PERM_GROUP},
|
||||
variable{":target", (uint8_t) this->database_target_}).execute());
|
||||
|
||||
LOG_SQL_CMD(sql::command(this->sql_manager(), "DELETE FROM `assignedGroups` WHERE `serverId` = :serverId AND `groupId` IN (SELECT `groupId` FROM `groups` WHERE `serverId` = :serverId AND AND `target` = :target)",
|
||||
LOG_SQL_CMD(sql::command(this->sql_manager(), "DELETE FROM `assignedGroups` WHERE `serverId` = :serverId AND `groupId` IN (SELECT `groupId` FROM `groups` WHERE `serverId` = :AND AND `target` = :target)",
|
||||
variable{":serverId", this->server_id()},
|
||||
variable{":target", (uint8_t) this->database_target_}).execute());
|
||||
|
||||
@ -137,7 +137,8 @@ void AbstractGroupManager::reset_groups(std::map<GroupId, GroupId> &mapping) {
|
||||
).execute());
|
||||
}
|
||||
|
||||
if(auto error = this->load_data(true); error != GroupLoadResult::SUCCESS) {
|
||||
/* we expect to not have any groups */
|
||||
if(auto error = this->load_data(true); error != GroupLoadResult::NO_GROUPS) {
|
||||
logCritical(this->server_id(), "Failed to load groups after group unload ({}). There might be no groups loaded now!", (int) error);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user