[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