From b9370d28f89c466a1e0c39d935b96c586d069f47 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Mon, 9 May 2022 21:50:00 +0300 Subject: [PATCH] kdirshare: implement option to control the shared directories server port Signed-off-by: Ivailo Monev --- .../filepropertiesplugin/kdirshareplugin.cpp | 71 ++++++++++++++++++- .../filepropertiesplugin/kdirshareplugin.h | 6 ++ .../filepropertiesplugin/kdirshareplugin.ui | 47 ++++++++++++ kdirshare/kded/kded_kdirshare.cpp | 67 +++++++++++------ kdirshare/kded/kded_kdirshare.h | 5 +- kdirshare/kded/kdirshareimpl.cpp | 34 +++++++-- kdirshare/kded/kdirshareimpl.h | 10 ++- 7 files changed, 211 insertions(+), 29 deletions(-) diff --git a/kdirshare/filepropertiesplugin/kdirshareplugin.cpp b/kdirshare/filepropertiesplugin/kdirshareplugin.cpp index 37750dc9..310da179 100644 --- a/kdirshare/filepropertiesplugin/kdirshareplugin.cpp +++ b/kdirshare/filepropertiesplugin/kdirshareplugin.cpp @@ -27,6 +27,9 @@ #include "kdirshareplugin.h" +static const quint16 s_kdirshareportmin = 1000; +static const quint16 s_kdirshareportmax = 32000; + K_PLUGIN_FACTORY(KDirSharePluginFactory, registerPlugin();) K_EXPORT_PLUGIN(KDirSharePluginFactory("kdirshareplugin")) @@ -56,17 +59,41 @@ KDirSharePlugin::KDirSharePlugin(QObject *parent, const QList &args) if (m_kdirshareiface.isValid()) { QDBusReply kdirsharereply = m_kdirshareiface.call("isShared", m_url); if (!kdirsharereply.isValid()) { - kWarning() << "Invalid kdirshare module reply"; + kWarning() << "Invalid kdirshare module reply for isShared()"; m_ui.sharebox->setChecked(false); + m_ui.portgroup->setEnabled(false); } else { m_ui.sharebox->setChecked(kdirsharereply.value()); + m_ui.portgroup->setEnabled(kdirsharereply.value()); } + + QDBusReply kdirsharereply2 = m_kdirshareiface.call("getPortMin", m_url); + if (!kdirsharereply2.isValid()) { + kWarning() << "Invalid kdirshare module reply for getPortMin()"; + m_ui.portmininput->setValue(s_kdirshareportmin); + } else { + m_ui.portmininput->setValue(kdirsharereply2.value()); + } + kdirsharereply2 = m_kdirshareiface.call("getPortMax", m_url); + if (!kdirsharereply2.isValid()) { + kWarning() << "Invalid kdirshare module reply for getPortMax()"; + m_ui.portmaxinput->setValue(s_kdirshareportmax); + } else { + m_ui.portmaxinput->setValue(kdirsharereply2.value()); + } + const bool randomport = (m_ui.portmininput->value() != m_ui.portmaxinput->value()); + m_ui.randombox->setChecked(randomport); + m_ui.portmininput->setVisible(randomport); } else { kWarning() << "kdirshare module interface is not valid"; m_ui.sharebox->setEnabled(false); + m_ui.portgroup->setEnabled(false); } - connect(m_ui.sharebox, SIGNAL(toggled(bool)), this, SIGNAL(changed())); + connect(m_ui.sharebox, SIGNAL(toggled(bool)), this, SLOT(slotShare(bool))); + connect(m_ui.randombox, SIGNAL(toggled(bool)), this, SLOT(slotRandomPort(bool))); + connect(m_ui.portmininput, SIGNAL(valueChanged(int)), this, SLOT(slotPortMin(int))); + connect(m_ui.portmaxinput, SIGNAL(valueChanged(int)), this, SLOT(slotPortMax(int))); } KDirSharePlugin::~KDirSharePlugin() @@ -79,7 +106,10 @@ void KDirSharePlugin::applyChanges() if (m_ui.sharebox->isEnabled()) { QDBusReply kdirsharereply; if (m_ui.sharebox->isChecked()) { - kdirsharereply = m_kdirshareiface.call("share", m_url); + kdirsharereply = m_kdirshareiface.call("share", + m_url, + uint(m_ui.portmininput->value()), uint(m_ui.portmaxinput->value()) + ); } else { kdirsharereply = m_kdirshareiface.call("unshare", m_url); } @@ -94,4 +124,39 @@ void KDirSharePlugin::applyChanges() } } +void KDirSharePlugin::slotShare(const bool value) +{ + // qDebug() << Q_FUNC_INFO << value; + m_ui.portgroup->setEnabled(value); + emit changed(); +} + +void KDirSharePlugin::slotRandomPort(const bool value) +{ + // qDebug() << Q_FUNC_INFO << value; + m_ui.portmininput->setVisible(value); + if (!value) { + m_ui.portmininput->setValue(m_ui.portmaxinput->value()); + } else { + m_ui.portmininput->setValue(s_kdirshareportmin); + } + emit changed(); +} + +void KDirSharePlugin::slotPortMin(const int value) +{ + // qDebug() << Q_FUNC_INFO << value; + Q_UNUSED(value); + emit changed(); +} + +void KDirSharePlugin::slotPortMax(const int value) +{ + // qDebug() << Q_FUNC_INFO << value; + if (!m_ui.portmininput->isVisible()) { + m_ui.portmininput->setValue(value); + } + emit changed(); +} + #include "moc_kdirshareplugin.cpp" diff --git a/kdirshare/filepropertiesplugin/kdirshareplugin.h b/kdirshare/filepropertiesplugin/kdirshareplugin.h index b51c6f50..56906f91 100644 --- a/kdirshare/filepropertiesplugin/kdirshareplugin.h +++ b/kdirshare/filepropertiesplugin/kdirshareplugin.h @@ -33,6 +33,12 @@ public: void applyChanges() final; +private Q_SLOTS: + void slotShare(const bool value); + void slotRandomPort(const bool value); + void slotPortMin(const int value); + void slotPortMax(const int value); + private: Ui_KDirShareUI m_ui; QDBusInterface m_kdirshareiface; diff --git a/kdirshare/filepropertiesplugin/kdirshareplugin.ui b/kdirshare/filepropertiesplugin/kdirshareplugin.ui index 1d1c0dcb..cb692c4c 100644 --- a/kdirshare/filepropertiesplugin/kdirshareplugin.ui +++ b/kdirshare/filepropertiesplugin/kdirshareplugin.ui @@ -25,6 +25,46 @@ + + + + Port + + + + + + Random in the range of: + + + + + + + + + 1 + + + 32000 + + + + + + + 1 + + + 32000 + + + + + + + + @@ -40,6 +80,13 @@ + + + KIntNumInput + +
knuminput.h
+
+
diff --git a/kdirshare/kded/kded_kdirshare.cpp b/kdirshare/kded/kded_kdirshare.cpp index 94b5256a..57fb478d 100644 --- a/kdirshare/kded/kded_kdirshare.cpp +++ b/kdirshare/kded/kded_kdirshare.cpp @@ -23,15 +23,6 @@ #include #include -static quint16 getRandomPort() -{ - quint16 portnumber = 0; - while (portnumber < 1000 || portnumber > 30000) { - portnumber = quint16(qrand()); - } - return portnumber; -} - K_PLUGIN_FACTORY(KDirShareModuleFactory, registerPlugin();) K_EXPORT_PLUGIN(KDirShareModuleFactory("kdirshare")) @@ -40,8 +31,13 @@ KDirShareModule::KDirShareModule(QObject *parent, const QList&) { KSettings kdirsharesettings("kdirsharerc", KSettings::SimpleConfig); foreach (const QString &kdirsharekey, kdirsharesettings.keys()) { - const QString kdirsharedir = kdirsharesettings.value(kdirsharekey).toString(); - const QString kdirshareerror = share(kdirsharedir); + const QString kdirsharedirpathkey = QString::fromLatin1("%1/dirpath").arg(kdirsharekey); + const QString kdirshareportminkey = QString::fromLatin1("%1/portmin").arg(kdirsharekey); + const QString kdirshareportmaxkey = QString::fromLatin1("%1/portmax").arg(kdirsharekey); + const QString kdirshareerror = share( + kdirsharesettings.value(kdirsharedirpathkey).toString(), + kdirsharesettings.value(kdirshareportminkey).toUInt(), kdirsharesettings.value(kdirshareportmaxkey).toUInt() + ); if (!kdirshareerror.isEmpty()) { kWarning() << kdirshareerror; } @@ -53,27 +49,38 @@ KDirShareModule::~KDirShareModule() KSettings kdirsharesettings("kdirsharerc", KSettings::SimpleConfig); foreach (const KDirShareImpl *kdirshareimpl, m_dirshares) { const QByteArray kdirsharekey = kdirshareimpl->directory().toLocal8Bit().toHex(); - kdirsharesettings.setValue(kdirsharekey, kdirshareimpl->directory()); + const QString kdirsharedirpathkey = QString::fromLatin1("%1/dirpath").arg(kdirsharekey.constData()); + const QString kdirshareportminkey = QString::fromLatin1("%1/portmin").arg(kdirsharekey.constData()); + const QString kdirshareportmaxkey = QString::fromLatin1("%1/portmax").arg(kdirsharekey.constData()); + kdirsharesettings.setValue(kdirsharedirpathkey, kdirshareimpl->directory()); + kdirsharesettings.setValue(kdirshareportminkey, kdirshareimpl->portMin()); + kdirsharesettings.setValue(kdirshareportmaxkey, kdirshareimpl->portMax()); } qDeleteAll(m_dirshares); } -QString KDirShareModule::share(const QString &dirpath) +QString KDirShareModule::share(const QString &dirpath, const uint portmin, const uint portmax) { + if (isShared(dirpath)) { + const QString unshareerror = unshare(dirpath); + if (!unshareerror.isEmpty()) { + return unshareerror; + } + } + KDirShareImpl *kdirshareimpl = new KDirShareImpl(this); if (!kdirshareimpl->setDirectory(dirpath)) { - kdirshareimpl->deleteLater(); + delete kdirshareimpl; return i18n("Directory does not exist: %1", dirpath); } - const quint16 randomport = getRandomPort(); - // qDebug() << Q_FUNC_INFO << randomport; - if (!kdirshareimpl->serve(QHostAddress(QHostAddress::Any), randomport)) { - kdirshareimpl->deleteLater(); + // qDebug() << Q_FUNC_INFO << serverport; + if (!kdirshareimpl->serve(QHostAddress(QHostAddress::Any), portmin, portmax)) { + delete kdirshareimpl; return i18n("Could not serve: %1", kdirshareimpl->errorString()); } if (!kdirshareimpl->publish()) { kdirshareimpl->stop(); - kdirshareimpl->deleteLater(); + delete kdirshareimpl; return i18n("Could not publish service for: %1", dirpath); } m_dirshares.append(kdirshareimpl); @@ -85,7 +92,7 @@ QString KDirShareModule::unshare(const QString &dirpath) foreach (KDirShareImpl *kdirshareimpl, m_dirshares) { if (kdirshareimpl->directory() == dirpath) { kdirshareimpl->stop(); - kdirshareimpl->deleteLater(); + delete kdirshareimpl; m_dirshares.removeAll(kdirshareimpl); return QString(); } @@ -103,4 +110,24 @@ bool KDirShareModule::isShared(const QString &dirpath) const return false; } +quint16 KDirShareModule::getPortMin(const QString &dirpath) const +{ + foreach (const KDirShareImpl *kdirshareimpl, m_dirshares) { + if (kdirshareimpl->directory() == dirpath) { + return kdirshareimpl->portMin(); + } + } + return s_kdirshareportmin; +} + +quint16 KDirShareModule::getPortMax(const QString &dirpath) const +{ + foreach (const KDirShareImpl *kdirshareimpl, m_dirshares) { + if (kdirshareimpl->directory() == dirpath) { + return kdirshareimpl->portMax(); + } + } + return s_kdirshareportmax; +} + #include "moc_kded_kdirshare.cpp" diff --git a/kdirshare/kded/kded_kdirshare.h b/kdirshare/kded/kded_kdirshare.h index 896ce9fc..77a28d28 100644 --- a/kdirshare/kded/kded_kdirshare.h +++ b/kdirshare/kded/kded_kdirshare.h @@ -34,11 +34,14 @@ public: ~KDirShareModule(); public Q_SLOTS: - Q_SCRIPTABLE QString share(const QString &dirpath); + Q_SCRIPTABLE QString share(const QString &dirpath, const uint portmin, const uint portmax); Q_SCRIPTABLE QString unshare(const QString &dirpath); Q_SCRIPTABLE bool isShared(const QString &dirpath) const; + Q_SCRIPTABLE quint16 getPortMin(const QString &dirpath) const; + Q_SCRIPTABLE quint16 getPortMax(const QString &dirpath) const; + private: QList m_dirshares; }; diff --git a/kdirshare/kded/kdirshareimpl.cpp b/kdirshare/kded/kdirshareimpl.cpp index c4c43b77..cf7ed3cd 100644 --- a/kdirshare/kded/kdirshareimpl.cpp +++ b/kdirshare/kded/kdirshareimpl.cpp @@ -29,6 +29,18 @@ static const QDir::SortFlags s_dirsortflags = (QDir::Name | QDir::DirsFirst); +static quint16 getPort(const quint16 portmin, const quint16 portmax) +{ + if (portmin == portmax) { + return portmax; + } + quint16 portnumber = 0; + while (portnumber < portmin || portnumber > portmax) { + portnumber = quint16(qrand()); + } + return portnumber; +} + static QByteArray contentForDirectory(const QString &path, const QString &basedir) { QByteArray data; @@ -98,7 +110,9 @@ static QByteArray contentForDirectory(const QString &path, const QString &basedi KDirShareImpl::KDirShareImpl(QObject *parent) : KHTTP(parent), m_directory(QDir::currentPath()), - m_port(0) + m_port(0), + m_portmin(s_kdirshareportmin), + m_portmax(s_kdirshareportmax) { } @@ -122,10 +136,12 @@ bool KDirShareImpl::setDirectory(const QString &dirpath) return true; } -bool KDirShareImpl::serve(const QHostAddress &address, const quint16 port) +bool KDirShareImpl::serve(const QHostAddress &address, const quint16 portmin, const quint16 portmax) { - m_port = port; - return start(address, port); + m_port = getPort(portmin, portmax); + m_portmin = portmin; + m_portmax = portmax; + return start(address, m_port); } bool KDirShareImpl::publish() @@ -136,6 +152,16 @@ bool KDirShareImpl::publish() ); } +quint16 KDirShareImpl::portMin() const +{ + return m_portmin; +} + +quint16 KDirShareImpl::portMax() const +{ + return m_portmax; +} + void KDirShareImpl::respond(const QByteArray &url, QByteArray *outdata, ushort *outhttpstatus, KHTTPHeaders *outheaders) { // qDebug() << Q_FUNC_INFO << url; diff --git a/kdirshare/kded/kdirshareimpl.h b/kdirshare/kded/kdirshareimpl.h index 562261a1..b80185a3 100644 --- a/kdirshare/kded/kdirshareimpl.h +++ b/kdirshare/kded/kdirshareimpl.h @@ -22,6 +22,9 @@ #include #include +static const quint16 s_kdirshareportmin = 1000; +static const quint16 s_kdirshareportmax = 32000; + class KDirShareImpl : public KHTTP { Q_OBJECT @@ -31,15 +34,20 @@ public: QString directory() const; bool setDirectory(const QString &dirpath); - bool serve(const QHostAddress &address, const quint16 port); + bool serve(const QHostAddress &address, const quint16 portmin, const quint16 portmax); bool publish(); + quint16 portMin() const; + quint16 portMax() const; + protected: void respond(const QByteArray &url, QByteArray *outdata, ushort *outhttpstatus, KHTTPHeaders *outheaders) final; private: QString m_directory; quint16 m_port; + quint16 m_portmin; + quint16 m_portmax; KDNSSD m_kdnssd; };