[PATCH 3/5] Generic mechanism for specifying secret storage type
Andrey Borzenkov
arvidjaar at gmail.com
Fri Nov 26 18:19:43 CET 2010
From: Andrey Borzenkov <arvidjaar at mail.ru>
Signed-off-by: Andrey Borzenkov <arvidjaar at mail.ru>
---
libs/internals/setting.h | 2 +-
libs/internals/settings/vpn.cpp | 20 ++++++++++++++++++++
libs/internals/settings/vpn.h | 24 ++++++++++++++++++++++++
libs/internals/settings/vpnpersistence.cpp | 26 ++++++++++++++++++++++----
libs/internals/settings/vpnpersistence.h | 1 +
libs/ui/connectionsecretsjob.cpp | 3 ++-
vpnplugins/vpnc/nm-vpnc-service.h | 4 ----
vpnplugins/vpnc/vpncwidget.cpp | 14 +++++++-------
8 files changed, 77 insertions(+), 17 deletions(-)
diff --git a/libs/internals/setting.h b/libs/internals/setting.h
index 7cd9c32..ec16bf1 100644
--- a/libs/internals/setting.h
+++ b/libs/internals/setting.h
@@ -41,7 +41,7 @@ public:
Setting::Type type() const;
virtual QString name() const = 0;
virtual bool hasSecrets() const = 0;
- bool secretsAvailable() const;
+ virtual bool secretsAvailable() const;
void setSecretsAvailable(bool secretsAvailable);
protected:
bool m_initialized;
diff --git a/libs/internals/settings/vpn.cpp b/libs/internals/settings/vpn.cpp
index 1fb1901..4186655 100644
--- a/libs/internals/settings/vpn.cpp
+++ b/libs/internals/settings/vpn.cpp
@@ -7,6 +7,7 @@ using namespace Knm;
VpnSetting::VpnSetting() : Setting(Setting::Vpn)
{
+ mSecretsStorageType = QStringMap();
}
VpnSetting::~VpnSetting()
@@ -21,3 +22,22 @@ bool VpnSetting::hasSecrets() const
{
return true;
}
+
+bool VpnSetting::secretsAvailable() const
+{
+ /*
+ * secrets were loaded from persistente storage
+ * Now verify that all secrets of type "save" are actually present
+ * and no secret of type "ask" exists
+ */
+
+ foreach(const QString & s, mSecretsStorageType.keys()) {
+ if (mSecretsStorageType.value(s) == NM_VPN_PW_TYPE_ASK)
+ return false;
+ if (mSecretsStorageType.value(s) == NM_VPN_PW_TYPE_SAVE && !mVpnSecrets.contains(s))
+ return false;
+ }
+
+ return true;
+}
+
diff --git a/libs/internals/settings/vpn.h b/libs/internals/settings/vpn.h
index 332b4b6..d809c79 100644
--- a/libs/internals/settings/vpn.h
+++ b/libs/internals/settings/vpn.h
@@ -9,6 +9,11 @@
#include "setting.h"
#include "knminternals_export.h"
#include "../types.h"
+
+#define NM_VPN_PW_TYPE_SAVE "save"
+#define NM_VPN_PW_TYPE_ASK "ask"
+#define NM_VPN_PW_TYPE_UNUSED "unused"
+
namespace Knm {
class KNMINTERNALS_EXPORT VpnSetting : public Setting
@@ -102,6 +107,24 @@ class KNMINTERNALS_EXPORT VpnSetting : public Setting
return mPluginName;
}
+ /**
+ Set secret storage type
+ */
+ void setSecretsStorageType( const QStringMap & v )
+ {
+ mSecretsStorageType = v;
+ }
+
+ /**
+ Get secret storage type
+ */
+ QStringMap secretsStorageType() const
+ {
+ return mSecretsStorageType;
+ }
+
+ bool secretsAvailable() const;
+
protected:
// vpn
@@ -110,6 +133,7 @@ class KNMINTERNALS_EXPORT VpnSetting : public Setting
QString mUserName;
QVariantMap mVpnSecrets;
QString mPluginName;
+ QStringMap mSecretsStorageType;
private:
};
diff --git a/libs/internals/settings/vpnpersistence.cpp b/libs/internals/settings/vpnpersistence.cpp
index a90c277..cffbe53 100644
--- a/libs/internals/settings/vpnpersistence.cpp
+++ b/libs/internals/settings/vpnpersistence.cpp
@@ -22,6 +22,7 @@ void VpnPersistence::load()
VpnSetting * setting = static_cast<VpnSetting *>(m_setting);
setting->setServiceType(m_config->readEntry("ServiceType", ""));
setting->setData(stringMapFromStringList(m_config->readEntry("Data", QStringList())));
+ setting->setSecretsStorageType(stringMapFromStringList(m_config->readEntry("SecretsStorageType", QStringList())));
setting->setUserName(KUser().loginName());
// SECRET
if (m_storageMode != ConnectionPersistence::Secure) {
@@ -38,9 +39,14 @@ void VpnPersistence::save()
VpnSetting * setting = static_cast<VpnSetting *>(m_setting);
m_config->writeEntry("ServiceType", setting->serviceType());
m_config->writeEntry("Data", stringMapToStringList(setting->data()));
+ m_config->writeEntry("SecretsStorageType", stringMapToStringList(setting->secretsStorageType()));
// SECRET
if (m_storageMode != ConnectionPersistence::Secure) {
- m_config->writeEntry("VpnSecrets", variantMapToStringList(setting->vpnSecrets()));
+ /*
+ * Save only secrets with storage type == "save"
+ * For compatibility treat empty storage type as "save"
+ */
+ m_config->writeEntry("VpnSecrets", variantMapToStringList(secretsToSave(setting->secretsStorageType(), setting->vpnSecrets())));
}
m_config->writeEntry("PluginName", setting->pluginName());
}
@@ -62,7 +68,7 @@ QStringList VpnPersistence::variantMapToStringList(const QVariantMap & map)
QMapIterator<QString,QVariant> i(map);
while (i.hasNext()) {
i.next();
- rawSecrets << i.key() << i.value().toString();
+ rawSecrets << i.key() << i.value().toString();
}
return rawSecrets;
}
@@ -84,7 +90,7 @@ QStringList VpnPersistence::stringMapToStringList(const QStringMap & map)
QStringMapIterator i(map);
while (i.hasNext()) {
i.next();
- rawSecrets << i.key() << i.value();
+ rawSecrets << i.key() << i.value();
}
return rawSecrets;
}
@@ -93,7 +99,7 @@ QMap<QString,QString> VpnPersistence::secrets() const
{
VpnSetting * setting = static_cast<VpnSetting *>(m_setting);
QMap<QString,QString> map;
- map.insert(QLatin1String("VpnSecrets"), variantMapToStringList(setting->vpnSecrets()).join(QLatin1String("%SEP%")));
+ map.insert(QLatin1String("VpnSecrets"), variantMapToStringList(secretsToSave(setting->secretsStorageType(), setting->vpnSecrets())).join(QLatin1String("%SEP%")));
return map;
}
@@ -105,3 +111,15 @@ void VpnPersistence::restoreSecrets(QMap<QString,QString> secrets) const
setting->setSecretsAvailable(true);
}
}
+
+QVariantMap VpnPersistence::secretsToSave(const QStringMap & type, const QVariantMap & secrets)
+{
+ QVariantMap toSave;
+ QMapIterator<QString,QVariant> i(secrets);
+ while (i.hasNext()) {
+ i.next();
+ if (type[i.key()].isNull() || type[i.key()] == NM_VPN_PW_TYPE_SAVE)
+ toSave.insert( i.key(), i.value() );
+ }
+ return toSave;
+}
diff --git a/libs/internals/settings/vpnpersistence.h b/libs/internals/settings/vpnpersistence.h
index 10890b6..39dc451 100644
--- a/libs/internals/settings/vpnpersistence.h
+++ b/libs/internals/settings/vpnpersistence.h
@@ -26,6 +26,7 @@ class KNMINTERNALS_EXPORT VpnPersistence : public SettingPersistence
static QVariantMap variantMapFromStringList(const QStringList &);
static QStringList stringMapToStringList(const QStringMap &);
static QStringMap stringMapFromStringList(const QStringList &);
+ static QVariantMap secretsToSave(const QStringMap &, const QVariantMap &);
};
}
diff --git a/libs/ui/connectionsecretsjob.cpp b/libs/ui/connectionsecretsjob.cpp
index 2d92f7f..5a90b99 100644
--- a/libs/ui/connectionsecretsjob.cpp
+++ b/libs/ui/connectionsecretsjob.cpp
@@ -105,7 +105,8 @@ void ConnectionSecretsJob::gotPersistedSecrets(uint result)
m_connectionPersistence->deleteLater();
m_connectionPersistence = 0;
setError(result);
- if (result == Knm::ConnectionPersistence::EnumError::NoError) {
+ if (result == Knm::ConnectionPersistence::EnumError::NoError &&
+ m_connection->secretsAvailable()) {
emitResult();
} else {
doAskUser();
diff --git a/vpnplugins/vpnc/nm-vpnc-service.h b/vpnplugins/vpnc/nm-vpnc-service.h
index 3ec2412..e3f859a 100644
--- a/vpnplugins/vpnc/nm-vpnc-service.h
+++ b/vpnplugins/vpnc/nm-vpnc-service.h
@@ -47,8 +47,4 @@
#define NM_VPNC_NATT_MODE_NONE "none"
#define NM_VPNC_NATT_MODE_CISCO "cisco-udp"
-#define NM_VPNC_PW_TYPE_SAVE "save"
-#define NM_VPNC_PW_TYPE_ASK "ask"
-#define NM_VPNC_PW_TYPE_UNUSED "unused"
-
#endif /* NM_VPNC_PLUGIN_H */
diff --git a/vpnplugins/vpnc/vpncwidget.cpp b/vpnplugins/vpnc/vpncwidget.cpp
index bc9c48d..8683547 100644
--- a/vpnplugins/vpnc/vpncwidget.cpp
+++ b/vpnplugins/vpnc/vpncwidget.cpp
@@ -119,9 +119,9 @@ void VpncSettingWidget::readConfig()
void VpncSettingWidget::fillOnePasswordCombo(QComboBox * combo, const QString & key, const QStringMap & data, bool hasPassword)
{
if (data.contains(key)) {
- if (data.value(key) == NM_VPNC_PW_TYPE_SAVE) {
+ if (data.value(key) == NM_VPN_PW_TYPE_SAVE) {
combo->setCurrentIndex(1);
- } else if (data.value(key) == NM_VPNC_PW_TYPE_UNUSED) {
+ } else if (data.value(key) == NM_VPN_PW_TYPE_UNUSED) {
combo->setCurrentIndex(2);
}
} else if (!hasPassword) {
@@ -214,13 +214,13 @@ uint VpncSettingWidget::handleOnePasswordType(const QComboBox * combo, const QSt
uint type = combo->currentIndex();
switch (type) {
case 0:
- data.insert(key, NM_VPNC_PW_TYPE_ASK);
+ data.insert(key, NM_VPN_PW_TYPE_ASK);
break;
case 1:
- data.insert(key, NM_VPNC_PW_TYPE_SAVE);
+ data.insert(key, NM_VPN_PW_TYPE_SAVE);
break;
case 2:
- data.insert(key, NM_VPNC_PW_TYPE_UNUSED);
+ data.insert(key, NM_VPN_PW_TYPE_UNUSED);
break;
}
return type;
@@ -230,12 +230,12 @@ void VpncSettingWidget::readSecrets()
{
Q_D(VpncSettingWidget);
QVariantMap secrets = d->setting->vpnSecrets();
- if (d->setting->data().value(NM_VPNC_KEY_XAUTH_PASSWORD_TYPE) == QLatin1String(NM_VPNC_PW_TYPE_SAVE)) {
+ if (d->setting->data().value(NM_VPNC_KEY_XAUTH_PASSWORD_TYPE) == QLatin1String(NM_VPN_PW_TYPE_SAVE)) {
d->ui.leUserPassword->setText(secrets.value(QLatin1String(NM_VPNC_KEY_XAUTH_PASSWORD)).toString());
}
fillOnePasswordCombo(d->ui.cboUserPassOptions, NM_VPNC_KEY_XAUTH_PASSWORD_TYPE, d->setting->data(), !d->ui.leUserName->text().isEmpty());
- if (d->setting->data().value(NM_VPNC_KEY_SECRET_TYPE) == QLatin1String(NM_VPNC_PW_TYPE_SAVE)) {
+ if (d->setting->data().value(NM_VPNC_KEY_SECRET_TYPE) == QLatin1String(NM_VPN_PW_TYPE_SAVE)) {
d->ui.leGroupPassword->setText(secrets.value(QLatin1String(NM_VPNC_KEY_SECRET)).toString());
}
fillOnePasswordCombo(d->ui.cboGroupPassOptions, NM_VPNC_KEY_SECRET_TYPE, d->setting->data(), !d->ui.leGroupPassword->text().isEmpty());
--
1.7.3.2
More information about the kde-networkmanager
mailing list