玉兔远程控制 0.1.0-bate6
载入中...
搜索中...
未找到
BackendFtpServer.cpp
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
9static Q_LOGGING_CATEGORY(log, "FtpServer.Backend")
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
20CBackendFtpServer::~CBackendFtpServer()
21{
22 qDebug(log) << Q_FUNC_INFO;
23}
24
25CBackend::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 CFtpServer(this, m_Para->GetRoot(), m_Para->GetPort(),
45 szUser, szPassword,
46 m_Para->GetReadOnly());
47 m_pServer->SetFilter(this);
48 bool bListen = false;
49 if(m_Para->GetListenAll())
50 bListen = m_pServer->Listening();
51 else {
52 foreach (auto a, m_Para->GetListen()) {
53 QHostAddress addr(a);
54 bListen = m_pServer->Listening(addr);
55 }
56 }
57 if(bListen) {
58 QString szMsg = tr("Ftp server listen in %1").arg(m_Para->GetPort());
59 qInfo(log) << szMsg;
60 emit sigInformation(szMsg);
61 } else {
62 QString szErr = tr("Ftp server is not listening in %1").arg(m_Para->GetPort());
63 emit sigError(-1, szErr);
64 return OnInitReturnValue::Fail;
65 }
66 return OnInitReturnValue::NotUseOnProcess;
67}
68
70{
71 qDebug(log) << Q_FUNC_INFO;
72
73 if(m_pServer)
74 delete m_pServer;
75
76 return 0;
77}
78
79bool CBackendFtpServer::onFilter(QSslSocket *socket)
80{
81 bool bFilte = false;
82 if(!socket) return true;
83 QString szIP = socket->peerAddress().toString();
84
85 QStringList white = m_Para->GetWhitelist();
86 QStringList black = m_Para->GetBlacklist();
87 bool bInWhite = false;
88 if(!white.isEmpty()) {
89 foreach(auto i, white) {
90 QHostAddress addr(szIP);
91 auto sub = QHostAddress::parseSubnet(i);
92 if(addr.isInSubnet(sub.first, sub.second)) {
93 bInWhite = true;
94 break;
95 }
96 }
97 }
98
99 if(!bInWhite && !black.isEmpty()) {
100 foreach(auto i, black) {
101 QHostAddress addr(szIP);
102 auto sub = QHostAddress::parseSubnet(i);
103 if(addr.isInSubnet(sub.first, sub.second)) {
104 qDebug(log) << "Filet" << szIP << "in blacklist";
105 return true;
106 }
107 }
108 }
109
110 if(bFilte) return true;
111
112 if(m_Para->GetConnectCount() >= 0 && m_Para->GetConnectCount() <= m_Sockets.size()) {
113 qDebug(log) << "Exceeded the allowed number of connections:" << m_Para->GetConnectCount();
114 return true;
115 }
116
117 bool check = false;
118 check = connect(socket, SIGNAL(disconnected()),
119 this, SLOT(slotDisconnected()));
120 Q_ASSERT(check);
121
122 quint16 port = socket->peerPort();
123 m_Sockets.append(socket);
124 m_nTotal++;
125 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
126 emit sigConnected(szIP, port);
127 qDebug(log) << "Current connect count:" << m_Sockets.size()
128 << "; new connect from:" << szIP + ":" + QString::number(port);
129 return false;
130}
131
132void CBackendFtpServer::slotDisconnected()
133{
134 QSslSocket *socket = qobject_cast<QSslSocket*>(sender());
135 if(!socket) return;
136 m_Sockets.removeAll(socket);
137 m_nDisconnect++;
138 emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
139 QString ip = socket->peerAddress().toString();
140 quint16 port = socket->peerPort();
141 emit sigDisconnected(ip, port);
142 qDebug(log) << "Current connect count:" << m_Sockets.size()
143 << "; remove connect:" << socket->peerAddress().toString();
144}
145
146void CBackendFtpServer::slotDisconnect(const QString& szIp, quint16 port)
147{
148 foreach (auto s, m_Sockets) {
149 if(s->peerAddress().toString() == szIp && s->peerPort() == port){
150 s->disconnectFromHost();
151 }
152 }
153}
virtual int OnClean() override
清理
virtual OnInitReturnValue OnInit() override
初始化
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
Definition Backend.h:42
void sigInformation(const QString &szInfo)
从后台线程中触发在主线程中显示信息,不阻塞后台线程
void sigError(const int nError, const QString &szError=QString())
当有错误产生时触发
操作接口。
Definition Operate.h:51