From 0216b3468119bdd0b3fdceaec6f5dcb1b70dfe06 Mon Sep 17 00:00:00 2001 From: Kalila L Date: Wed, 17 Mar 2021 19:37:06 -0400 Subject: [PATCH] State of refactoring --- .../src/DomainServerSettingsManager.cpp | 39 +++++++------------ interface/src/Application.cpp | 6 +-- interface/src/Application.h | 2 +- libraries/networking/src/NodeList.cpp | 20 +++++++--- libraries/networking/src/NodeList.h | 2 +- .../UserActivityLoggerScriptingInterface.h | 1 + .../src/UsersScriptingInterface.cpp | 7 ++-- .../src/UsersScriptingInterface.h | 14 +++++-- libraries/shared/src/ModerationFlags.h | 28 +++++++++++++ 9 files changed, 77 insertions(+), 42 deletions(-) create mode 100644 libraries/shared/src/ModerationFlags.h diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 0b0db28876..0f5f4741d9 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include "DomainServerNodeData.h" @@ -864,15 +865,17 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointerreadWithoutCopy(NUM_BYTES_RFC4122_UUID)); bool hasOptionalBanParameters = false; - bool banByUsername = false; - bool banByFingerprint = false; - bool banByIP = false; + int banParameters; + bool banByUsername; + bool banByFingerprint; + bool banByIP; // pull optional ban parameters from the packet if (message.data()->getSize() > NUM_BYTES_RFC4122_UUID) { hasOptionalBanParameters = true; - message->readPrimitive(&banByUsername); - message->readPrimitive(&banByFingerprint); - message->readPrimitive(&banByIP); + message->readPrimitive(&banParameters); + banByUsername = banParameters & ModerationFlags::BanFlags::BAN_BY_USERNAME; + banByFingerprint = banParameters & ModerationFlags::BanFlags::BAN_BY_FINGERPRINT; + banByIP = banParameters & ModerationFlags::BanFlags::BAN_BY_IP; } if (!nodeUUID.isNull() && nodeUUID != sendingNode->getUUID()) { @@ -894,28 +897,16 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointergetPermissions().getKey()]; - - newPermissions = !hadPermissions || userPermissions->can(NodePermissions::Permission::canConnectToDomain); - - // ensure that the connect permission is clear - userPermissions->clear(NodePermissions::Permission::canConnectToDomain); - } - } else { + if (!hasOptionalBanParameters || banByUsername) { // check if there were already permissions bool hadPermissions = havePermissionsForName(verifiedUsername); - + // grab or create permissions for the given username auto userPermissions = _agentPermissions[matchingNode->getPermissions().getKey()]; - - newPermissions = !hadPermissions || userPermissions->can(NodePermissions::Permission::canConnectToDomain); - + + newPermissions = + !hadPermissions || userPermissions->can(NodePermissions::Permission::canConnectToDomain); + // ensure that the connect permission is clear userPermissions->clear(NodePermissions::Permission::canConnectToDomain); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f2e17c8dc1..18f993f2f7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2493,7 +2493,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo return viewFrustum.getPosition(); }); - DependencyManager::get()->setKickConfirmationOperator([this] (const QUuid& nodeID, bool banByUsername, bool banByFingerprint, bool banByIP) { userKickConfirmation(nodeID, banByUsername, banByFingerprint, banByIP); }); + DependencyManager::get()->setKickConfirmationOperator([this] (const QUuid& nodeID, int banFlags) { userKickConfirmation(nodeID, banFlags); }); render::entities::WebEntityRenderer::setAcquireWebSurfaceOperator([=](const QString& url, bool htmlContent, QSharedPointer& webSurface, bool& cachedWebSurface) { bool isTablet = url == TabletScriptingInterface::QML; @@ -3575,7 +3575,7 @@ void Application::onDesktopRootItemCreated(QQuickItem* rootItem) { _desktopRootItemCreated = true; } -void Application::userKickConfirmation(const QUuid& nodeID, bool banByUsername, bool banByFingerprint, bool banByIP) { +void Application::userKickConfirmation(const QUuid& nodeID, int banFlags) { auto avatarHashMap = DependencyManager::get(); auto avatar = avatarHashMap->getAvatarBySessionID(nodeID); @@ -3600,7 +3600,7 @@ void Application::userKickConfirmation(const QUuid& nodeID, bool banByUsername, // ask the NodeList to kick the user with the given session ID if (yes) { - DependencyManager::get()->kickNodeBySessionID(nodeID, banByUsername, banByFingerprint, banByIP); + DependencyManager::get()->kickNodeBySessionID(nodeID, banFlags); } DependencyManager::get()->setWaitForKickResponse(false); diff --git a/interface/src/Application.h b/interface/src/Application.h index 65638b92db..aa2c62658e 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -608,7 +608,7 @@ private: void toggleTabletUI(bool shouldOpen = false) const; bool shouldCaptureMouse() const; - void userKickConfirmation(const QUuid& nodeID, bool banByUsername, bool banByFingerprint, bool banByIP); + void userKickConfirmation(const QUuid& nodeID, int banFlags); MainWindow* _window; QElapsedTimer& _sessionRunTimer; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 6f3f774452..e67423a24a 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -42,6 +42,7 @@ #include "udt/PacketHeaders.h" #include "SharedUtil.h" #include +#include using namespace std::chrono; @@ -1263,21 +1264,30 @@ float NodeList::getInjectorGain() { return _injectorGain; } -void NodeList::kickNodeBySessionID(const QUuid& nodeID, bool banByUsername, bool banByFingerprint, bool banByIP) { +void NodeList::kickNodeBySessionID(const QUuid& nodeID, int banFlags) { // send a request to domain-server to kick the node with the given session ID // the domain-server will handle the persistence of the kick (via username or IP) if (!nodeID.isNull() && getSessionUUID() != nodeID ) { if (getThisNodeCanKick()) { // setup the packet - auto kickPacket = NLPacket::create(PacketType::NodeKickRequest, NUM_BYTES_RFC4122_UUID + (sizeof(bool) * 3), true); + auto kickPacket = NLPacket::create(PacketType::NodeKickRequest, NUM_BYTES_RFC4122_UUID + sizeof(int), true); + + //int banParameters {}; + //if (banByUsername) { + // banParameters |= ModerationFlags::BanFlags::BAN_BY_USERNAME; + //} + //if (banByFingerprint) { + // banParameters |= ModerationFlags::BanFlags::BAN_BY_FINGERPRINT; + //} + //if (banByIP) { + // banParameters |= ModerationFlags::BanFlags::BAN_BY_IP; + //} // write the node ID to the packet kickPacket->write(nodeID.toRfc4122()); // write the ban parameters to the packet - kickPacket->writePrimitive(banByUsername); - kickPacket->writePrimitive(banByFingerprint); - kickPacket->writePrimitive(banByIP); + kickPacket->writePrimitive(banFlags); qCDebug(networking) << "Sending packet to kick node" << uuidStringWithoutCurlyBraces(nodeID); diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 3573db1b9f..673b5dab55 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -86,7 +86,7 @@ public: void setInjectorGain(float gain); float getInjectorGain(); - void kickNodeBySessionID(const QUuid& nodeID, bool banByUsername = true, bool banByFingerprint = true, bool banByIP = false); + void kickNodeBySessionID(const QUuid& nodeID, int banFlags); void muteNodeBySessionID(const QUuid& nodeID); void requestUsernameFromSessionID(const QUuid& nodeID); bool getRequestsDomainListData() { return _requestsDomainListData; } diff --git a/libraries/networking/src/UserActivityLoggerScriptingInterface.h b/libraries/networking/src/UserActivityLoggerScriptingInterface.h index 1cda1235e9..94e1590e88 100644 --- a/libraries/networking/src/UserActivityLoggerScriptingInterface.h +++ b/libraries/networking/src/UserActivityLoggerScriptingInterface.h @@ -1,3 +1,4 @@ + // // UserActivityLoggerScriptingInterface.h // libraries/networking/src diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index c22c1d270e..9b580528d5 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -52,15 +52,14 @@ float UsersScriptingInterface::getAvatarGain(const QUuid& nodeID) { return DependencyManager::get()->getAvatarGain(nodeID); } -void UsersScriptingInterface::kick(const QUuid& nodeID, bool banByUsername, bool banByFingerprint, bool banByIP) { - +void UsersScriptingInterface::kick(const QUuid& nodeID, int banFlags) { if (_kickConfirmationOperator) { bool waitingForKickResponse = _kickResponseLock.resultWithReadLock([&] { return _waitingForKickResponse; }); if (getCanKick() && !waitingForKickResponse) { - _kickConfirmationOperator(nodeID, banByUsername, banByFingerprint, banByIP); + _kickConfirmationOperator(nodeID, banFlags); } } else { - DependencyManager::get()->kickNodeBySessionID(nodeID, banByUsername, banByFingerprint, banByIP); + DependencyManager::get()->kickNodeBySessionID(nodeID, banFlags); } } diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index ad86189afa..c103508719 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -17,6 +17,7 @@ #include #include +#include /**jsdoc * The Users API provides features to regulate your interaction with other users. @@ -40,9 +41,14 @@ class UsersScriptingInterface : public QObject, public Dependency { Q_PROPERTY(bool canKick READ getCanKick) Q_PROPERTY(bool requestsDomainListData READ getRequestsDomainListData WRITE setRequestsDomainListData) + Q_PROPERTY(unsigned int NO_BAN READ ModerationFlags::BanFlags::NO_BAN CONSTANT) + Q_PROPERTY(unsigned int BAN_BY_USERNAME READ ModerationFlags::BanFlags::BAN_BY_USERNAME CONSTANT) + Q_PROPERTY(unsigned int BAN_BY_FINGERPRINT READ ModerationFlags::BanFlags::BAN_BY_FINGERPRINT CONSTANT) + Q_PROPERTY(unsigned int BAN_BY_IP READ ModerationFlags::BanFlags::BAN_BY_IP CONSTANT) + public: UsersScriptingInterface(); - void setKickConfirmationOperator(std::function kickConfirmationOperator) { + void setKickConfirmationOperator(std::function kickConfirmationOperator) { _kickConfirmationOperator = kickConfirmationOperator; } @@ -113,7 +119,7 @@ public slots: /**jsdoc * Kicks and bans a user. This removes them from the server and prevents them from returning. The ban is by user name if - * available and by machine fingerprint. + * available and by machine fingerprint. The ban functionality can be controlled with flags. *

This function only works if you're an administrator of the domain you're in.

* @function Users.kick * @param {Uuid} sessionID - The session ID of the user to kick and ban. @@ -121,7 +127,7 @@ public slots: * @param {boolean} [banByFingerprint=true] - Should ban the user's machine fingerprint. * @param {boolean} [banByIP=false] - Should ban the user's IP address. */ - void kick(const QUuid& nodeID, bool banByUsername = true, bool banByFingerprint = true, bool banByIP = false); + void kick(const QUuid& nodeID, int banFlags = 0); /**jsdoc * Mutes a user's microphone for everyone. The mute is not permanent: the user can unmute themselves. @@ -241,7 +247,7 @@ private: bool getRequestsDomainListData(); void setRequestsDomainListData(bool requests); - std::function _kickConfirmationOperator; + std::function _kickConfirmationOperator; ReadWriteLockable _kickResponseLock; bool _waitingForKickResponse { false }; diff --git a/libraries/shared/src/ModerationFlags.h b/libraries/shared/src/ModerationFlags.h new file mode 100644 index 0000000000..3930f65e28 --- /dev/null +++ b/libraries/shared/src/ModerationFlags.h @@ -0,0 +1,28 @@ +// +// ModerationFlags.h +// libraries/shared/src +// +// Created by Kalila L. on Mar 11 2021. +// Copyright 2021 Vircadia contributors. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef vircadia_ModerationFlags_h +#define vircadia_ModerationFlags_h + +class ModerationFlags { +public: + enum BanFlags + { + NO_BAN = 0, + BAN_BY_USERNAME = 1, + BAN_BY_FINGERPRINT = 2, + BAN_BY_IP = 4 + }; + + int test(int lol) { return lol; }; +}; + +#endif // vircadia_ModerationFlags_h \ No newline at end of file