5#include <QLoggingCategory>
6#include "BackendFtpServer.h"
7#include "OperateFtpServer.h"
9static Q_LOGGING_CATEGORY(log,
"FtpServer.Backend")
12 , m_pOperate(pOperate)
17 qDebug(log) << Q_FUNC_INFO;
18 m_Para = m_pOperate->GetParameter();
21CBackendFtpServer::~CBackendFtpServer()
23 qDebug(log) << Q_FUNC_INFO;
28 qDebug(log) << Q_FUNC_INFO;
30 qCritical(log) <<
"Server is exist";
31 return OnInitReturnValue::Fail;
37 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
39 CSecurityLevel::Levels securityLevel;
42 auto &net = m_Para->m_Net;
43 if(!m_Para->GetAnonymousLogin()) {
44 auto &user = net.m_User;
45 szUser = user.GetUser();
46 szPassword = user.GetPassword();
47 if(!szPassword.isEmpty())
48 securityLevel |= CSecurityLevel::Level::Authentication;
51 m_pServer =
new CFtpServer(
this, m_Para->GetRoot(), net.GetPort(),
53 m_Para->GetReadOnly());
55 qCritical(log) <<
"Failed to new CFtpServer";
56 return OnInitReturnValue::Fail;
59 m_pServer->SetFilter(
this);
61 if(m_Para->GetListenAll()) {
62 bListen = m_pServer->Listening();
64 QString szMsg = tr(
"Ftp server listen on all address port %1. the lan ip is %2")
65 .arg(net.GetPort()).arg(m_pServer->lanIp());
69 QString szErr = tr(
"Failed to Ftp server is listening on %1")
71 qCritical(log) << szErr;
73 return OnInitReturnValue::Fail;
77 if(m_Para->GetListen().isEmpty()) {
78 szErr = tr(
"Failed: Ftp server is not set to listen on any address");
79 qCritical(log) << szErr;
81 return OnInitReturnValue::Fail;
83 foreach (
auto a, m_Para->GetListen()) {
85 bListen = m_pServer->Listening(addr);
87 szErr = tr(
"Failed to Ftp server is listening on %1:%2")
88 .arg(addr.toString()).arg(net.GetPort());
89 qCritical(log) << szErr;
91 return OnInitReturnValue::Fail;
95 szErr += addr.toString() +
":" + QString::number(net.GetPort());
98 QString szMsg = tr(
"Ftp server is listening on ") + szErr;
105 return OnInitReturnValue::NotUseOnProcess;
110 qDebug(log) << Q_FUNC_INFO;
116bool CBackendFtpServer::onFilter(QSslSocket *socket)
119 if(!socket)
return true;
120 QString szIP = socket->peerAddress().toString();
122 QStringList white = m_Para->GetWhitelist();
123 QStringList black = m_Para->GetBlacklist();
124 bool bInWhite =
false;
125 if(!white.isEmpty()) {
126 foreach(
auto i, white) {
127 QHostAddress addr(szIP);
128 auto sub = QHostAddress::parseSubnet(i);
129 if(addr.isInSubnet(sub.first, sub.second)) {
136 if(!bInWhite && !black.isEmpty()) {
137 foreach(
auto i, black) {
138 QHostAddress addr(szIP);
139 auto sub = QHostAddress::parseSubnet(i);
140 if(addr.isInSubnet(sub.first, sub.second)) {
141 qInfo(log) <<
"Filet" << szIP <<
"in blacklist";
147 if(bFilte)
return true;
149 if(m_Para->GetConnectCount() >= 0 && m_Para->GetConnectCount() <= m_Sockets.size()) {
150 qDebug(log) <<
"Exceeded the allowed number of connections:" << m_Para->GetConnectCount();
155 check = connect(socket, SIGNAL(disconnected()),
156 this, SLOT(slotDisconnected()));
159 quint16 port = socket->peerPort();
160 m_Sockets.append(socket);
162 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
163 emit sigConnected(szIP, port);
164 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
165 <<
"; new connect from:" << szIP +
":" + QString::number(port);
169void CBackendFtpServer::slotDisconnected()
171 QSslSocket *socket = qobject_cast<QSslSocket*>(sender());
173 m_Sockets.removeAll(socket);
175 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
176 QString ip = socket->peerAddress().toString();
177 quint16 port = socket->peerPort();
178 emit sigDisconnected(ip, port);
179 qDebug(log) <<
"Current connect count:" << m_Sockets.size()
180 <<
"; remove connect:" << socket->peerAddress().toString();
183void CBackendFtpServer::slotDisconnect(
const QString& szIp, quint16 port)
185 foreach (
auto s, m_Sockets) {
186 if(s->peerAddress().toString() == szIp && s->peerPort() == port){
187 s->disconnectFromHost();
virtual int OnClean() override
清理
virtual OnInitReturnValue OnInit() override
初始化
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
void sigInformation(const QString &szInfo)
从后台线程中触发在主线程中显示信息,不阻塞后台线程
void sigError(const int nError, const QString &szError=QString())
当有错误产生时触发
void sigSecurityLevel(CSecurityLevel::Levels level)
当安全级别改变时触发