1
mirror of https://invent.kde.org/network/falkon.git synced 2024-12-20 18:56:34 +01:00

added permission to allow plugins in private mode

This commit is contained in:
Anmol Gautam 2018-05-16 23:46:24 +05:30
parent 9d9766dc13
commit f09238115f
7 changed files with 132 additions and 37 deletions

View File

@ -21,6 +21,7 @@
#include "updater.h"
#include "qztools.h"
#include "sqldatabase.h"
#include "plugins.h"
#include <QDir>
#include <QSqlError>
@ -305,6 +306,18 @@ void ProfileManager::connectDatabase()
qCritical() << "Error creating database schema" << query.lastError().text();
}
}
// Insert default allowed plugins to allowed_plugins table
QStringList defaultAllowedPlugins = Plugins::getDefaultAllowedPlugins();
QSqlQuery query(SqlDatabase::instance()->database());
for (const QString &defaultPlugin : defaultAllowedPlugins) {
query.prepare("INSERT INTO allowed_plugins VALUES (?, ?)");
query.addBindValue(defaultPlugin);
query.addBindValue(1);
if (!query.exec()) {
qWarning() << "Unable to insert" << defaultPlugin << "into database";
}
}
}
SqlDatabase::instance()->setDatabase(db);

View File

@ -55,4 +55,9 @@ CREATE TABLE icons (
);
CREATE UNIQUE INDEX icons_urluniqueindex ON icons (url);
CREATE TABLE allowed_plugins (
pluginId TEXT NOT NULL UNIQUE,
allowInPrivateMode INTEGER DEFAULT 0 NOT NULL
);
-- Data

View File

@ -25,6 +25,7 @@
#include "../config.h"
#include "desktopfile.h"
#include "qml/qmlplugins.h"
#include "sqldatabase.h"
#include <iostream>
#include <QPluginLoader>
@ -89,19 +90,15 @@ void Plugins::unloadPlugin(Plugins::Plugin* plugin)
void Plugins::loadSettings()
{
QStringList defaultAllowedPlugins = {
QSL("internal:adblock")
};
// Enable KDE Frameworks Integration when running inside KDE session
if (qgetenv("KDE_FULL_SESSION") == QByteArray("true")) {
defaultAllowedPlugins.append(QSL("lib:KDEFrameworksIntegration.so"));
QSqlQuery query(SqlDatabase::instance()->database());
if (mApp->isPrivate()) {
query.exec(QSL("SELECT * FROM allowed_plugins WHERE allowInPrivateMode=1"));
} else {
query.exec(QSL("SELECT * FROM allowed_plugins"));
}
while (query.next()) {
m_allowedPlugins.append(query.value(0).toString());
}
Settings settings;
settings.beginGroup("Plugin-Settings");
m_allowedPlugins = settings.value("AllowedPlugins", defaultAllowedPlugins).toStringList();
settings.endGroup();
}
void Plugins::shutdown()
@ -481,3 +478,18 @@ void Plugins::initQmlPlugin(Plugin *plugin)
plugin->qmlPluginLoader->setName(plugin->pluginSpec.name);
plugin->instance = qobject_cast<PluginInterface*>(plugin->qmlPluginLoader->instance());
}
// static
QStringList Plugins::getDefaultAllowedPlugins()
{
QStringList defaultAllowedPlugins = {
QSL("internal:adblock")
};
// Enable KDE Frameworks Integration when running inside KDE session
if (qgetenv("KDE_FULL_SESSION") == QByteArray("true")) {
defaultAllowedPlugins.append(QSL("lib:KDEFrameworksIntegration.so"));
}
return defaultAllowedPlugins;
}

View File

@ -103,6 +103,8 @@ public:
static PluginSpec createSpec(const DesktopFile &metaData);
static QStringList getDefaultAllowedPlugins();
public Q_SLOTS:
void loadSettings();

View File

@ -57,6 +57,16 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="allowInPrivateModeBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Allow in private mode</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">

View File

@ -17,7 +17,6 @@
* ============================================================ */
#include "pluginsmanager.h"
#include "ui_pluginslist.h"
#include "pluginproxy.h"
#include "mainapplication.h"
#include "plugininterface.h"
#include "pluginlistdelegate.h"
@ -25,10 +24,12 @@
#include "settings.h"
#include "iconprovider.h"
#include "../config.h"
#include "sqldatabase.h"
#include <QInputDialog>
#include <QMessageBox>
#include <QTimer>
#include <QCheckBox>
PluginsManager::PluginsManager(QWidget* parent)
: QWidget(parent)
@ -50,7 +51,7 @@ PluginsManager::PluginsManager(QWidget* parent)
connect(ui->butSettings, SIGNAL(clicked()), this, SLOT(settingsClicked()));
connect(ui->list, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(currentChanged(QListWidgetItem*)));
connect(ui->list, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*)));
connect(ui->allowInPrivateModeBox, &QCheckBox::toggled, this, &PluginsManager::allowInPrivateModeBoxToggled);
ui->list->setItemDelegate(new PluginListDelegate(ui->list));
}
@ -68,20 +69,25 @@ void PluginsManager::save()
return;
}
QStringList allowedPlugins;
for (int i = 0; i < ui->list->count(); i++) {
QListWidgetItem* item = ui->list->item(i);
if (item->checkState() == Qt::Checked) {
const Plugins::Plugin plugin = item->data(Qt::UserRole + 10).value<Plugins::Plugin>();
allowedPlugins.append(plugin.pluginId);
}
if (mApp->isPrivate()) {
QMessageBox::warning(this, tr("Error!"), tr("Cannot manage extensions in private mode!"));
return;
}
Settings settings;
settings.beginGroup("Plugin-Settings");
settings.setValue("AllowedPlugins", allowedPlugins);
settings.endGroup();
for (int i = 0; i < ui->list->count(); i++) {
QListWidgetItem* item = ui->list->item(i);
const Plugins::Plugin plugin = item->data(Qt::UserRole + 10).value<Plugins::Plugin>();
if (item->checkState() == Qt::Checked) {
auto job = new SqlQueryJob(QSL("INSERT OR REPLACE INTO allowed_plugins (pluginId, allowInPrivateMode) VALUES (?, ?)"), this);
job->addBindValue(plugin.pluginId);
job->addBindValue(m_allowInPrivateMode[plugin.pluginId]);
job->start();
} else {
auto job = new SqlQueryJob(QSL("DELETE FROM allowed_plugins WHERE pluginId = ?"), this);
job->addBindValue(plugin.pluginId);
job->start();
}
}
}
void PluginsManager::refresh()
@ -120,6 +126,12 @@ void PluginsManager::refresh()
sortItems();
connect(ui->list, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*)));
QSqlQuery query(SqlDatabase::instance()->database());
query.exec(QSL("SELECT * FROM allowed_plugins"));
while (query.next()) {
m_allowInPrivateMode[query.value(0).toString()] = query.value(1).toInt();
}
}
void PluginsManager::sortItems()
@ -154,12 +166,21 @@ void PluginsManager::currentChanged(QListWidgetItem* item)
const Plugins::Plugin plugin = item->data(Qt::UserRole + 10).value<Plugins::Plugin>();
bool showSettings = plugin.pluginSpec.hasSettings;
bool enableAllowInPrivateModeBox = true;
if (!plugin.isLoaded()) {
if (plugin.isLoaded()) {
if (m_allowInPrivateMode[plugin.pluginId]) {
ui->allowInPrivateModeBox->setChecked(true);
} else {
ui->allowInPrivateModeBox->setChecked(false);
}
} else {
showSettings = false;
enableAllowInPrivateModeBox = false;
}
ui->butSettings->setEnabled(showSettings);
ui->allowInPrivateModeBox->setEnabled(enableAllowInPrivateModeBox);
}
void PluginsManager::itemChanged(QListWidgetItem* item)
@ -194,19 +215,12 @@ void PluginsManager::itemChanged(QListWidgetItem* item)
void PluginsManager::settingsClicked()
{
QListWidgetItem* item = ui->list->currentItem();
if (!item || item->checkState() == Qt::Unchecked) {
Plugins::Plugin plugin = getCurrentPlugin();
if (plugin.type == Plugins::Plugin::Invalid) {
return;
}
Plugins::Plugin plugin = item->data(Qt::UserRole + 10).value<Plugins::Plugin>();
if (!plugin.isLoaded()) {
mApp->plugins()->loadPlugin(&plugin);
item->setData(Qt::UserRole + 10, QVariant::fromValue(plugin));
}
if (plugin.isLoaded() && plugin.pluginSpec.hasSettings) {
plugin.instance->showSettings(this);
}
@ -216,3 +230,38 @@ PluginsManager::~PluginsManager()
{
delete ui;
}
void PluginsManager::allowInPrivateModeBoxToggled(bool state)
{
Plugins::Plugin plugin = getCurrentPlugin();
if (plugin.type == Plugins::Plugin::Invalid) {
return;
}
if (plugin.isLoaded()) {
if (state) {
m_allowInPrivateMode[plugin.pluginId] = 1;
} else {
m_allowInPrivateMode[plugin.pluginId] = 0;
}
}
}
Plugins::Plugin PluginsManager::getCurrentPlugin()
{
QListWidgetItem* item = ui->list->currentItem();
if (!item || item->checkState() == Qt::Unchecked) {
return Plugins::Plugin();
}
Plugins::Plugin plugin = item->data(Qt::UserRole + 10).value<Plugins::Plugin>();
if (!plugin.isLoaded()) {
mApp->plugins()->loadPlugin(&plugin);
item->setData(Qt::UserRole + 10, QVariant::fromValue(plugin));
}
return plugin;
}

View File

@ -21,6 +21,7 @@
#include <QWidget>
#include "qzcommon.h"
#include "pluginproxy.h"
namespace Ui
{
@ -44,14 +45,17 @@ private Q_SLOTS:
void settingsClicked();
void currentChanged(QListWidgetItem* item);
void itemChanged(QListWidgetItem* item);
void allowInPrivateModeBoxToggled(bool state);
void refresh();
private:
void sortItems();
Plugins::Plugin getCurrentPlugin();
Ui::PluginsList* ui;
bool m_loaded;
QMap<QString, int> m_allowInPrivateMode;
};
#endif // PLUGINSMANAGER_H