Skip to content

Commit 075ac5c

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

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

+1958
-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: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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+
, m_nTotal(0)
13+
, m_nDisconnect(0)
14+
{
15+
qDebug(log) << Q_FUNC_INFO;
16+
COperateFtpServer* po = qobject_cast<COperateFtpServer*>(pOperate);
17+
m_Para = po->GetParameter();
18+
}
19+
20+
CBackendFtpServer::~CBackendFtpServer()
21+
{
22+
qDebug(log) << Q_FUNC_INFO;
23+
}
24+
25+
CBackend::OnInitReturnValue CBackendFtpServer::OnInit()
26+
{
27+
qDebug(log) << Q_FUNC_INFO;
28+
if(m_pServer) {
29+
qCritical(log) << "Server is exist";
30+
return OnInitReturnValue::Fail;
31+
}
32+
33+
m_nTotal = 0;
34+
m_nDisconnect = 0;
35+
m_Sockets.clear();
36+
emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
37+
38+
QString szUser;
39+
QString szPassword;
40+
if(!m_Para->GetAnonymousLogin()) {
41+
szUser = m_Para->GetUser();
42+
szPassword = m_Para->GetPassword();
43+
}
44+
m_pServer = new FtpServer(this, m_Para->GetRoot(), m_Para->GetPort(),
45+
szUser, szPassword,
46+
m_Para->GetReadOnly(), false);
47+
m_pServer->SetFilter(this);
48+
if(m_pServer->isListening()) {
49+
qInfo(log) << "The ftp server listen in" << m_Para->GetPort();
50+
} else {
51+
QString szErr = tr("The ftp server is not listening in %1").arg(m_Para->GetPort());
52+
emit sigError(-1, szErr);
53+
}
54+
return OnInitReturnValue::NotUseOnProcess;
55+
}
56+
57+
int CBackendFtpServer::OnClean()
58+
{
59+
qDebug(log) << Q_FUNC_INFO;
60+
61+
if(m_pServer)
62+
delete m_pServer;
63+
64+
return 0;
65+
}
66+
67+
bool CBackendFtpServer::onFilter(QSslSocket *socket)
68+
{
69+
if(!socket) return true;
70+
if(m_Para->GetConnectCount() >= 0 && m_Para->GetConnectCount() <= m_Sockets.size()) {
71+
qDebug(log) << "Exceeded the allowed number of connections:" << m_Para->GetConnectCount();
72+
return true;
73+
}
74+
75+
bool check = false;
76+
check = connect(socket, SIGNAL(disconnected()),
77+
this, SLOT(slotDisconnected()));
78+
Q_ASSERT(check);
79+
QString ip = socket->peerAddress().toString();
80+
quint16 port = socket->peerPort();
81+
m_Sockets.append(socket);
82+
m_nTotal++;
83+
emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
84+
emit sigConnected(ip, port);
85+
qDebug(log) << "Current connect count:" << m_Sockets.size()
86+
<< "; new connect from:" << ip + ":" + QString::number(port);
87+
return false;
88+
}
89+
90+
void CBackendFtpServer::slotDisconnected()
91+
{
92+
QSslSocket *socket = qobject_cast<QSslSocket*>(sender());
93+
if(!socket) return;
94+
m_Sockets.removeAll(socket);
95+
m_nDisconnect++;
96+
emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
97+
QString ip = socket->peerAddress().toString();
98+
quint16 port = socket->peerPort();
99+
emit sigDisconnected(ip, port);
100+
qDebug(log) << "Current connect count:" << m_Sockets.size()
101+
<< "; remove connect:" << socket->peerAddress().toString();
102+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
Q_SIGNALS:
22+
void sigConnectCount(int nTotal, int nConnect, int nDisconnect);
23+
void sigConnected(const QString& szIp, const quint16 port);
24+
void sigDisconnected(const QString& szIp, const quint16 port);
25+
26+
protected:
27+
virtual OnInitReturnValue OnInit() override;
28+
virtual int OnClean() override;
29+
30+
private Q_SLOTS:
31+
void slotDisconnected();
32+
33+
private:
34+
FtpServer* m_pServer;
35+
QSharedPointer<CParameterFtpServer> m_Para;
36+
QList<QSslSocket*> m_Sockets;
37+
int m_nTotal;
38+
int m_nDisconnect;
39+
};

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

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)