Skip to content

Commit 47a6712

Browse files
committed
Plugin: add only load plugin in whitelist
1 parent 245f4c0 commit 47a6712

10 files changed

Lines changed: 139 additions & 63 deletions

File tree

Src/FrmManagePlugins.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ int CFrmManagePlugins::SetParameter(CParameter *pParameter)
5757
bool checked = m_pPara->GetEnableSetPluginsPath();
5858
ui->gbPluginsPath->setChecked(checked);
5959
on_gbPluginsPath_clicked(checked);
60+
ui->cbOnlyLoadInWhitelist->setChecked(m_pPara->GetOnlyLoadInWhitelist());
6061
return 0;
6162
}
6263

@@ -80,6 +81,7 @@ int CFrmManagePlugins::Accept()
8081
if(pBlacklist->checkState() == Qt::Checked)
8182
m_pPara->m_BlackList.AddKey(szPath);
8283
}
84+
m_pPara->SetOnlyLoadInWhitelist(ui->cbOnlyLoadInWhitelist->isChecked());
8385
return 0;
8486
}
8587

Src/FrmManagePlugins.ui

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
<string>Form</string>
1515
</property>
1616
<layout class="QGridLayout" name="gridLayout">
17+
<item row="3" column="0">
18+
<widget class="QLabel" name="label">
19+
<property name="text">
20+
<string>The settings will take effect after the application is restarted.</string>
21+
</property>
22+
</widget>
23+
</item>
1724
<item row="1" column="0">
1825
<widget class="QTableView" name="tvFilter">
1926
<property name="sizePolicy">
@@ -80,9 +87,9 @@
8087
</widget>
8188
</item>
8289
<item row="2" column="0">
83-
<widget class="QLabel" name="label">
90+
<widget class="QCheckBox" name="cbOnlyLoadInWhitelist">
8491
<property name="text">
85-
<string>The settings will take effect after the application is restarted.</string>
92+
<string>Only the plugins in the whitelist will be loaded.</string>
8693
</property>
8794
</widget>
8895
</item>

Src/Manager.cpp

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,13 @@ int CManager::LoadPlugins()
168168
}
169169
}//*/
170170

171+
if(m_pParameter->GetOnlyLoadInWhitelist()) {
172+
m_pParameter->m_WhiteList.OnProcess([this](const QString& szPath) -> int{
173+
return LoadPlugin(szPath);
174+
});
175+
return 0;
176+
}
177+
171178
QStringList lstPaths;
172179
if(m_pParameter->GetEnableSetPluginsPath()) {
173180
lstPaths = m_pParameter->GetPluginsPath();
@@ -233,28 +240,7 @@ int CManager::FindPlugins(QDir dir, QStringList filters)
233240
qInfo(log) << "Filter:" << szPlugins << "in blacklist";
234241
continue;
235242
}
236-
QPluginLoader loader(szPlugins);
237-
QObject *plugin = loader.instance();
238-
if (plugin) {
239-
CPlugin* p = qobject_cast<CPlugin*>(plugin);
240-
if(p)
241-
{
242-
if(m_Plugins.find(p->Id()) == m_Plugins.end())
243-
{
244-
qInfo(log) << "Success: Load plugin"
245-
<< p->Name() << "from" << szPlugins;
246-
AppendPlugin(p);
247-
}
248-
else
249-
qWarning(log) << "The plugin [" << p->Name() << "] is exist.";
250-
}
251-
} else {
252-
QString szMsg;
253-
szMsg = "Error: Load plugin fail from " + szPlugins;
254-
if(!loader.errorString().isEmpty())
255-
szMsg += "; Error: " + loader.errorString();
256-
qCritical(log) << szMsg.toStdString().c_str();
257-
}
243+
LoadPlugin(szPlugins);
258244
}
259245

260246
foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
@@ -268,6 +254,34 @@ int CManager::FindPlugins(QDir dir, QStringList filters)
268254
return 0;
269255
}
270256

257+
int CManager::LoadPlugin(const QString &szPath)
258+
{
259+
QPluginLoader loader(szPath);
260+
QObject *plugin = loader.instance();
261+
if (plugin) {
262+
CPlugin* p = qobject_cast<CPlugin*>(plugin);
263+
if(p)
264+
{
265+
if(m_Plugins.find(p->Id()) == m_Plugins.end())
266+
{
267+
qInfo(log) << "Success: Load plugin"
268+
<< p->Name() << "from" << szPath;
269+
AppendPlugin(p);
270+
}
271+
else
272+
qWarning(log) << "The plugin [" << p->Name() << "] is exist.";
273+
} else
274+
qCritical(log) << "The plugin is not \"CPlugin\":" << szPath;
275+
} else {
276+
QString szMsg;
277+
szMsg = "Error: Load plugin fail from " + szPath;
278+
if(!loader.errorString().isEmpty())
279+
szMsg += "; Error: " + loader.errorString();
280+
qCritical(log) << szMsg.toStdString().c_str();
281+
}
282+
return 0;
283+
}
284+
271285
int CManager::AppendPlugin(CPlugin *p)
272286
{
273287
if(!p) return -1;

Src/Manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class PLUGIN_EXPORT CManager : public QObject
176176

177177
private:
178178
int LoadPlugins();
179+
int LoadPlugin(const QString& szPath);
179180
int FindPlugins(QDir dir, QStringList filters);
180181
int AppendPlugin(CPlugin* plugin);
181182

Src/ParameterCompone/ParameterFilter.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,22 @@ int CParameterFilter::Clear()
3232
return 0;
3333
}
3434

35+
bool CParameterFilter::isEmpty()
36+
{
37+
return m_Key.isEmpty();
38+
}
39+
40+
int CParameterFilter::OnProcess(std::function<int (const QString &)> cb, bool bErrExit)
41+
{
42+
if(!cb) return -1;
43+
foreach(auto k, m_Key) {
44+
int nRet = cb(k);
45+
if(bErrExit && nRet)
46+
return nRet;
47+
}
48+
return 0;
49+
}
50+
3551
int CParameterFilter::OnLoad(QSettings &set)
3652
{
3753
QStringList s = set.value("Key").toStringList();

Src/ParameterCompone/ParameterFilter.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class CParameterFilter : public CParameter
1717
int AddKey(const QString& szKey);
1818
int RemoveKey(const QString& szKey);
1919
int Clear();
20+
virtual bool isEmpty();
21+
int OnProcess(std::function<int(const QString& key)> cb, bool bErrExit = false);
22+
2023
private:
2124
QSet<QString> m_Key;
2225

Src/ParameterCompone/ParameterPlugin.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ CParameterPlugin::CParameterPlugin(QObject *parent)
2020
, m_bShowIpPortInName(false)
2121
, m_AdaptWindows(CFrmViewer::ADAPT_WINDOWS::KeepAspectRationToWindow)
2222
, m_bEnableSetPluginsPath(false)
23-
, m_szPluginsPath(RabbitCommon::CDir::Instance()->GetDirPlugins())
2423
, m_WhiteList(this, "Plugin/Paths/Whilelist")
2524
, m_BlackList(this, "Plugin/Paths/BlackList")
25+
, m_szPluginsPath(RabbitCommon::CDir::Instance()->GetDirPlugins())
26+
, m_bOnlyLoadInWhitelist(false)
2627
, m_Record(this)
2728
, m_MediaDevices(this)
2829
#if defined(HAVE_QTERMWIDGET)
@@ -64,8 +65,11 @@ int CParameterPlugin::OnLoad(QSettings &set)
6465
SetShowIpPortInName(set.value("Connecter/Name/ShowIpPort", GetShowIpPortInName()).toBool());
6566
SetAdaptWindows((CFrmViewer::ADAPT_WINDOWS)set.value("Viewer/AdaptWindows",
6667
(int)GetAdaptWindows()).toInt());
68+
6769
SetPluginsPath(set.value("Paths", GetPluginsPath()).toStringList());
6870
SetEnableSetPluginsPath(set.value("Paths/Enable", GetEnableSetPluginsPath()).toBool());
71+
SetOnlyLoadInWhitelist(set.value("OnlyLoadInWhitelist", GetOnlyLoadInWhitelist()).toBool());
72+
6973
set.endGroup();
7074
return 0;
7175
}
@@ -87,8 +91,11 @@ int CParameterPlugin::OnSave(QSettings& set)
8791
set.setValue("Connecter/Name/ShowProtocolPrefix", GetShowProtocolPrefix());
8892
set.setValue("Connecter/Name/ShowIpPort", GetShowIpPortInName());
8993
set.setValue("Viewer/AdaptWindows", (int)GetAdaptWindows());
94+
9095
set.setValue("Paths", GetPluginsPath());
9196
set.setValue("Paths/Enable", GetEnableSetPluginsPath());
97+
set.setValue("OnlyLoadInWhitelist", GetOnlyLoadInWhitelist());
98+
9299
set.endGroup();
93100
return 0;
94101
}
@@ -333,3 +340,16 @@ void CParameterPlugin::SetPluginsPath(const QStringList &newPluginsPath)
333340
{
334341
m_szPluginsPath = newPluginsPath;
335342
}
343+
344+
bool CParameterPlugin::GetOnlyLoadInWhitelist() const
345+
{
346+
return m_bOnlyLoadInWhitelist;
347+
}
348+
349+
void CParameterPlugin::SetOnlyLoadInWhitelist(bool newOnlyLoadInWhitelist)
350+
{
351+
if(m_bOnlyLoadInWhitelist = newOnlyLoadInWhitelist)
352+
return;
353+
m_bOnlyLoadInWhitelist = newOnlyLoadInWhitelist;
354+
SetModified(true);
355+
}

Src/ParameterCompone/ParameterPlugin.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,15 @@ class PLUGIN_EXPORT CParameterPlugin : public CParameter
189189
public:
190190
QStringList GetPluginsPath() const;
191191
void SetPluginsPath(const QStringList &newPluginsPath);
192+
bool GetOnlyLoadInWhitelist() const;
193+
void SetOnlyLoadInWhitelist(bool newOnlyLoadInWhitelist);
194+
CParameterFilter m_WhiteList;
195+
CParameterFilter m_BlackList;
192196
private:
193197
QStringList m_szPluginsPath;
198+
bool m_bOnlyLoadInWhitelist;
194199

195200
public:
196-
CParameterFilter m_WhiteList;
197-
CParameterFilter m_BlackList;
198201
CParameterRecord m_Record;
199202
CParameterMediaDevices m_MediaDevices;
200203
#if defined(HAVE_QTERMWIDGET)

Src/Resource/Translations/Plugin_zh_CN.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -263,47 +263,47 @@
263263
<context>
264264
<name>CFrmManagePlugins</name>
265265
<message>
266-
<location filename="../../FrmManagePlugins.cpp" line="20"/>
266+
<location filename="../../FrmManagePlugins.cpp" line="21"/>
267267
<source>Load Plugins</source>
268268
<translation>加载插件</translation>
269269
</message>
270270
<message>
271-
<location filename="../../FrmManagePlugins.cpp" line="236"/>
271+
<location filename="../../FrmManagePlugins.cpp" line="246"/>
272272
<source>Whitelist</source>
273273
<translation>白名单</translation>
274274
</message>
275275
<message>
276-
<location filename="../../FrmManagePlugins.cpp" line="237"/>
276+
<location filename="../../FrmManagePlugins.cpp" line="250"/>
277277
<source>Blacklist</source>
278278
<translation>黑名单</translation>
279279
</message>
280280
<message>
281-
<location filename="../../FrmManagePlugins.cpp" line="238"/>
281+
<location filename="../../FrmManagePlugins.cpp" line="254"/>
282282
<source>Name</source>
283283
<translation>名称</translation>
284284
</message>
285285
<message>
286-
<location filename="../../FrmManagePlugins.cpp" line="239"/>
286+
<location filename="../../FrmManagePlugins.cpp" line="255"/>
287287
<source>Type</source>
288288
<translation>类型</translation>
289289
</message>
290290
<message>
291-
<location filename="../../FrmManagePlugins.cpp" line="240"/>
291+
<location filename="../../FrmManagePlugins.cpp" line="256"/>
292292
<source>Path</source>
293293
<translation>路径</translation>
294294
</message>
295295
<message>
296-
<location filename="../../FrmManagePlugins.cpp" line="176"/>
296+
<location filename="../../FrmManagePlugins.cpp" line="184"/>
297297
<source>Plugin path</source>
298298
<translation>插件路径</translation>
299299
</message>
300300
<message>
301-
<location filename="../../FrmManagePlugins.cpp" line="212"/>
301+
<location filename="../../FrmManagePlugins.cpp" line="222"/>
302302
<source>Add</source>
303303
<translation>增加</translation>
304304
</message>
305305
<message>
306-
<location filename="../../FrmManagePlugins.cpp" line="213"/>
306+
<location filename="../../FrmManagePlugins.cpp" line="223"/>
307307
<source>Remove</source>
308308
<translation>移除</translation>
309309
</message>
@@ -316,22 +316,27 @@
316316
<translation></translation>
317317
</message>
318318
<message>
319-
<location filename="../../FrmManagePlugins.ui" line="36"/>
319+
<location filename="../../FrmManagePlugins.ui" line="43"/>
320320
<source>Plugins path:</source>
321321
<translation>插件路径:</translation>
322322
</message>
323323
<message>
324-
<location filename="../../FrmManagePlugins.ui" line="66"/>
324+
<location filename="../../FrmManagePlugins.ui" line="73"/>
325325
<source>Add</source>
326326
<translation>增加</translation>
327327
</message>
328328
<message>
329-
<location filename="../../FrmManagePlugins.ui" line="73"/>
329+
<location filename="../../FrmManagePlugins.ui" line="80"/>
330330
<source>Remove</source>
331331
<translation>移除</translation>
332332
</message>
333333
<message>
334-
<location filename="../../FrmManagePlugins.ui" line="85"/>
334+
<location filename="../../FrmManagePlugins.ui" line="92"/>
335+
<source>Only the plugins in the whitelist will be loaded.</source>
336+
<translation>仅加载白名单中的插件</translation>
337+
</message>
338+
<message>
339+
<location filename="../../FrmManagePlugins.ui" line="20"/>
335340
<source>The settings will take effect after the application is restarted.</source>
336341
<translation>需要重启应用后,设置才能生效。</translation>
337342
</message>
@@ -380,23 +385,23 @@ Some features are limited.
380385
<translation>总是显示</translation>
381386
</message>
382387
<message>
383-
<location filename="../../Manager.cpp" line="201"/>
388+
<location filename="../../Manager.cpp" line="208"/>
384389
<source>Plugins</source>
385390
<translation>插件</translation>
386391
</message>
387392
<message>
388-
<location filename="../../Manager.cpp" line="289"/>
389-
<location filename="../../Manager.cpp" line="550"/>
393+
<location filename="../../Manager.cpp" line="303"/>
394+
<location filename="../../Manager.cpp" line="564"/>
390395
<source>Version:</source>
391396
<translation>版本:</translation>
392397
</message>
393398
<message>
394-
<location filename="../../Manager.cpp" line="492"/>
399+
<location filename="../../Manager.cpp" line="506"/>
395400
<source>Terminal</source>
396401
<translation>终端</translation>
397402
</message>
398403
<message>
399-
<location filename="../../Manager.cpp" line="555"/>
404+
<location filename="../../Manager.cpp" line="569"/>
400405
<source>Dependency libraries:</source>
401406
<translation>依赖库:</translation>
402407
</message>

0 commit comments

Comments
 (0)