Skip to content

Commit b2623ac

Browse files
committed
Plugin: Add ftp server
1 parent e85565f commit b2623ac

Some content is hidden

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

71 files changed

+1838
-253
lines changed

App/Client/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ int main(int argc, char *argv[])
107107
app.setOrganizationName(QObject::tr("Kang Lin Studio"));
108108

109109
#ifdef HAVE_UPDATE
110-
QSharedPointer<CFrmUpdater> pUpdate;
110+
CFrmUpdater* pUpdate;
111111
// Check update version
112112
if(qEnvironmentVariable("SNAP").isEmpty()
113113
&& qEnvironmentVariable("FLATPAK_ID").isEmpty()) {
114-
pUpdate = QSharedPointer<CFrmUpdater>(new CFrmUpdater());
114+
pUpdate = new CFrmUpdater();
115115
if(pUpdate) {
116116
QIcon icon = QIcon::fromTheme("app");
117117
if(!icon.isNull())

Authors.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,4 @@ See: https://github.com/KangLin/RabbitRemoteControl/graphs/contributors
4444
- [OPTIONAL] FFMPEG: [https://ffmpeg.org/](https://ffmpeg.org/) Multimedia capabilities required
4545
- [OPTIONAL] qtkeychain: [https://github.com/KangLin/qtkeychain](https://github.com/KangLin/qtkeychain)
4646
- [OPTIONAL] libcurl: [https://curl.se](https://curl.se)
47+
- [OPTIONAL] QFtpServer: https://github.com/KangLin/QFtpServer

Authors_zh_CN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@
4646
- [可选] FFMPEG: [https://ffmpeg.org/](https://ffmpeg.org/) 多媒体功能需要
4747
- [可选] qtkeychain: [https://github.com/KangLin/qtkeychain](https://github.com/KangLin/qtkeychain)
4848
- [可选] libcurl: [https://curl.se](https://curl.se)
49+
- [可选] QFtpServer: https://github.com/KangLin/QFtpServer

Plugins/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ if(WITH_QTERMWIDGET)
9696
endif()
9797
endif()
9898

99+
## Server
100+
option(BUILD_FTP_SERVER "Build ftp server" ON)
101+
if(BUILD_FTP_SERVER)
102+
add_subdirectory(FtpServer)
103+
endif()
104+
99105
message(STATUS "BUILD_RABBITVNC: ${BUILD_RABBITVNC}")
100106
message(STATUS "BUILD_TigerVNC: ${BUILD_TigerVNC}")
101107
message(STATUS "BUILD_LibVNCServer: ${BUILD_LibVNCServer}")
@@ -108,3 +114,5 @@ message(STATUS "BUILD_TERMINAL_TELNET: ${BUILD_TERMINAL_TELNET}")
108114
message(STATUS "BUILD_TERMINAL_SSH: ${BUILD_TERMINAL_SSH}")
109115
message(STATUS "BUILD_FILE_TRANSFER: ${BUILD_FILE_TRANSFER}")
110116
message(STATUS "BUILD_WEB_BROWSER: ${BUILD_WEB_BROWSER}; Qt${QT_VERSION_MAJOR}WebEngineWidgets: ${Qt${QT_VERSION_MAJOR}WebEngineWidgets_FOUND}")
117+
118+
message(STATUS "BUILD_FTP_SERVER: ${BUILD_FTP_SERVER}")
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2+
// Author: Kang Lin <kl222@126.com>
3+
4+
#include <QSslSocket>
5+
#include <QLoggingCategory>
6+
#include "BackendFtpServer.h"
7+
#include "OperateFtpServer.h"
8+
9+
static Q_LOGGING_CATEGORY(log, "FtpServer.Backend")
10+
CBackendFtpServer::CBackendFtpServer(COperate *pOperate) : CBackend(pOperate)
11+
, m_pServer(nullptr)
12+
{
13+
qDebug(log) << Q_FUNC_INFO;
14+
m_Para = ((COperateFtpServer*)pOperate)->GetParameter();
15+
}
16+
17+
CBackendFtpServer::~CBackendFtpServer()
18+
{
19+
qDebug(log) << Q_FUNC_INFO;
20+
}
21+
22+
CBackend::OnInitReturnValue CBackendFtpServer::OnInit()
23+
{
24+
qDebug(log) << Q_FUNC_INFO;
25+
if(m_pServer) {
26+
qCritical(log) << "Server is exist";
27+
return OnInitReturnValue::Fail;
28+
}
29+
QString szUser;
30+
QString szPassword;
31+
if(!m_Para->GetAnonymousLogin()) {
32+
szUser = m_Para->GetUser();
33+
szPassword = m_Para->GetPassword();
34+
}
35+
m_pServer = new FtpServer(this, m_Para->GetRoot(), m_Para->GetPort(),
36+
szUser, szPassword,
37+
m_Para->GetReadOnly(), false);
38+
m_pServer->SetFilter(this);
39+
if(m_pServer->isListening()) {
40+
qInfo(log) << "The ftp server listen in" << m_Para->GetPort();
41+
} else {
42+
QString szErr = tr("The ftp server is not listening in %1").arg(m_Para->GetPort());
43+
emit sigError(-1, szErr);
44+
}
45+
return OnInitReturnValue::NotUseOnProcess;
46+
}
47+
48+
int CBackendFtpServer::OnClean()
49+
{
50+
qDebug(log) << Q_FUNC_INFO;
51+
52+
if(m_pServer)
53+
delete m_pServer;
54+
55+
return 0;
56+
}
57+
58+
bool CBackendFtpServer::onFilter(QSslSocket *socket)
59+
{
60+
if(!socket) return true;
61+
if(m_Para->GetConnectCount() >= 0 && m_Para->GetConnectCount() <= m_Sockets.size()) {
62+
qDebug(log) << "Exceeded the allowed number of connections:" << m_Para->GetConnectCount();
63+
return true;
64+
}
65+
66+
QString ip = socket->peerAddress().toString();
67+
m_Sockets.append(socket);
68+
qDebug(log) << "Current connect count:" << m_Sockets.size()
69+
<< "; new connect from:" << ip;
70+
bool check = false;
71+
check = connect(socket, &QSslSocket::disconnected,
72+
this, &CBackendFtpServer::slotDisconnected);
73+
Q_ASSERT(check);
74+
return false;
75+
}
76+
77+
void CBackendFtpServer::slotDisconnected()
78+
{
79+
QSslSocket *socket = qobject_cast<QSslSocket*>(sender());
80+
if(!socket) return;
81+
m_Sockets.removeAll(socket);
82+
qDebug(log) << "Current connect count:" << m_Sockets.size()
83+
<< "; remove connect:" << socket->peerAddress().toString();
84+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2+
// Author: Kang Lin <kl222@126.com>
3+
4+
#pragma once
5+
6+
#include "Backend.h"
7+
#include "ftpserver.h"
8+
#include "ParameterFtpServer.h"
9+
10+
class CBackendFtpServer : public CBackend, CFtpServerFilter
11+
{
12+
Q_OBJECT
13+
14+
public:
15+
explicit CBackendFtpServer(COperate *pOperate = nullptr);
16+
~CBackendFtpServer() override;
17+
18+
// CFtpServerFilter interface
19+
virtual bool onFilter(QSslSocket *socket) override;
20+
21+
protected:
22+
virtual OnInitReturnValue OnInit() override;
23+
virtual int OnClean() override;
24+
private Q_SLOTS:
25+
void slotDisconnected();
26+
private:
27+
FtpServer* m_pServer;
28+
QSharedPointer<CParameterFtpServer> m_Para;
29+
QList<QSslSocket*> m_Sockets;
30+
};

Plugins/FtpServer/CMakeLists.txt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Author: Kang Lin <kl222@126.com>
2+
3+
project(FtpServer
4+
DESCRIPTION "Ftp service plugin"
5+
)
6+
7+
find_package(QFtpServerLib)
8+
if(NOT QFtpServerLib_FOUND)
9+
return()
10+
endif()
11+
12+
option(INSTALL_QFtpServer "Install QFtpServer libraries" OFF)
13+
if(INSTALL_QFtpServer)
14+
INSTALL_TARGETS(TARGETS QFtpServerLib)
15+
endif()
16+
17+
SET(FtpServer_PRIVATE_LIBS Plugin QFtpServerLib)
18+
SET(SOURCE_FILES
19+
PluginFtpServer.cpp
20+
OperateFtpServer.cpp
21+
BackendFtpServer.cpp
22+
DlgSettings.cpp
23+
ParameterFtpServer.cpp
24+
FrmMain.cpp
25+
)
26+
27+
SET(HEADER_FILES
28+
PluginFtpServer.h
29+
OperateFtpServer.h
30+
BackendFtpServer.h
31+
DlgSettings.h
32+
ParameterFtpServer.h
33+
FrmMain.h
34+
)
35+
36+
SET(RCC_FILES
37+
DlgSettings.ui
38+
FrmMain.ui)
39+
if(WITH_GUI)
40+
41+
endif()
42+
43+
set(FtpServer_QT_COMPONENTS Network)
44+
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${FtpServer_QT_COMPONENTS})
45+
if(Qt${QT_VERSION_MAJOR}_FOUND)
46+
FOREACH(_COMPONENT ${FtpServer_QT_COMPONENTS})
47+
list(APPEND FtpServer_PRIVATE_LIBS Qt${QT_VERSION_MAJOR}::${_COMPONENT})
48+
ENDFOREACH()
49+
endif()
50+
51+
ADD_PLUGIN_TARGET(NAME PluginService${PROJECT_NAME}
52+
ISPLUGIN
53+
SOURCE_FILES ${SOURCE_FILES} ${HEADER_FILES} ${RCC_FILES}
54+
PRIVATE_LIBS ${FtpServer_PRIVATE_LIBS}
55+
PRIVATE_INCLUDE_DIRS ${FtpServer_INCLUDE_DIR} ${WinPR_INCLUDE_DIR}
56+
PRIVATE_DEFINITIONS FtpServer_VERSION_MAJOR=${FtpServer_MAJOR}
57+
PRIVATE_OPTIONS ${FtpServer_OPTIONS}
58+
INSTALL_DIR ${PLUGIN_PATH}
59+
OUTPUT_DIR ${CMAKE_BINARY_DIR}/${PLUGIN_PATH}
60+
INSTALL_RPATH ${INSTALL_RPATH}
61+
VERSION ${RabbitRemoteControl_VERSION}
62+
)

Plugins/FtpServer/DlgSettings.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2+
// Author: Kang Lin <kl222@126.com>
3+
4+
#include <QFileDialog>
5+
#include "DlgSettings.h"
6+
#include "ui_DlgSettings.h"
7+
8+
CDlgSettings::CDlgSettings(QSharedPointer<CParameterFtpServer> para, QWidget *parent)
9+
: QDialog(parent)
10+
, ui(new Ui::CDlgSettings)
11+
, m_Para(para)
12+
{
13+
ui->setupUi(this);
14+
Q_ASSERT(m_Para);
15+
16+
ui->sbPort->setValue(m_Para->GetPort());
17+
ui->leUser->setText(m_Para->GetUser());
18+
ui->lePassword->setText(m_Para->GetPassword());
19+
ui->leRoot->setText(m_Para->GetRoot());
20+
ui->cbAnonmousLogin->setChecked(m_Para->GetAnonymousLogin());
21+
ui->cbReadOnly->setChecked(m_Para->GetReadOnly());
22+
ui->sbConnectCount->setValue(m_Para->GetConnectCount());
23+
ui->sbConnectCount->setToolTip(tr("-1: Enable all\n 0: Disable all\n > 0: connect count"));
24+
}
25+
26+
CDlgSettings::~CDlgSettings()
27+
{
28+
delete ui;
29+
}
30+
31+
void CDlgSettings::on_pbRoot_clicked()
32+
{
33+
QString szDir = QFileDialog::getExistingDirectory(this, QString(), ui->leRoot->text());
34+
if(szDir.isEmpty())
35+
return;
36+
ui->leRoot->setText(szDir);
37+
}
38+
39+
void CDlgSettings::accept()
40+
{
41+
m_Para->SetPort(ui->sbPort->value());
42+
m_Para->SetUser(ui->leUser->text());
43+
m_Para->SetPassword(ui->lePassword->text());
44+
m_Para->SetRoot(ui->leRoot->text());
45+
m_Para->SetAnonymousLogin(ui->cbAnonmousLogin->isChecked());
46+
m_Para->SetReadOnly(ui->cbReadOnly->isChecked());
47+
m_Para->SetConnectCount(ui->sbConnectCount->value());
48+
QDialog::accept();
49+
}
50+
51+
void CDlgSettings::on_cbAnonmousLogin_checkStateChanged(const Qt::CheckState &arg1)
52+
{
53+
bool bEnable = (Qt::Checked != arg1);
54+
ui->lePassword->setEnabled(bEnable);
55+
ui->leUser->setEnabled(bEnable);
56+
}
57+

Plugins/FtpServer/DlgSettings.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2+
// Author: Kang Lin <kl222@126.com>
3+
4+
#pragma once
5+
#include <QDialog>
6+
#include "ParameterFtpServer.h"
7+
8+
namespace Ui {
9+
class CDlgSettings;
10+
}
11+
12+
class CDlgSettings : public QDialog
13+
{
14+
Q_OBJECT
15+
16+
public:
17+
explicit CDlgSettings(QSharedPointer<CParameterFtpServer> para, QWidget *parent = nullptr);
18+
~CDlgSettings();
19+
20+
public slots:
21+
virtual void accept() override;
22+
private slots:
23+
void on_pbRoot_clicked();
24+
25+
void on_cbAnonmousLogin_checkStateChanged(const Qt::CheckState &arg1);
26+
27+
private:
28+
Ui::CDlgSettings *ui;
29+
QSharedPointer<CParameterFtpServer> m_Para;
30+
};

0 commit comments

Comments
 (0)