Skip to content

Commit 0cabf76

Browse files
committed
Server: add FreeRDP
1 parent c875013 commit 0cabf76

53 files changed

Lines changed: 2055 additions & 22 deletions

Some content is hidden

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

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
- Add Server
3838
- FTP server
3939
- SFTP server
40+
- FreeRDP server
4041
- Player
4142
- Add display subtitle
4243
- Add web browser

ChangeLog_zh_CN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
- 增加服务
3737
- FTP 服务
3838
- SFTP 服务
39+
- FreeRDP 服务
3940
- 播放器
4041
- 增加显示字幕
4142
- 增加网页浏览器

Plugins/FreeRDP/CMakeLists.txt

Lines changed: 23 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,24 @@ 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+
message("WinPR-tools Found: ${WinPR-tools_VERSION}")
36+
find_package(FreeRDP-Proxy)
37+
message("FreeRDP-Proxy FOUND: ${FreeRDP-Proxy_VERSION}")
38+
endif()
3639

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

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)
45+
if(NOT (FreeRDP-Server_FOUND AND FreeRDP-Shadow_FOUND))
46+
message("Don't find FreeRDP server: FreeRDP-Shadow, FreeRDP-Server\n"
47+
"Set:\n"
48+
" -DFreeRDP-Server_DIR=\n"
49+
" -DFreeRDP-Shadow_DIR="
50+
)
51+
return()
52+
endif()
53+
add_subdirectory(Server)

Plugins/FreeRDP/Client/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ ADD_PLUGIN_TARGET(NAME PluginClient${PROJECT_NAME}
7070
ISPLUGIN
7171
SOURCE_FILES ${FreeRDP_SOURCE_FILES} ${FreeRDP_HEADER_FILES} ${FreeRDP_UI_FILES}
7272
PRIVATE_LIBS ${FreeRDP_LIBS}
73-
PRIVATE_INCLUDE_DIRS ${FreeRDP_INCLUDE_DIR} ${WinPR_INCLUDE_DIR}
73+
PRIVATE_INCLUDE_DIRS ${FreeRDP-Client_INCLUDE_DIR} ${FreeRDP_INCLUDE_DIR} ${WinPR_INCLUDE_DIR}
7474
PRIVATE_DEFINITIONS ${FreeRDP_DEFINITIONS}
7575
PluginFreeDP_VERSION="${RabbitRemoteControl_VERSION}"
7676
PRIVATE_OPTIONS ${FreeRDP_OPTIONS}

Plugins/FreeRDP/Client/PluginFreeRDP.cpp

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

33
#include "PluginFreeRDP.h"
4-
#include "OperateFreeRDP.h"
54
#include "winpr/wlog.h"
5+
#include "freerdp/version.h"
66

77
#include <QLoggingCategory>
88

99
#ifdef HAVE_LIBSSH
1010
#include "ChannelSSHTunnel.h"
1111
#endif
1212

13-
#include "freerdp/version.h"
13+
#include "OperateFreeRDP.h"
1414

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