deskflow/src/lib/net/InverseSockets/SecureServerSocket.cpp
Serhii Hadzhilov c06a20d093
Initiate TLS connection from server (#7225)
* Add SecureClientSocket

* Add SecureServerSocket

* SecureServerSocket code cleanup

* Refactoring for SecureClientSocket

* Change base class for SecureClientSocket to InverseClientSocket

* Change base class for SecureServerSocket to InverseServerSocket

* Small refactoring

* Fix Linux compilation

* Fix code smells

* Refactoring

* Update ChangeLog

* Fix code smells

Co-authored-by: Serhii Hadzhilov <serhii@symless.com>
2022-09-29 11:35:27 +03:00

86 lines
2.4 KiB
C++

/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2022 Symless Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "SecureServerSocket.h"
#include <net/SecureSocket.h>
#include <net/TSocketMultiplexerMethodJob.h>
#include <arch/XArch.h>
#include <synergy/ArgParser.h>
#include <synergy/ArgsBase.h>
//
// SecureServerSocket
//
SecureServerSocket::SecureServerSocket(
IEventQueue* events,
SocketMultiplexer* socketMultiplexer,
IArchNetwork::EAddressFamily family) :
InverseServerSocket(events, socketMultiplexer, family)
{
}
IDataSocket*
SecureServerSocket::accept()
{
SecureSocket* socket = nullptr;
try {
socket = new SecureSocket(m_events, m_socketMultiplexer, m_socket.getRawSocket());
socket->initSsl(true);
setListeningJob();
auto certificateFilename = getCertifcateFileName();
if (socket->loadCertificates(certificateFilename)) {
socket->secureAccept();
}
else {
delete socket;
socket = nullptr;
}
}
catch (const XArchNetwork&) {
if (socket) {
delete socket;
socket = nullptr;
setListeningJob();
}
}
catch (const std::exception&) {
if (socket) {
delete socket;
setListeningJob();
}
throw;
}
return dynamic_cast<IDataSocket*>(socket);
}
std::string
SecureServerSocket::getCertifcateFileName() const
{
//if the tls cert option is set use that for the certificate file
auto certificateFilename = ArgParser::argsBase().m_tlsCertFile;
if (certificateFilename.empty()) {
//default location of the TLS cert file in users dir
certificateFilename = synergy::string::sprintf("%s/SSL/Synergy.pem", ARCH->getProfileDirectory().c_str());
}
return certificateFilename;
}