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;
43 qDebug(log) << Q_FUNC_INFO;
45 qCritical(log) <<
"Server is exist";
46 return OnInitReturnValue::Fail;
51 CSecurityLevel::Levels securityLevel;
54 auto &net = m_pPara->m_Net;
55 if(!m_pPara->GetAnonymousLogin()) {
57 szUser = user.GetUser();
58 szPassword = user.GetPassword();
59 if(!szPassword.isEmpty())
60 securityLevel |= CSecurityLevel::Level::Authentication;
63 m_pServer =
new CFtpServer(
this, m_pPara->GetRoot(), net.GetPort(),
65 m_pPara->GetReadOnly());
67 qCritical(log) <<
"Failed to new CFtpServer";
68 return OnInitReturnValue::Fail;
71 m_pServer->SetFilter(
this);
73 if(m_pPara->GetListenAll()) {
74 bListen = m_pServer->Listening();
76 QString szMsg = tr(
"Ftp server listen on all address port %1. the lan ip is %2")
77 .arg(net.GetPort()).arg(m_pServer->lanIp());
81 QString szErr = tr(
"Failed to Ftp server is listening on %1")
83 qCritical(log) << szErr;
85 return OnInitReturnValue::Fail;
89 if(m_pPara->GetListen().isEmpty()) {
90 szErr = tr(
"Failed: Ftp server is not set to listen on any address");
91 qCritical(log) << szErr;
93 return OnInitReturnValue::Fail;
95 foreach (
auto a, m_pPara->GetListen()) {
97 bListen = m_pServer->Listening(addr);
99 szErr = tr(
"Failed to Ftp server is listening on %1:%2")
100 .arg(addr.toString()).arg(net.GetPort());
101 qCritical(log) << szErr;
103 return OnInitReturnValue::Fail;
107 szErr += addr.toString() +
":" + QString::number(net.GetPort());
110 QString szMsg = tr(
"Ftp server is listening on ") + szErr;
117 return OnInitReturnValue::NotUseOnProcess;
122 qDebug(log) << Q_FUNC_INFO;
130bool CBackendFtpServer::onFilter(QSslSocket *socket)
133 if(!socket)
return true;
134 QString szIP = socket->peerAddress().toString();
136 auto& white = m_pPara->m_WhiteFilter;
137 auto& black = m_pPara->m_BlackFilter;
139 bool bInWhite =
false;
140 if(!white.isEmpty()) {
141 white.OnProcess([&](
const QString& szKey)->
int {
142 QHostAddress addr(szIP);
143 auto sub = QHostAddress::parseSubnet(szKey);
144 if(addr.isInSubnet(sub.first, sub.second)) {
152 if(!bInWhite && !black.isEmpty()) {
153 black.OnProcess([&](
const QString& szKey)->int {
154 QHostAddress addr(szIP);
155 auto sub = QHostAddress::parseSubnet(szKey);
156 if(addr.isInSubnet(sub.first, sub.second)) {
157 qInfo(log) <<
"Filtered" << szIP <<
"in blacklist";
165 if(bFilte)
return true;
168 qDebug(log) <<
"Exceeded the allowed number of connections:" << m_pPara->
GetConnectCount();
173 check = connect(socket, SIGNAL(disconnected()),
174 this, SLOT(slotDisconnected()));
177 quint16 port = socket->peerPort();
178 m_Sockets.append(socket);
180 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
181 <<
"; new connect from:" << szIP +
":" + QString::number(port);
185void CBackendFtpServer::slotDisconnected()
187 QSslSocket *socket = qobject_cast<QSslSocket*>(sender());
189 m_Sockets.removeAll(socket);
190 QString ip = socket->peerAddress().toString();
191 quint16 port = socket->peerPort();
193 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
194 <<
"; remove connect:" << socket->peerAddress().toString();
197void CBackendFtpServer::slotDisconnect(
const QString &szIp,
const quint16 port)
199 foreach (
auto s, m_Sockets) {
200 if(s->peerAddress().toString() == szIp && s->peerPort() == port){
201 s->disconnectFromHost();
virtual int OnClean() override
Clean.
virtual OnInitReturnValue OnInit() override
Initialization.
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)
Triggering from a background thread displays information in the main thread without blocking the back...
void sigError(const int nError, const QString &szError=QString())
Triggered when an error is generated.
void sigSecurityLevel(CSecurityLevel::Levels level)
Triggered when the security level changes.
CParameterUser m_User
[Instance user]
int GetConnectCount() const
Connect count.