refactor: use enum for connections security level
based on barrier: 5c7d719
This commit is contained in:
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -18,6 +18,7 @@ add_library(net STATIC
|
||||
NetworkAddress.h
|
||||
SecureListenSocket.cpp
|
||||
SecureListenSocket.h
|
||||
SecurityLevel.h
|
||||
SecureSocket.cpp
|
||||
SecureSocket.h
|
||||
SocketMultiplexer.cpp
|
||||
|
||||
@ -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;
|
||||
|
||||
//@}
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
17
src/lib/net/SecurityLevel.h
Normal file
17
src/lib/net/SecurityLevel.h
Normal 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 */
|
||||
};
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user