4#include <QLoggingCategory>
5#include "BackendFtpServer.h"
6#include "OperateFtpServer.h"
7#include "ParameterFtpServer.h"
10static Q_LOGGING_CATEGORY(log,
"Backend.FtpServer")
13 , m_pOperate(pOperate)
16 qDebug(log) << Q_FUNC_INFO;
17 m_pPara = m_pOperate->GetParameter();
20CBackendFtpServer::~CBackendFtpServer()
22 qDebug(log) << Q_FUNC_INFO;
48 qDebug(log) << Q_FUNC_INFO;
50 qCritical(log) <<
"Server is exist";
51 return OnInitReturnValue::Fail;
56 CSecurityLevel::Levels securityLevel;
59 auto &net = m_pPara->m_Net;
60 if(!m_pPara->GetAnonymousLogin()) {
61 auto &user = net.m_User;
62 szUser = user.GetUser();
63 szPassword = user.GetPassword();
64 if(!szPassword.isEmpty())
65 securityLevel |= CSecurityLevel::Level::Authentication;
68 m_pServer =
new CFtpServer(
this, m_pPara->GetRoot(), net.GetPort(),
70 m_pPara->GetReadOnly());
72 qCritical(log) <<
"Failed to new CFtpServer";
73 return OnInitReturnValue::Fail;
76 m_pServer->SetFilter(
this);
78 if(m_pPara->GetListenAll()) {
79 bListen = m_pServer->Listening();
81 QString szMsg = tr(
"Ftp server listen on all address port %1. the lan ip is %2")
82 .arg(net.GetPort()).arg(m_pServer->lanIp());
86 QString szErr = tr(
"Failed to Ftp server is listening on %1")
88 qCritical(log) << szErr;
90 return OnInitReturnValue::Fail;
94 if(m_pPara->GetListen().isEmpty()) {
95 szErr = tr(
"Failed: Ftp server is not set to listen on any address");
96 qCritical(log) << szErr;
98 return OnInitReturnValue::Fail;
100 foreach (
auto a, m_pPara->GetListen()) {
101 QHostAddress addr(a);
102 bListen = m_pServer->Listening(addr);
104 szErr = tr(
"Failed to Ftp server is listening on %1:%2")
105 .arg(addr.toString()).arg(net.GetPort());
106 qCritical(log) << szErr;
108 return OnInitReturnValue::Fail;
112 szErr += addr.toString() +
":" + QString::number(net.GetPort());
115 QString szMsg = tr(
"Ftp server is listening on ") + szErr;
122 return OnInitReturnValue::NotUseOnProcess;
127 qDebug(log) << Q_FUNC_INFO;
135bool CBackendFtpServer::onFilter(QSslSocket *socket)
138 if(!socket)
return true;
139 QString szIP = socket->peerAddress().toString();
141 auto& white = m_pPara->m_WhiteFilter;
142 auto& black = m_pPara->m_BlackFilter;
144 bool bInWhite =
false;
145 if(!white.isEmpty()) {
146 white.OnProcess([&](
const QString& szKey)->
int {
147 QHostAddress addr(szIP);
148 auto sub = QHostAddress::parseSubnet(szKey);
149 if(addr.isInSubnet(sub.first, sub.second)) {
157 if(!bInWhite && !black.isEmpty()) {
158 black.OnProcess([&](
const QString& szKey)->
int {
159 QHostAddress addr(szIP);
160 auto sub = QHostAddress::parseSubnet(szKey);
161 if(addr.isInSubnet(sub.first, sub.second)) {
162 qInfo(log) <<
"Filtered" << szIP <<
"in blacklist";
170 if(bFilte)
return true;
172 if(m_pPara->GetConnectCount() >= 0 && m_pPara->GetConnectCount() <= m_Sockets.size()) {
173 qDebug(log) <<
"Exceeded the allowed number of connections:" << m_pPara->GetConnectCount();
178 check = connect(socket, SIGNAL(disconnected()),
179 this, SLOT(slotDisconnected()));
182 quint16 port = socket->peerPort();
183 m_Sockets.append(socket);
185 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
186 <<
"; new connect from:" << szIP +
":" + QString::number(port);
190void CBackendFtpServer::slotDisconnected()
192 QSslSocket *socket = qobject_cast<QSslSocket*>(sender());
194 m_Sockets.removeAll(socket);
195 QString ip = socket->peerAddress().toString();
196 quint16 port = socket->peerPort();
198 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
199 <<
"; remove connect:" << socket->peerAddress().toString();
202void CBackendFtpServer::slotDisconnect(
const QString &szIp,
const quint16 port)
204 foreach (
auto s, m_Sockets) {
205 if(s->peerAddress().toString() == szIp && s->peerPort() == port){
206 s->disconnectFromHost();
virtual int OnClean() override
清理
virtual OnInitReturnValue OnInit() override
初始化
virtual int WakeUp() override
唤醒后台线程。
void sigConnected(const QString &szIp, const quint16 port)
emit when new client connected
void sigDisconnected(const QString &szIp, const quint16 port)
emit when the client disconnected
void sigInformation(const QString &szInfo)
从后台线程中触发在主线程中显示信息,不阻塞后台线程
void sigError(const int nError, const QString &szError=QString())
当有错误产生时触发
void sigSecurityLevel(CSecurityLevel::Levels level)
当安全级别改变时触发