Updates
This commit is contained in:
@@ -106,20 +106,36 @@ do { \
|
||||
inline bool permission_require_granted_value(permission::PermissionType type) {
|
||||
switch (type) {
|
||||
case permission::i_permission_modify_power:
|
||||
|
||||
case permission::i_channel_group_member_add_power:
|
||||
case permission::i_channel_group_member_remove_power:
|
||||
case permission::i_channel_group_modify_power:
|
||||
|
||||
case permission::i_channel_group_needed_member_add_power:
|
||||
case permission::i_channel_group_needed_member_remove_power:
|
||||
case permission::i_channel_group_needed_modify_power:
|
||||
|
||||
|
||||
case permission::i_server_group_member_add_power:
|
||||
case permission::i_server_group_member_remove_power:
|
||||
case permission::i_server_group_modify_power:
|
||||
|
||||
case permission::i_server_group_needed_member_add_power:
|
||||
case permission::i_server_group_needed_member_remove_power:
|
||||
case permission::i_server_group_needed_modify_power:
|
||||
|
||||
case permission::i_displayed_group_member_add_power:
|
||||
case permission::i_displayed_group_member_remove_power:
|
||||
case permission::i_displayed_group_modify_power:
|
||||
|
||||
case permission::i_displayed_group_needed_member_add_power:
|
||||
case permission::i_displayed_group_needed_member_remove_power:
|
||||
case permission::i_displayed_group_needed_modify_power:
|
||||
|
||||
case permission::i_channel_permission_modify_power:
|
||||
case permission::i_channel_needed_permission_modify_power:
|
||||
case permission::i_client_permission_modify_power:
|
||||
case permission::i_client_needed_permission_modify_power:
|
||||
|
||||
case permission::i_client_needed_kick_from_server_power:
|
||||
case permission::i_client_needed_kick_from_channel_power:
|
||||
@@ -1812,6 +1828,8 @@ CommandResult ConnectedClient::handleCommandChannelEdit(Command &cmd) {
|
||||
} else {
|
||||
CHANNEL_PERM_TEST(permission::i_channel_create_modify_conversation_history_length, 1, true);
|
||||
}
|
||||
} else if (key == "channel_flag_conversation_private") {
|
||||
CHANNEL_PERM_TEST(permission::b_channel_create_modify_conversation_private, 1, true);
|
||||
} else {
|
||||
logCritical(
|
||||
this->getServerId(),
|
||||
@@ -2589,7 +2607,6 @@ CommandResult ConnectedClient::handleCommandServerGroupCopy(Command &cmd) {
|
||||
return CommandResult::Success;
|
||||
}
|
||||
|
||||
//servergrouprename sgid=2 name=Operators
|
||||
CommandResult ConnectedClient::handleCommandServerGroupRename(Command &cmd) {
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(5);
|
||||
@@ -2961,20 +2978,22 @@ CommandResult ConnectedClient::handleCommandServerGroupDelPerm(Command &cmd) {
|
||||
}
|
||||
|
||||
CommandResult ConnectedClient::handleCommandServerGroupAutoAddPerm(ts::Command& cmd) {
|
||||
CMD_REQ_SERVER;
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(5);
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(25);
|
||||
|
||||
auto ref_server = this->server;
|
||||
auto group_manager = ref_server ? this->server->groups : &*serverInstance->getGroupManager();
|
||||
|
||||
deque<shared_ptr<Group>> groups;
|
||||
for(const auto& group : this->server->groups->availableGroups(false)) {
|
||||
for(const auto& group : group_manager->availableGroups(false)) {
|
||||
if(group->updateType() == cmd["sgtype"].as<permission::PermissionValue>() && group->target() == GROUPTARGET_SERVER) {
|
||||
if(group->permission_granted(permission::i_server_group_needed_modify_power, this->calculate_permission_value(permission::i_server_group_modify_power, 0), true)) {
|
||||
auto type = group->type();
|
||||
if(type == GroupType::GROUP_TYPE_QUERY) {
|
||||
if(!this->permission_granted(this->cached_permission_value(permission::b_serverinstance_modify_querygroup), 1, true))
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_serverinstance_modify_querygroup, 1))
|
||||
continue;
|
||||
} else if(type == GroupType::GROUP_TYPE_TEMPLATE) {
|
||||
if(!this->permission_granted(this->cached_permission_value(permission::b_serverinstance_modify_templates), 1, true))
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_serverinstance_modify_templates, 1))
|
||||
continue;
|
||||
}
|
||||
groups.push_back(group);//sgtype
|
||||
@@ -2986,7 +3005,8 @@ CommandResult ConnectedClient::handleCommandServerGroupAutoAddPerm(ts::Command&
|
||||
return CommandResult::Success;
|
||||
|
||||
auto maxValue = this->getPermissionGrantValue(permission::PERMTEST_ORDERED, permission::i_permission_modify_power, this->currentChannel);
|
||||
bool ignoreGrant = this->permission_granted(this->cached_permission_value(permission::b_permission_modify_power_ignore), 1);
|
||||
|
||||
bool ignoreGrant = this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_permission_modify_power_ignore, 1);
|
||||
bool conOnError = cmd[0].has("continueonerror");
|
||||
bool checkTp = false;
|
||||
bool sgroupUpdate = false;
|
||||
@@ -3029,45 +3049,48 @@ CommandResult ConnectedClient::handleCommandServerGroupAutoAddPerm(ts::Command&
|
||||
group->apply_properties_from_permissions();
|
||||
|
||||
auto lock = this->_this.lock();
|
||||
auto server = this->server;
|
||||
threads::Thread([checkTp, sgroupUpdate, groups, lock, server]() {
|
||||
if(sgroupUpdate)
|
||||
server->forEachClient([](shared_ptr<ConnectedClient> cl) {
|
||||
cl->notifyServerGroupList();
|
||||
});
|
||||
server->forEachClient([groups, checkTp](shared_ptr<ConnectedClient> cl) {
|
||||
for(const auto& serverGroup : groups) {
|
||||
if (cl->serverGroupAssigned(serverGroup)) {
|
||||
if(cl->update_cached_permissions()) {/* update cached calculated permissions */
|
||||
cl->sendNeededPermissions(false); /* cached permissions had changed, notify the client */
|
||||
}
|
||||
if (checkTp) {
|
||||
cl->updateChannelClientProperties(true, true);
|
||||
}
|
||||
cl->join_state_id++; /* join permission may changed, all channels need to be recalculate if needed */
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}).detach();
|
||||
if(ref_server) {
|
||||
threads::Thread([checkTp, sgroupUpdate, groups, lock, ref_server]() {
|
||||
if(sgroupUpdate)
|
||||
ref_server->forEachClient([](shared_ptr<ConnectedClient> cl) {
|
||||
cl->notifyServerGroupList();
|
||||
});
|
||||
ref_server->forEachClient([groups, checkTp](shared_ptr<ConnectedClient> cl) {
|
||||
for(const auto& serverGroup : groups) {
|
||||
if (cl->serverGroupAssigned(serverGroup)) {
|
||||
if(cl->update_cached_permissions()) {/* update cached calculated permissions */
|
||||
cl->sendNeededPermissions(false); /* cached permissions had changed, notify the client */
|
||||
}
|
||||
if (checkTp) {
|
||||
cl->updateChannelClientProperties(true, true);
|
||||
}
|
||||
cl->join_state_id++; /* join permission may changed, all channels need to be recalculate if needed */
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}).detach();
|
||||
}
|
||||
return CommandResult::Success;
|
||||
}
|
||||
|
||||
CommandResult ConnectedClient::handleCommandServerGroupAutoDelPerm(ts::Command& cmd) {
|
||||
CMD_REQ_SERVER;
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(5);
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(25);
|
||||
|
||||
auto ref_server = this->server;
|
||||
auto group_manager = ref_server ? this->server->groups : &*serverInstance->getGroupManager();
|
||||
|
||||
deque<shared_ptr<Group>> groups;
|
||||
for(const auto& group : this->server->groups->availableGroups(false)) {
|
||||
for(const auto& group : group_manager->availableGroups(false)) {
|
||||
if(group->updateType() == cmd["sgtype"].as<permission::PermissionValue>() && group->target() == GROUPTARGET_SERVER) {
|
||||
if(group->permission_granted(permission::i_server_group_needed_modify_power, this->calculate_permission_value(permission::i_server_group_modify_power, 0), true)) {
|
||||
auto type = group->type();
|
||||
if(type == GroupType::GROUP_TYPE_QUERY) {
|
||||
if(!this->permission_granted(this->cached_permission_value(permission::b_serverinstance_modify_querygroup), 1, true))
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_serverinstance_modify_querygroup, 1))
|
||||
continue;
|
||||
} else if(type == GroupType::GROUP_TYPE_TEMPLATE) {
|
||||
if(!this->permission_granted(this->cached_permission_value(permission::b_serverinstance_modify_templates), 1, true))
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_serverinstance_modify_templates, 1))
|
||||
continue;
|
||||
}
|
||||
groups.push_back(group);//sgtype
|
||||
@@ -3077,7 +3100,7 @@ CommandResult ConnectedClient::handleCommandServerGroupAutoDelPerm(ts::Command&
|
||||
|
||||
if(groups.empty()) return CommandResult::Success;
|
||||
|
||||
bool ignoreGrant = this->permission_granted(this->cached_permission_value(permission::b_permission_modify_power_ignore), 1);
|
||||
bool ignoreGrant = this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_permission_modify_power_ignore, 1);
|
||||
bool conOnError = cmd[0].has("continueonerror");
|
||||
bool checkTp = false;
|
||||
auto sgroupUpdate = false;
|
||||
@@ -3106,30 +3129,32 @@ CommandResult ConnectedClient::handleCommandServerGroupAutoDelPerm(ts::Command&
|
||||
}
|
||||
|
||||
|
||||
if(sgroupUpdate)
|
||||
if(sgroupUpdate) {
|
||||
for(auto& group : groups)
|
||||
group->apply_properties_from_permissions();
|
||||
}
|
||||
|
||||
auto lock = this->_this.lock();
|
||||
auto server = this->server;
|
||||
threads::Thread([checkTp, sgroupUpdate, groups, lock, server]() {
|
||||
if(sgroupUpdate)
|
||||
server->forEachClient([](shared_ptr<ConnectedClient> cl) {
|
||||
cl->notifyServerGroupList();
|
||||
});
|
||||
server->forEachClient([groups, checkTp](shared_ptr<ConnectedClient> cl) {
|
||||
for(const auto& serverGroup : groups) {
|
||||
if (cl->serverGroupAssigned(serverGroup)) {
|
||||
if(cl->update_cached_permissions()) /* update cached calculated permissions */
|
||||
cl->sendNeededPermissions(false); /* cached permissions had changed, notify the client */
|
||||
if (checkTp)
|
||||
cl->updateChannelClientProperties(true, true);
|
||||
cl->join_state_id++; /* join permission may changed, all channels need to be recalculate dif needed */
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}).detach();
|
||||
if(ref_server) {
|
||||
auto lock = this->_this.lock();
|
||||
threads::Thread([checkTp, sgroupUpdate, groups, lock, ref_server]() {
|
||||
if(sgroupUpdate)
|
||||
ref_server->forEachClient([](shared_ptr<ConnectedClient> cl) {
|
||||
cl->notifyServerGroupList();
|
||||
});
|
||||
ref_server->forEachClient([groups, checkTp](shared_ptr<ConnectedClient> cl) {
|
||||
for(const auto& serverGroup : groups) {
|
||||
if (cl->serverGroupAssigned(serverGroup)) {
|
||||
if(cl->update_cached_permissions()) /* update cached calculated permissions */
|
||||
cl->sendNeededPermissions(false); /* cached permissions had changed, notify the client */
|
||||
if (checkTp)
|
||||
cl->updateChannelClientProperties(true, true);
|
||||
cl->join_state_id++; /* join permission may changed, all channels need to be recalculate dif needed */
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}).detach();
|
||||
}
|
||||
|
||||
return CommandResult::Success;
|
||||
}
|
||||
@@ -3267,7 +3292,12 @@ CommandResult ConnectedClient::handleCommandSendTextMessage(Command &cmd) {
|
||||
|
||||
if(!this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_client_channel_textmessage_send, 1, channel, false))
|
||||
return CommandResultPermissionError{permission::b_client_channel_textmessage_send};
|
||||
|
||||
bool conversation_private = channel->properties()[property::CHANNEL_FLAG_CONVERSATION_PRIVATE].as<bool>();
|
||||
if(channel != this->currentChannel) {
|
||||
if(conversation_private)
|
||||
return {findError("conversation_is_private")};
|
||||
|
||||
if(!this->calculate_and_get_join_state(channel))
|
||||
return CommandResultPermissionError{permission::unknown}; /* You're not allowed to send messages :) */
|
||||
}
|
||||
@@ -3286,6 +3316,9 @@ CommandResult ConnectedClient::handleCommandSendTextMessage(Command &cmd) {
|
||||
continue;
|
||||
|
||||
auto own_channel = client->currentChannel == this->currentChannel;
|
||||
if(conversation_private && !own_channel)
|
||||
continue;
|
||||
|
||||
if(type != ClientType::CLIENT_TEAMSPEAK || own_channel) {
|
||||
if(!own_channel && &*client != this) {
|
||||
if(flag_password)
|
||||
@@ -3297,16 +3330,32 @@ CommandResult ConnectedClient::handleCommandSendTextMessage(Command &cmd) {
|
||||
client->notifyTextMessage(ChatMessageMode::TEXTMODE_CHANNEL, _this, client_id, channel_id, message);
|
||||
}
|
||||
}
|
||||
auto conversations = this->server->conversation_manager();
|
||||
auto conversation = conversations->get_or_create(channel->channelId());
|
||||
conversation->register_message(this->getClientDatabaseId(), this->getUid(), this->getDisplayName(), cmd["msg"].string());
|
||||
|
||||
if(!conversation_private) {
|
||||
auto conversations = this->server->conversation_manager();
|
||||
auto conversation = conversations->get_or_create(channel->channelId());
|
||||
conversation->register_message(this->getClientDatabaseId(), this->getUid(), this->getDisplayName(), cmd["msg"].string());
|
||||
}
|
||||
} else if (cmd["targetmode"] == ChatMessageMode::TEXTMODE_SERVER) {
|
||||
CACHED_PERM_CHECK(permission::b_client_server_textmessage_send, 1);
|
||||
|
||||
if(this->handleTextMessage(ChatMessageMode::TEXTMODE_SERVER, cmd["msg"], nullptr)) return CommandResult::Success;
|
||||
this->server->forEachClient([&](shared_ptr<ConnectedClient> client) {
|
||||
client->notifyTextMessage(ChatMessageMode::TEXTMODE_SERVER, _this.lock(), this->getClientId(), 0, cmd["msg"].string());
|
||||
});
|
||||
for(const auto& client : this->server->getClients()) {
|
||||
if (client->connectionState() != ConnectionState::CONNECTED)
|
||||
continue;
|
||||
|
||||
auto type = client->getType();
|
||||
if (type == ClientType::CLIENT_INTERNAL || type == ClientType::CLIENT_MUSIC)
|
||||
continue;
|
||||
|
||||
client->notifyTextMessage(ChatMessageMode::TEXTMODE_SERVER, _this.lock(), this->getClientId(), 0, cmd["msg"].string());
|
||||
}
|
||||
|
||||
{
|
||||
auto conversations = this->server->conversation_manager();
|
||||
auto conversation = conversations->get_or_create(0);
|
||||
conversation->register_message(this->getClientDatabaseId(), this->getUid(), this->getDisplayName(), cmd["msg"].string());
|
||||
}
|
||||
} else return {findError("parameter_invalid"), "invalid target mode"};
|
||||
|
||||
return CommandResult::Success;
|
||||
@@ -4585,6 +4634,11 @@ CommandResult ConnectedClient::handleCommandClientEdit(Command &cmd, const std::
|
||||
CACHED_PERM_CHECK(permission::b_client_music_modify_permanent, 1, true);
|
||||
} else
|
||||
return {findError("parameter_invalid")};
|
||||
} else if(*info == property::CLIENT_AWAY_MESSAGE) {
|
||||
if(!self) continue;
|
||||
|
||||
if(cmd["client_away_message"].string().length() > 256)
|
||||
return {findError("parameter_invalid")};
|
||||
} else if(!self) { /* dont edit random properties of other clients. For us self its allowed to edit the rest without permissions */
|
||||
continue;
|
||||
}
|
||||
@@ -5115,13 +5169,13 @@ CommandResult ConnectedClient::handleCommandChannelClientAddPerm(Command &cmd) {
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(5);
|
||||
if (!serverInstance->databaseHelper()->validClientDatabaseId(this->server, cmd["cldbid"])) return {findError("parameter_invalid"), "Invalid manager db id"};
|
||||
|
||||
auto mgr = serverInstance->databaseHelper()->loadClientPermissionManager(this->server, cmd["cldbid"]);
|
||||
PERM_CHECKR(permission::i_client_permission_modify_power, this->server->calculatePermission(permission::PERMTEST_ORDERED, cmd["cldbid"], permission::i_client_needed_permission_modify_power, ClientType::CLIENT_TEAMSPEAK, nullptr), true);
|
||||
|
||||
RESOLVE_CHANNEL_R(cmd["cid"], true);
|
||||
auto channel = dynamic_pointer_cast<ServerChannel>(l_channel->entry);
|
||||
if(!channel) return {ErrorType::VSError};
|
||||
|
||||
auto mgr = serverInstance->databaseHelper()->loadClientPermissionManager(this->server, cmd["cldbid"]);
|
||||
PERM_CHECK_CHANNELR(permission::i_client_permission_modify_power, this->server->calculatePermission(permission::PERMTEST_ORDERED, cmd["cldbid"], permission::i_client_needed_permission_modify_power, ClientType::CLIENT_TEAMSPEAK, channel), channel, true);
|
||||
|
||||
|
||||
auto maxValue = this->getPermissionGrantValue(permission::PERMTEST_ORDERED, permission::i_permission_modify_power, this->currentChannel);
|
||||
bool ignoreGrant = this->permissionGranted(permission::PERMTEST_ORDERED, permission::b_permission_modify_power_ignore, 1, this->currentChannel);
|
||||
@@ -7377,6 +7431,8 @@ CommandResult ConnectedClient::handleCommandConversationHistory(ts::Command &com
|
||||
auto channel = this->channel_view()->find_channel(conversation_id);
|
||||
if(!channel)
|
||||
return {findError("conversation_invalid_id")};
|
||||
if(channel->channel()->properties()[property::CHANNEL_FLAG_CONVERSATION_PRIVATE].as<bool>())
|
||||
return {findError("conversation_is_private")};
|
||||
}
|
||||
|
||||
/* test if there is a channel password or join power which denies that we see the conversation */
|
||||
@@ -7497,6 +7553,12 @@ CommandResult ConnectedClient::handleCommandConversationFetch(ts::Command &cmd)
|
||||
result_bulk["error_msg"] = error.message;
|
||||
continue;
|
||||
}
|
||||
if(channel->channel()->properties()[property::CHANNEL_FLAG_CONVERSATION_PRIVATE].as<bool>()) {
|
||||
auto error = findError("conversation_is_private");
|
||||
result_bulk["error_id"] = error.errorId;
|
||||
result_bulk["error_msg"] = error.message;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* test if there is a channel password or join power which denies that we see the conversation */
|
||||
|
||||
Reference in New Issue
Block a user