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

View file

@ -1,5 +1,6 @@
/* /*
* Deskflow -- mouse and keyboard sharing utility * Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 Symless Ltd. * SPDX-FileCopyrightText: (C) 2012 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception * 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 *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->adoptHandler(
m_events->forClientListener().connected(), listen, m_events->forClientListener().connected(), listen,

View file

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

View file

@ -1,5 +1,6 @@
/* /*
* Deskflow -- mouse and keyboard sharing utility * Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd. * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -9,6 +10,7 @@
#include "arch/IArchNetwork.h" #include "arch/IArchNetwork.h"
#include "common/IInterface.h" #include "common/IInterface.h"
#include "net/SecurityLevel.h"
class IDataSocket; class IDataSocket;
class IListenSocket; class IListenSocket;
@ -25,10 +27,14 @@ public:
//@{ //@{
//! Create data socket //! 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 //! 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 * Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2022 Symless Ltd. * SPDX-FileCopyrightText: (C) 2012 - 2022 Symless Ltd.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception * 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); auto secureSocket = new SecureClientSocket(m_events, m_socketMultiplexer, family);
return secureSocket; return secureSocket;
} else { } 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; IListenSocket *socket = nullptr;
if (secure) { if (securityLevel != SecurityLevel::PlainText) {
socket = new SecureServerSocket(m_events, m_socketMultiplexer, family); socket = new SecureServerSocket(m_events, m_socketMultiplexer, family);
} else { } else {
socket = new InverseServerSocket(m_events, m_socketMultiplexer, family); socket = new InverseServerSocket(m_events, m_socketMultiplexer, family);

View file

@ -1,5 +1,6 @@
/* /*
* Deskflow -- mouse and keyboard sharing utility * Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2022 Symless Ltd. * SPDX-FileCopyrightText: (C) 2012 - 2022 Symless Ltd.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/ */
@ -16,8 +17,12 @@ public:
InverseSocketFactory(IEventQueue *events, SocketMultiplexer *socketMultiplexer); InverseSocketFactory(IEventQueue *events, SocketMultiplexer *socketMultiplexer);
// ISocketFactory overrides // ISocketFactory overrides
IDataSocket *create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const override; IDataSocket *create(
IListenSocket *createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const override; 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: private:
IEventQueue *m_events = nullptr; 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 * Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd. * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
@ -29,9 +30,9 @@ TCPSocketFactory::~TCPSocketFactory()
// do nothing // 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 *secureSocket = new SecureSocket(m_events, m_socketMultiplexer, family);
secureSocket->initSsl(false); secureSocket->initSsl(false);
return secureSocket; 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; IListenSocket *socket = NULL;
if (secure) { if (securityLevel != SecurityLevel::PlainText) {
socket = new SecureListenSocket(m_events, m_socketMultiplexer, family); socket = new SecureListenSocket(m_events, m_socketMultiplexer, family);
} else { } else {
socket = new TCPListenSocket(m_events, m_socketMultiplexer, family); socket = new TCPListenSocket(m_events, m_socketMultiplexer, family);

View file

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

View file

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

View file

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

View file

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