refactor: use enum for connections security level

based on barrier: 5c7d719
This commit is contained in:
sithlord48
2024-11-28 07:28:55 -05:00
committed by Nick Bolton
parent 638349b48a
commit e996471e37
12 changed files with 73 additions and 27 deletions

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -130,6 +131,8 @@ void Client::connect(size_t addressIndex)
return;
}
auto securityLevel = m_useSecureNetwork ? SecurityLevel::Encrypted : SecurityLevel::PlainText;
try {
if (m_args.m_hostMode) {
LOG((CLOG_NOTE "waiting for server connection on %i port", m_serverAddress.getPort()));
@ -152,8 +155,7 @@ void Client::connect(size_t addressIndex)
}
// create the socket
IDataSocket *socket =
m_socketFactory->create(m_useSecureNetwork, ARCH->getAddrFamily(m_serverAddress.getAddress()));
IDataSocket *socket = m_socketFactory->create(ARCH->getAddrFamily(m_serverAddress.getAddress()), securityLevel);
bindNetworkInterface(socket);
// filter socket messages, including a packetizing filter

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -611,7 +612,9 @@ void ServerApp::handleResume(const Event &, void *)
ClientListener *ServerApp::openClientListener(const NetworkAddress &address)
{
ClientListener *listen = new ClientListener(getAddress(address), getSocketFactory(), m_events, args().m_enableCrypto);
auto securityLevel = args().m_enableCrypto ? SecurityLevel::Encrypted : SecurityLevel::PlainText;
ClientListener *listen = new ClientListener(getAddress(address), getSocketFactory(), m_events, securityLevel);
m_events->adoptHandler(
m_events->forClientListener().connected(), listen,

View File

@ -18,6 +18,7 @@ add_library(net STATIC
NetworkAddress.h
SecureListenSocket.cpp
SecureListenSocket.h
SecurityLevel.h
SecureSocket.cpp
SecureSocket.h
SocketMultiplexer.cpp

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -9,6 +10,7 @@
#include "arch/IArchNetwork.h"
#include "common/IInterface.h"
#include "net/SecurityLevel.h"
class IDataSocket;
class IListenSocket;
@ -25,10 +27,14 @@ public:
//@{
//! Create data socket
virtual IDataSocket *create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const = 0;
virtual IDataSocket *create(
IArchNetwork::EAddressFamily family = IArchNetwork::kINET, SecurityLevel securityLevel = SecurityLevel::PlainText
) const = 0;
//! Create listen socket
virtual IListenSocket *createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const = 0;
virtual IListenSocket *createListen(
IArchNetwork::EAddressFamily family = IArchNetwork::kINET, SecurityLevel securityLevel = SecurityLevel::PlainText
) const = 0;
//@}
};

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2022 Symless Ltd.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
@ -20,9 +21,9 @@ InverseSocketFactory::InverseSocketFactory(IEventQueue *events, SocketMultiplexe
{
}
IDataSocket *InverseSocketFactory::create(bool secure, IArchNetwork::EAddressFamily family) const
IDataSocket *InverseSocketFactory::create(IArchNetwork::EAddressFamily family, SecurityLevel securityLevel) const
{
if (secure) {
if (securityLevel != SecurityLevel::PlainText) {
auto secureSocket = new SecureClientSocket(m_events, m_socketMultiplexer, family);
return secureSocket;
} else {
@ -30,11 +31,12 @@ IDataSocket *InverseSocketFactory::create(bool secure, IArchNetwork::EAddressFam
}
}
IListenSocket *InverseSocketFactory::createListen(bool secure, IArchNetwork::EAddressFamily family) const
IListenSocket *
InverseSocketFactory::createListen(IArchNetwork::EAddressFamily family, SecurityLevel securityLevel) const
{
IListenSocket *socket = nullptr;
if (secure) {
if (securityLevel != SecurityLevel::PlainText) {
socket = new SecureServerSocket(m_events, m_socketMultiplexer, family);
} else {
socket = new InverseServerSocket(m_events, m_socketMultiplexer, family);

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2022 Symless Ltd.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
@ -16,8 +17,12 @@ public:
InverseSocketFactory(IEventQueue *events, SocketMultiplexer *socketMultiplexer);
// ISocketFactory overrides
IDataSocket *create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const override;
IListenSocket *createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const override;
IDataSocket *create(
IArchNetwork::EAddressFamily family = IArchNetwork::kINET, SecurityLevel securityLevel = SecurityLevel::PlainText
) const override;
IListenSocket *createListen(
IArchNetwork::EAddressFamily family = IArchNetwork::kINET, SecurityLevel securityLevel = SecurityLevel::PlainText
) const override;
private:
IEventQueue *m_events = nullptr;

View File

@ -0,0 +1,17 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
#pragma once
/**
* \enum SecurityLevel
* \brief This enum is used to set how the client and server will communicate.
*/
enum class SecurityLevel
{
PlainText, /** Connections will not be encrypted */
Encrypted /** Connections will be encrypted */
};

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -29,9 +30,9 @@ TCPSocketFactory::~TCPSocketFactory()
// do nothing
}
IDataSocket *TCPSocketFactory::create(bool secure, IArchNetwork::EAddressFamily family) const
IDataSocket *TCPSocketFactory::create(IArchNetwork::EAddressFamily family, SecurityLevel securityLevel) const
{
if (secure) {
if (securityLevel != SecurityLevel::PlainText) {
SecureSocket *secureSocket = new SecureSocket(m_events, m_socketMultiplexer, family);
secureSocket->initSsl(false);
return secureSocket;
@ -40,10 +41,10 @@ IDataSocket *TCPSocketFactory::create(bool secure, IArchNetwork::EAddressFamily
}
}
IListenSocket *TCPSocketFactory::createListen(bool secure, IArchNetwork::EAddressFamily family) const
IListenSocket *TCPSocketFactory::createListen(IArchNetwork::EAddressFamily family, SecurityLevel securityLevel) const
{
IListenSocket *socket = NULL;
if (secure) {
if (securityLevel != SecurityLevel::PlainText) {
socket = new SecureListenSocket(m_events, m_socketMultiplexer, family);
} else {
socket = new TCPListenSocket(m_events, m_socketMultiplexer, family);

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -21,8 +22,12 @@ public:
virtual ~TCPSocketFactory();
// ISocketFactory overrides
virtual IDataSocket *create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const;
virtual IListenSocket *createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const;
virtual IDataSocket *create(
IArchNetwork::EAddressFamily family = IArchNetwork::kINET, SecurityLevel securityLevel = SecurityLevel::PlainText
) const;
virtual IListenSocket *createListen(
IArchNetwork::EAddressFamily family = IArchNetwork::kINET, SecurityLevel securityLevel = SecurityLevel::PlainText
) const;
private:
IEventQueue *m_events;

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2004 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -24,12 +25,12 @@
//
ClientListener::ClientListener(
const NetworkAddress &address, ISocketFactory *socketFactory, IEventQueue *events, bool enableCrypto
const NetworkAddress &address, ISocketFactory *socketFactory, IEventQueue *events, SecurityLevel securityLevel
)
: m_socketFactory(socketFactory),
m_server(NULL),
m_events(events),
m_useSecureNetwork(enableCrypto),
m_securityLevel(securityLevel),
m_address(address)
{
assert(m_socketFactory != NULL);
@ -73,7 +74,7 @@ ClientProxy *ClientListener::getNextClient()
void ClientListener::start()
{
m_listen = m_socketFactory->createListen(m_useSecureNetwork, ARCH->getAddrFamily(m_address.getAddress()));
m_listen = m_socketFactory->createListen(ARCH->getAddrFamily(m_address.getAddress()), m_securityLevel);
// setup event handler
m_events->adoptHandler(
@ -147,7 +148,7 @@ void ClientListener::handleClientConnecting(const Event &, void *)
// When using non SSL, server accepts clients immediately, while SSL
// has to call secure accept which may require retry
if (!m_useSecureNetwork) {
if (m_securityLevel == SecurityLevel::PlainText) {
m_events->addEvent(Event(m_events->forClientListener().accepted(), socket->getEventTarget()));
}
}

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2004 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -11,6 +12,7 @@
#include "base/EventTypes.h"
#include "common/stddeque.h"
#include "common/stdset.h"
#include "net/SecurityLevel.h"
#include "server/Config.h"
class ClientProxy;
@ -26,7 +28,7 @@ class ClientListener
{
public:
// The factories are adopted.
ClientListener(const NetworkAddress &, ISocketFactory *, IEventQueue *events, bool enableCrypto);
ClientListener(const NetworkAddress &, ISocketFactory *, IEventQueue *events, SecurityLevel securityLevel);
ClientListener(ClientListener const &) = delete;
ClientListener(ClientListener &&) = delete;
~ClientListener();
@ -88,7 +90,7 @@ private:
WaitingClients m_waitingClients;
Server *m_server;
IEventQueue *m_events;
bool m_useSecureNetwork;
SecurityLevel m_securityLevel;
ClientSockets m_clientSockets;
NetworkAddress m_address;
};

View File

@ -1,5 +1,6 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
@ -101,7 +102,7 @@ TEST_F(NetworkTests, sendToClient_mockData) {
SocketMultiplexer serverSocketMultiplexer;
TCPSocketFactory *serverSocketFactory =
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, false);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
NiceMock<MockScreen> serverScreen;
NiceMock<MockPrimaryClient> primaryClient;
NiceMock<MockConfig> serverConfig;
@ -165,7 +166,7 @@ TEST_F(NetworkTests, sendToClient_mockFile) {
SocketMultiplexer serverSocketMultiplexer;
TCPSocketFactory *serverSocketFactory =
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, false);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
NiceMock<MockScreen> serverScreen;
NiceMock<MockPrimaryClient> primaryClient;
NiceMock<MockConfig> serverConfig;
@ -228,7 +229,7 @@ TEST_F(NetworkTests, sendToServer_mockData) {
SocketMultiplexer serverSocketMultiplexer;
TCPSocketFactory *serverSocketFactory =
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, false);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
NiceMock<MockScreen> serverScreen;
NiceMock<MockPrimaryClient> primaryClient;
NiceMock<MockConfig> serverConfig;
@ -292,7 +293,7 @@ TEST_F(NetworkTests, sendToServer_mockFile) {
SocketMultiplexer serverSocketMultiplexer;
TCPSocketFactory *serverSocketFactory =
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, false);
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
NiceMock<MockScreen> serverScreen;
NiceMock<MockPrimaryClient> primaryClient;
NiceMock<MockConfig> serverConfig;