Skip to content

Commit 9b2e529

Browse files
committed
Server: add FreeRDP
1 parent 3e49062 commit 9b2e529

49 files changed

Lines changed: 2004 additions & 19 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Plugins/FreeRDP/CMakeLists.txt

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
# Author: Kang Lin <kl222@126.com>
22

3-
set(FreeRDPVERSION 2.2.0)
3+
set(FreeRDPVERSION 2.10.0)
44
find_package(WinPR)
5-
message("WinPR_FOUND:${WinPR_VERSION}")
5+
message("WinPR FOUND:${WinPR_VERSION}")
66

77
find_package(FreeRDP)
8-
message("FreeRDP_FOUND:${FreeRDP_VERSION}")
8+
message("FreeRDP FOUND:${FreeRDP_VERSION}")
99
find_package(FreeRDP-Client)
10-
message("FreeRDP-Client_FOUND:${FreeRDP-Client_VERSION}")
10+
message("FreeRDP-Client FOUND:${FreeRDP-Client_VERSION}")
1111
if(NOT (FreeRDP_FOUND AND WinPR_FOUND AND FreeRDP-Client_FOUND))
1212
message(WARNING "Don't find FreeRDP ${FreeRDPVERSION}. Please set BUILD_FREERDP=OFF "
1313
"or install FreeRDP ${FreeRDPVERSION} from https://github.com/FreeRDP/FreeRDP\n"
@@ -30,20 +30,23 @@ if(BUILD_CLIENT)
3030
add_subdirectory(Client)
3131
endif()
3232

33-
if(BUILD_SERVICE)
34-
find_package(FreeRDP-Shadow ${FreeRDP_VERSION})
35-
message("FreeRDP-Shadow_FOUND:${FreeRDP-Shadow_VERSION}")
33+
if(FreeRDP_VERSION GREATER_EQUAL "3.0.0")
34+
find_package(WinPR-tools)
35+
find_package(FreeRDP-Proxy)
36+
message("FreeRDP-Proxy FOUND: ${FreeRDP-Proxy_VERSION}")
37+
endif()
3638

37-
find_package(FreeRDP-Server ${FreeRDP_VERSION})
38-
message("FreeRDP-Server_FOUND:${FreeRDP-Server_VERSION}")
39+
find_package(FreeRDP-Shadow)
40+
message("FreeRDP-Shadow FOUND:${FreeRDP-Shadow_VERSION}")
41+
find_package(FreeRDP-Server)
42+
message("FreeRDP-Server FOUND:${FreeRDP-Server_VERSION}")
3943

40-
if(NOT (FreeRDP-Shadow_FOUND AND FreeRDP-Server_FOUND))
41-
message("Don't find FreeRDP server\n"
42-
"Set:\n"
43-
" -DFreeRDP-Server_DIR=\n"
44-
" -DFreeRDP-Shadow_DIR="
45-
)
46-
return()
47-
endif()
48-
add_subdirectory(Service)
49-
endif(BUILD_SERVICE)
44+
if(NOT (FreeRDP-Server_FOUND AND FreeRDP-Shadow_FOUND))
45+
message("Don't find FreeRDP server: WinPR-tools, FreeRDP-Shadow, FreeRDP-Server, FreeRDP-Proxy\n"
46+
"Set:\n"
47+
" -DFreeRDP-Server_DIR=\n"
48+
" -DFreeRDP-Shadow_DIR="
49+
)
50+
return()
51+
endif()
52+
add_subdirectory(Server)
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
// Author: Kang Lin <kl222@126.com>
2+
3+
#include <QLoggingCategory>
4+
#include "ParameterFreeRDPServer.h"
5+
#include "BackendFreeRDPServer.h"
6+
#include "Backend.h"
7+
8+
static Q_LOGGING_CATEGORY(log, "FreeRDPServer.Backend")
9+
CBackendFreeRDPServer::CBackendFreeRDPServer(
10+
COperateFreeRDPServer* pOperate, bool bStopSignal)
11+
: CBackendServer(pOperate, bStopSignal)
12+
, m_pPara(pOperate->GetParameter())
13+
, m_pSettings(nullptr)
14+
, m_pServer(nullptr)
15+
, m_bServerInit(false)
16+
{
17+
qDebug(log) << Q_FUNC_INFO;
18+
}
19+
20+
CBackendFreeRDPServer::~CBackendFreeRDPServer()
21+
{
22+
qDebug(log) << Q_FUNC_INFO;
23+
}
24+
25+
/*!
26+
* \~chinese 初始化
27+
* \return
28+
* \li OnInitReturnValue::Fail: 错误
29+
* \li OnInitReturnValue::Success/OnInitReturnValue::UseOnProcess: 使用 OnProcess() (非 Qt 事件循环)
30+
* \li OnInitReturnValue::NotUseOnProcess: 不使用 OnProcess() (qt 事件循环)
31+
*
32+
* \~english Initialization
33+
* \return CBackend::OnInitReturnValue
34+
* \li OnInitReturnValue::Fail: error
35+
* \li OnInitReturnValue::Success/OnInitReturnValue::UseOnProcess: Use OnProcess() (non-Qt event loop)
36+
* \li OnInitReturnValue::NotUseOnProcess: Don't use OnProcess() (qt event loop)
37+
*
38+
* \~
39+
* \see Start()
40+
*/
41+
CBackend::OnInitReturnValue CBackendFreeRDPServer::OnInit()
42+
{
43+
shadow_subsystem_set_entry_builtin(NULL);
44+
45+
m_pServer = shadow_server_new();
46+
if (!m_pServer)
47+
{
48+
qCritical(log) << "Server new failed";
49+
return OnInitReturnValue::Fail;
50+
}
51+
52+
SetParameters();
53+
54+
int nRet = shadow_server_init(m_pServer);
55+
if(nRet < 0)
56+
{
57+
qCritical(log) << "Server initialization failed:" << nRet;
58+
return OnInitReturnValue::Fail;
59+
}
60+
m_bServerInit = true;
61+
62+
if ((nRet = shadow_server_start(m_pServer)) < 0)
63+
{
64+
qCritical(log) << "Failed to start server:" << nRet;
65+
return OnInitReturnValue::Fail;
66+
}
67+
68+
// Don't use OnProcess (qt event loop)
69+
// Because freerdp has new thread process loop
70+
return OnInitReturnValue::NotUseOnProcess;
71+
}
72+
73+
int CBackendFreeRDPServer::OnClean()
74+
{
75+
int nRet = 0;
76+
if(m_pServer)
77+
{
78+
if(m_bServerInit)
79+
shadow_server_uninit(m_pServer);
80+
shadow_server_free(m_pServer);
81+
m_pServer = nullptr;
82+
}
83+
84+
return nRet;
85+
}
86+
87+
/*!
88+
* \~chinese 具体操作处理
89+
* \return
90+
* \li >= 0: 继续。再次调用间隔时间,单位毫秒
91+
* \li = -1: 停止
92+
* \li < -1: 错误代码
93+
*
94+
* \~english Specific operation processing of plug-in
95+
* \return
96+
* \li >= 0: continue, Interval call time (msec)
97+
* \li = -1: stop
98+
* \li < -1: error code
99+
* \~
100+
* \see Start() slotTimeOut()
101+
*/
102+
int CBackendFreeRDPServer::OnProcess()
103+
{
104+
// TODO: add event dispatch (non-Qt event loop)
105+
106+
// TODO: When an error occurs. emit sigStop();
107+
108+
return 0;
109+
}
110+
111+
int CBackendFreeRDPServer::SetParameters()
112+
{
113+
m_pSettings = m_pServer->settings;
114+
m_pSettings->NlaSecurity = m_pPara->getNlaSecurity();
115+
m_pSettings->TlsSecurity = m_pPara->getTlsSecurity();
116+
m_pSettings->RdpSecurity = m_pPara->getRdpSecurity();
117+
m_pSettings->UseRdpSecurityLayer = m_pSettings->RdpSecurity;
118+
m_pSettings->ExtSecurity = m_pPara->getNlaExtSecurity();
119+
if(!m_pPara->getSamFile().isEmpty())
120+
freerdp_settings_set_string(m_pSettings, FreeRDP_NtlmSamFile,
121+
m_pPara->getSamFile().toStdString().c_str());
122+
123+
m_pServer->authentication = m_pPara->getAuthentication();
124+
125+
m_pServer->port = m_pPara->m_Net.GetPort();
126+
m_pServer->mayView = m_pPara->getMayView();
127+
m_pServer->mayInteract = m_pPara->getMayInteract();
128+
129+
return 0;
130+
}
131+
132+
void CBackendFreeRDPServer::slotDisconnect(const QString &szIp, const quint16 port)
133+
{
134+
// TODO: Disconnect
135+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Author: Kang Lin <kl222@126.com>
2+
3+
#pragma once
4+
5+
#include <freerdp/server/shadow.h>
6+
7+
#include "OperateFreeRDPServer.h"
8+
#include "BackendServer.h"
9+
10+
class CBackendFreeRDPServer : public CBackendServer
11+
{
12+
Q_OBJECT
13+
public:
14+
explicit CBackendFreeRDPServer(
15+
COperateFreeRDPServer *pOperate = nullptr, bool bStopSignal = true);
16+
virtual ~CBackendFreeRDPServer();
17+
18+
public Q_SLOTS:
19+
void slotDisconnect(const QString& szIp, const quint16 port) override;
20+
21+
// CBackend interface
22+
protected:
23+
virtual OnInitReturnValue OnInit() override;
24+
virtual int OnClean() override;
25+
virtual int OnProcess() override;
26+
27+
private:
28+
CParameterFreeRDPServer* m_pPara;
29+
rdpSettings* m_pSettings;
30+
rdpShadowServer* m_pServer;
31+
bool m_bServerInit;
32+
33+
int SetParameters();
34+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Author: Kang Lin <kl222@126.com>
2+
3+
project(FreeRDPServer)
4+
5+
set(FreeRDPServer_LIBS Plugin freerdp-server freerdp-shadow
6+
freerdp-shadow-subsystem freerdp-client freerdp winpr)
7+
8+
list(APPEND FreeRDPServer_QT_COMPONENTS Core Gui Widgets)
9+
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS ${FreeRDPServer_QT_COMPONENTS})
10+
if(Qt${QT_VERSION_MAJOR}_FOUND)
11+
FOREACH(_COMPONENT ${FreeRDPServer_QT_COMPONENTS})
12+
list(APPEND FreeRDPServer_LIBS Qt${QT_VERSION_MAJOR}::${_COMPONENT})
13+
ENDFOREACH()
14+
else()
15+
message(FATAL_ERROR "Qt${QT_VERSION_MAJOR} don't found")
16+
endif()
17+
18+
SET(FreeRDPServer_SOURCE_FILES
19+
PluginFreeRDPServer.cpp
20+
OperateFreeRDPServer.cpp
21+
BackendFreeRDPServer.cpp
22+
ParameterFreeRDPServer.cpp
23+
DlgSettingsFreeRDPServer.cpp
24+
)
25+
26+
SET(FreeRDPServer_HEADER_FILES
27+
PluginFreeRDPServer.h
28+
OperateFreeRDPServer.h
29+
BackendFreeRDPServer.h
30+
ParameterFreeRDPServer.h
31+
DlgSettingsFreeRDPServer.h
32+
)
33+
34+
SET(FreeRDPServer_UI_FILES
35+
DlgSettingsFreeRDPServer.ui
36+
)
37+
38+
ADD_PLUGIN_TARGET(NAME PluginService${PROJECT_NAME}
39+
ISPLUGIN
40+
SOURCE_FILES ${FreeRDPServer_SOURCE_FILES} ${FreeRDPServer_HEADER_FILES} ${FreeRDPServer_UI_FILES}
41+
PRIVATE_LIBS ${FreeRDPServer_LIBS}
42+
OUTPUT_DIR ${CMAKE_BINARY_DIR}/${PLUGIN_PATH}
43+
INSTALL_RPATH ${INSTALL_RPATH}
44+
VERSION ${RabbitRemoteControl_VERSION}
45+
PRIVATE_DEFINITIONS FreeRDPServer_VERSION="${RabbitRemoteControl_VERSION}"
46+
)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Author: Kang Lin <kl222@126.com>
2+
3+
#include "ParameterFreeRDPServer.h"
4+
#include "DlgSettingsFreeRDPServer.h"
5+
#include "ui_DlgSettingsFreeRDPServer.h"
6+
7+
CDlgSettingsFreeRDPServer::CDlgSettingsFreeRDPServer(
8+
CParameterFreeRDPServer *pPara, QWidget *parent)
9+
: QDialog(parent)
10+
, ui(new Ui::CDlgSettingsFreeRDPServer)
11+
, m_pPara(pPara)
12+
, m_pServerUI(nullptr)
13+
{
14+
ui->setupUi(this);
15+
m_pServerUI = new CParameterServerUI();
16+
if(m_pServerUI) {
17+
m_pServerUI->SetParameter(pPara);
18+
ui->tabWidget->insertTab(0, m_pServerUI, m_pServerUI->windowIcon(), m_pServerUI->windowTitle());
19+
ui->tabWidget->setCurrentIndex(0);
20+
}
21+
}
22+
23+
CDlgSettingsFreeRDPServer::~CDlgSettingsFreeRDPServer()
24+
{
25+
delete ui;
26+
}
27+
28+
void CDlgSettingsFreeRDPServer::accept()
29+
{
30+
bool nRet = 0;
31+
nRet = m_pServerUI->CheckValidity(true);
32+
if(!nRet) return;
33+
if(m_pServerUI)
34+
m_pServerUI->Accept();
35+
// TODO: Accept parameters
36+
37+
QDialog::accept();
38+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Author: Kang Lin <kl222@126.com>
2+
3+
#pragma once
4+
5+
#include <QDialog>
6+
#include "ParameterServerUI.h"
7+
8+
namespace Ui {
9+
class CDlgSettingsFreeRDPServer;
10+
}
11+
12+
class CParameterFreeRDPServer;
13+
class CDlgSettingsFreeRDPServer : public QDialog
14+
{
15+
Q_OBJECT
16+
17+
public:
18+
explicit CDlgSettingsFreeRDPServer(CParameterFreeRDPServer* pPara,
19+
QWidget *parent = nullptr);
20+
virtual ~CDlgSettingsFreeRDPServer();
21+
22+
// QDialog interface
23+
public Q_SLOTS:
24+
virtual void accept() override;
25+
26+
private:
27+
Ui::CDlgSettingsFreeRDPServer *ui;
28+
CParameterFreeRDPServer* m_pPara;
29+
CParameterServerUI* m_pServerUI;
30+
};

0 commit comments

Comments
 (0)