Skip to content

Commit 9189f0b

Browse files
committed
Plugins::FtpServer: add white and black list
1 parent e603079 commit 9189f0b

7 files changed

Lines changed: 318 additions & 148 deletions

File tree

Plugins/FtpServer/BackendFtpServer.cpp

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,37 @@ int CBackendFtpServer::OnClean()
7575

7676
bool CBackendFtpServer::onFilter(QSslSocket *socket)
7777
{
78+
bool bFilte = false;
7879
if(!socket) return true;
80+
QString szIP = socket->peerAddress().toString();
81+
82+
QStringList white = m_Para->GetWhitelist();
83+
QStringList black = m_Para->GetBlacklist();
84+
bool bInWhite = false;
85+
if(!white.isEmpty()) {
86+
foreach(auto i, white) {
87+
QHostAddress addr(szIP);
88+
auto sub = QHostAddress::parseSubnet(i);
89+
if(addr.isInSubnet(sub.first, sub.second)) {
90+
bInWhite = true;
91+
break;
92+
}
93+
}
94+
}
95+
96+
if(!bInWhite && !black.isEmpty()) {
97+
foreach(auto i, black) {
98+
QHostAddress addr(szIP);
99+
auto sub = QHostAddress::parseSubnet(i);
100+
if(addr.isInSubnet(sub.first, sub.second)) {
101+
qDebug(log) << "Filet" << szIP << "in blacklist";
102+
return true;
103+
}
104+
}
105+
}
106+
107+
if(bFilte) return true;
108+
79109
if(m_Para->GetConnectCount() >= 0 && m_Para->GetConnectCount() <= m_Sockets.size()) {
80110
qDebug(log) << "Exceeded the allowed number of connections:" << m_Para->GetConnectCount();
81111
return true;
@@ -85,14 +115,14 @@ bool CBackendFtpServer::onFilter(QSslSocket *socket)
85115
check = connect(socket, SIGNAL(disconnected()),
86116
this, SLOT(slotDisconnected()));
87117
Q_ASSERT(check);
88-
QString ip = socket->peerAddress().toString();
118+
89119
quint16 port = socket->peerPort();
90120
m_Sockets.append(socket);
91121
m_nTotal++;
92122
emit sigConnectCount(m_nTotal, m_Sockets.size(), m_nDisconnect);
93-
emit sigConnected(ip, port);
123+
emit sigConnected(szIP, port);
94124
qDebug(log) << "Current connect count:" << m_Sockets.size()
95-
<< "; new connect from:" << ip + ":" + QString::number(port);
125+
<< "; new connect from:" << szIP + ":" + QString::number(port);
96126
return false;
97127
}
98128

Plugins/FtpServer/DlgSettings.cpp

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
#include <QLoggingCategory>
66
#include <QStandardItem>
77
#include <QNetworkInterface>
8-
8+
#include <QMenu>
9+
#include <QInputDialog>
910
#include "DlgSettings.h"
1011
#include "ui_DlgSettings.h"
1112

@@ -15,6 +16,7 @@ CDlgSettings::CDlgSettings(QSharedPointer<CParameterFtpServer> para, QWidget *pa
1516
, ui(new Ui::CDlgSettings)
1617
, m_Para(para)
1718
{
19+
bool check = false;
1820
ui->setupUi(this);
1921
Q_ASSERT(m_Para);
2022

@@ -26,6 +28,7 @@ CDlgSettings::CDlgSettings(QSharedPointer<CParameterFtpServer> para, QWidget *pa
2628
ui->cbReadOnly->setChecked(m_Para->GetReadOnly());
2729
ui->sbConnectCount->setValue(m_Para->GetConnectCount());
2830
ui->sbConnectCount->setToolTip(tr("-1: Enable all\n 0: Disable all\n>0: Connect count"));
31+
2932
ui->cbListenAll->setChecked(m_Para->GetListenAll());
3033
ui->lvListen->setModel(&m_ModelNetWorkInterface);
3134
foreach(auto iface, QNetworkInterface::allInterfaces()) {
@@ -53,6 +56,21 @@ CDlgSettings::CDlgSettings(QSharedPointer<CParameterFtpServer> para, QWidget *pa
5356
}
5457
}
5558
}
59+
60+
ui->lvBlacklist->setModel(&m_ModelBlack);
61+
check = connect(ui->lvBlacklist, SIGNAL(customContextMenuRequested(const QPoint&)),
62+
this, SLOT(slotBlackListContextMenuRequested(const QPoint&)));
63+
Q_ASSERT(check);
64+
foreach (auto ip, m_Para->GetBlacklist()) {
65+
m_ModelBlack.appendRow(new QStandardItem(ip));
66+
}
67+
ui->lvWhtelist->setModel(&m_ModelWhite);
68+
check = connect(ui->lvWhtelist, SIGNAL(customContextMenuRequested(const QPoint&)),
69+
this, SLOT(slotWhiteListContextMenuRequested(const QPoint&)));
70+
foreach (auto ip, m_Para->GetWhitelist()) {
71+
m_ModelWhite.appendRow(new QStandardItem(ip));
72+
}
73+
Q_ASSERT(check);
5674
}
5775

5876
CDlgSettings::~CDlgSettings()
@@ -77,6 +95,7 @@ void CDlgSettings::accept()
7795
m_Para->SetAnonymousLogin(ui->cbAnonmousLogin->isChecked());
7896
m_Para->SetReadOnly(ui->cbReadOnly->isChecked());
7997
m_Para->SetConnectCount(ui->sbConnectCount->value());
98+
8099
m_Para->SetListenAll(ui->cbListenAll->isChecked());
81100
QStringList lstInterface;
82101
for (int row = 0; row < m_ModelNetWorkInterface.rowCount(); row++) {
@@ -86,6 +105,18 @@ void CDlgSettings::accept()
86105
}
87106
}
88107
m_Para->SetListen(lstInterface);
108+
109+
QStringList lstBlack;
110+
for (int i = 0; i < m_ModelBlack.rowCount(); ++i) {
111+
lstBlack << m_ModelBlack.item(i)->text();
112+
}
113+
m_Para->SetBlacklist(lstBlack);
114+
QStringList lstWhite;
115+
for (int i = 0; i < m_ModelWhite.rowCount(); ++i) {
116+
lstWhite << m_ModelWhite.item(i)->text();
117+
}
118+
m_Para->SetWhitelist(lstWhite);
119+
89120
QDialog::accept();
90121
}
91122

@@ -101,3 +132,46 @@ void CDlgSettings::on_cbListenAll_checkStateChanged(const Qt::CheckState &arg1)
101132
ui->lvListen->setEnabled(Qt::Checked != arg1);
102133
}
103134

135+
void CDlgSettings::slotWhiteListContextMenuRequested(const QPoint& pos)
136+
{
137+
QMenu m;
138+
QItemSelectionModel* pSelect = ui->lvWhtelist->selectionModel();
139+
QModelIndexList lstIndex = pSelect->selectedRows();
140+
m.addAction(tr("Add"), [this](){
141+
QString szIp = QInputDialog::getText(this, tr("Add whilte list"), tr("Add ip address:"));
142+
QStandardItem* item = new QStandardItem(szIp);
143+
m_ModelWhite.appendRow(item);
144+
});
145+
if(!lstIndex.isEmpty()) {
146+
m.addAction(tr("Remove"), [this, lstIndex]() {
147+
foreach(auto idx, lstIndex) {
148+
m_ModelWhite.removeRow(idx.row());
149+
}
150+
});
151+
}
152+
153+
QPoint p = ui->lvWhtelist->mapToGlobal(pos);
154+
m.exec(p);
155+
}
156+
157+
void CDlgSettings::slotBlackListContextMenuRequested(const QPoint& pos)
158+
{
159+
QMenu m;
160+
QItemSelectionModel* pSelect = ui->lvBlacklist->selectionModel();
161+
QModelIndexList lstIndex = pSelect->selectedRows();
162+
m.addAction(tr("Add"), [this](){
163+
QString szIp = QInputDialog::getText(this, tr("Add black list"), tr("Add ip address:"));
164+
QStandardItem* item = new QStandardItem(szIp);
165+
m_ModelBlack.appendRow(item);
166+
});
167+
if(!lstIndex.isEmpty()) {
168+
m.addAction(tr("Remove"), [this, lstIndex]() {
169+
foreach(auto idx, lstIndex) {
170+
m_ModelBlack.removeRow(idx.row());
171+
}
172+
});
173+
}
174+
175+
QPoint p = ui->lvBlacklist->mapToGlobal(pos);
176+
m.exec(p);
177+
}

Plugins/FtpServer/DlgSettings.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ class CDlgSettings : public QDialog
2121

2222
public slots:
2323
virtual void accept() override;
24-
private slots:
24+
private Q_SLOTS:
2525
void on_pbRoot_clicked();
26-
2726
void on_cbAnonmousLogin_checkStateChanged(const Qt::CheckState &arg1);
28-
2927
void on_cbListenAll_checkStateChanged(const Qt::CheckState &arg1);
30-
28+
void slotWhiteListContextMenuRequested(const QPoint& pos);
29+
void slotBlackListContextMenuRequested(const QPoint& pos);
3130
private:
3231
Ui::CDlgSettings *ui;
3332
QSharedPointer<CParameterFtpServer> m_Para;
3433
QStandardItemModel m_ModelNetWorkInterface;
34+
QStandardItemModel m_ModelBlack;
35+
QStandardItemModel m_ModelWhite;
3536
};

0 commit comments

Comments
 (0)