Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > media > contrib-backports-src > by-pkgid > b0faabf4863de4c4f74a493280ded02b > files > 2

knetworkmanager-0.9-0.r1192577.3mdv2010.1.src.rpm

diff --git a/libs/internals/connectionpersistence.cpp b/libs/internals/connectionpersistence.cpp
index 0c31aae..df26574 100644
--- a/libs/internals/connectionpersistence.cpp
+++ b/libs/internals/connectionpersistence.cpp
@@ -217,8 +217,8 @@ void ConnectionPersistence::loadSecrets()
 
         if (m_storageMode != ConnectionPersistence::Secure) {
 
-            foreach (Setting * setting, m_connection->settings()) {
-                setting->setSecretsAvailable(true);
+            if (!m_connection->secretsAvailable()){
+                errorCode = EnumError::MissingContents;
             }
 
         } else if (!m_connection->hasSecrets() ||
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/802-11-wireless-securitypersistence.cpp b/libs/internals/settings/802-11-wireless-securitypersistence.cpp
index 3565a2c..ddfa78c 100644
--- a/libs/internals/settings/802-11-wireless-securitypersistence.cpp
+++ b/libs/internals/settings/802-11-wireless-securitypersistence.cpp
@@ -69,33 +69,16 @@ void WirelessSecurityPersistence::load()
   setting->setPairwise(m_config->readEntry("pairwise", QStringList()));
   setting->setGroup(m_config->readEntry("group", QStringList()));
   setting->setLeapusername(m_config->readEntry("leapusername", ""));
-  // SECRET
+  // SECRETS
   if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setWepkey0(m_config->readEntry("wepkey0", ""));
-  }
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setWepkey1(m_config->readEntry("wepkey1", ""));
-  }
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setWepkey2(m_config->readEntry("wepkey2", ""));
-  }
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setWepkey3(m_config->readEntry("wepkey3", ""));
-  }
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setPsk(m_config->readEntry("psk", ""));
-  }
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setLeappassword(m_config->readEntry("leappassword", ""));
-  }
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setWeppassphrase(m_config->readEntry("weppassphrase", ""));
+    setting->setSecretsAvailable(true);
   }
   } else {
       setting->setSecurityType(WirelessSecuritySetting::EnumSecurityType::None);
diff --git a/libs/internals/settings/802-1xpersistence.cpp b/libs/internals/settings/802-1xpersistence.cpp
index d334a9e..740da06 100644
--- a/libs/internals/settings/802-1xpersistence.cpp
+++ b/libs/internals/settings/802-1xpersistence.cpp
@@ -94,6 +94,7 @@ void Security8021xPersistence::load()
   // SECRET
   if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setPhase2privatekeypassword(m_config->readEntry("phase2privatekeypassword", ""));
+    setting->setSecretsAvailable(true);
   }
   setting->setPin(m_config->readEntry("pin", ""));
   setting->setPsk(m_config->readEntry("psk", ""));
diff --git a/libs/internals/settings/cdmapersistence.cpp b/libs/internals/settings/cdmapersistence.cpp
index 2cc23f3..78a38b8 100644
--- a/libs/internals/settings/cdmapersistence.cpp
+++ b/libs/internals/settings/cdmapersistence.cpp
@@ -23,6 +23,7 @@ void CdmaPersistence::load()
   // SECRET
   if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setPassword(m_config->readEntry("password", ""));
+    setting->setSecretsAvailable(true);
   }
   setting->setInitialized();
 }
diff --git a/libs/internals/settings/gsmpersistence.cpp b/libs/internals/settings/gsmpersistence.cpp
index 01d4d29..1ddf3ca 100644
--- a/libs/internals/settings/gsmpersistence.cpp
+++ b/libs/internals/settings/gsmpersistence.cpp
@@ -20,21 +20,16 @@ void GsmPersistence::load()
   GsmSetting * setting = static_cast<GsmSetting *>(m_setting);
   setting->setNumber(m_config->readEntry("number", "*99#"));
   setting->setUsername(m_config->readEntry("username", ""));
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
-    setting->setPassword(m_config->readEntry("password", ""));
-  }
   setting->setApn(m_config->readEntry("apn", ""));
   setting->setNetworkid(m_config->readEntry("networkid", ""));
   setting->setNetworktype(m_config->readEntry("networktype", 0));
   setting->setBand(m_config->readEntry("band", 0));
-  // SECRET
+  // SECRETS
   if (m_storageMode != ConnectionPersistence::Secure) {
+    setting->setPassword(m_config->readEntry("password", ""));
     setting->setPin(m_config->readEntry("pin", ""));
-  }
-  // SECRET
-  if (m_storageMode != ConnectionPersistence::Secure) {
     setting->setPuk(m_config->readEntry("puk", ""));
+    setting->setSecretsAvailable(true);
   }
   setting->setInitialized();
 }
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 c9ed029..cffbe53 100644
--- a/libs/internals/settings/vpnpersistence.cpp
+++ b/libs/internals/settings/vpnpersistence.cpp
@@ -22,11 +22,13 @@ 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) {
       // the map is flattened to a list of key,value,key,value
       setting->setVpnSecrets(variantMapFromStringList(m_config->readEntry("VpnSecrets", QStringList())));
+    setting->setSecretsAvailable(true);
   }
   setting->setPluginName(m_config->readEntry("PluginName", ""));
   setting->setInitialized();
@@ -37,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());
 }
@@ -61,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;
 }
@@ -83,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;
 }
@@ -92,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;
 }
 
@@ -104,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 bd7f253..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();
@@ -149,7 +150,7 @@ void ConnectionSecretsJob::doAskUser()
         QString error;
         VpnUiPlugin * uiPlugin = KServiceTypeTrader::createInstanceFromQuery<VpnUiPlugin>( QString::fromLatin1( "NetworkManagement/VpnUiPlugin" ), QString::fromLatin1( "[X-KDE-PluginInfo-Name]=='%1'" ).arg(vpnSetting->pluginName() ), this, QVariantList(), &error );
         if (uiPlugin && error.isEmpty()) {
-            m_settingWidget= uiPlugin->widget(m_connection, 0);
+            m_settingWidget= uiPlugin->askUser(m_connection, 0);
         }
     } else if ( mSettingName == QLatin1String(NM_SETTING_WIRED_SETTING_NAME)) {
         m_settingWidget = new WiredWidget(m_connection, 0);
diff --git a/libs/ui/vpnuiplugin.h b/libs/ui/vpnuiplugin.h
index c06608b..7a13027 100644
--- a/libs/ui/vpnuiplugin.h
+++ b/libs/ui/vpnuiplugin.h
@@ -45,6 +45,7 @@ public:
     virtual ~VpnUiPlugin();
 
     virtual SettingWidget * widget(Knm::Connection * connection, QWidget * parent = 0) = 0;
+    virtual SettingWidget * askUser(Knm::Connection * connection, QWidget * parent = 0){ return widget(connection, parent); };
 private:
     class Private;
     Private * d;
diff --git a/vpnplugins/vpnc/CMakeLists.txt b/vpnplugins/vpnc/CMakeLists.txt
index 5e47c38..5af39b9 100644
--- a/vpnplugins/vpnc/CMakeLists.txt
+++ b/vpnplugins/vpnc/CMakeLists.txt
@@ -4,10 +4,11 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libs/internals)
 
 set(vpnc_SRCS
    vpnc.cpp
+   vpncauth.cpp
    vpncwidget.cpp
    )
 
-kde4_add_ui_files(vpnc_SRCS vpncprop.ui)
+kde4_add_ui_files(vpnc_SRCS vpncprop.ui vpncauth.ui)
 
 kde4_add_plugin(networkmanagement_vpncui ${vpnc_SRCS})
 
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/vpnc.cpp b/vpnplugins/vpnc/vpnc.cpp
index b5f1890..deb9108 100644
--- a/vpnplugins/vpnc/vpnc.cpp
+++ b/vpnplugins/vpnc/vpnc.cpp
@@ -23,6 +23,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <KPluginFactory>
 
 #include "vpncwidget.h"
+#include "vpncauth.h"
 #include "connection.h"
 
 K_PLUGIN_FACTORY( VpncUiPluginFactory, registerPlugin<VpncUiPlugin>(); )
@@ -43,4 +44,9 @@ SettingWidget * VpncUiPlugin::widget(Knm::Connection * connection, QWidget * par
     return new VpncSettingWidget(connection, parent);
 }
 
+SettingWidget * VpncUiPlugin::askUser(Knm::Connection * connection, QWidget * parent)
+{
+    return new VpncAuthWidget(connection, parent);
+}
+
 // vim: sw=4 sts=4 et tw=100
diff --git a/vpnplugins/vpnc/vpnc.h b/vpnplugins/vpnc/vpnc.h
index bb0683b..aec2136 100644
--- a/vpnplugins/vpnc/vpnc.h
+++ b/vpnplugins/vpnc/vpnc.h
@@ -37,6 +37,7 @@ public:
     VpncUiPlugin(QObject * parent = 0, const QVariantList& = QVariantList());
     virtual ~VpncUiPlugin();
     SettingWidget * widget(Knm::Connection *, QWidget * parent = 0);
+    SettingWidget * askUser(Knm::Connection *, QWidget * parent = 0);
 };
 
 #endif //  KNM4_VPNC_H
diff --git a/vpnplugins/vpnc/vpncauth.cpp b/vpnplugins/vpnc/vpncauth.cpp
new file mode 100644
index 0000000..4251ca9
--- /dev/null
+++ b/vpnplugins/vpnc/vpncauth.cpp
@@ -0,0 +1,106 @@
+/*
+Copyright 2008 Will Stephenson <wstephenson@kde.org>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of
+the License or (at your option) version 3 or any later version
+accepted by the membership of KDE e.V. (or its successor approved
+by the membership of KDE e.V.), which shall act as a proxy
+defined in Section 14 of version 3 of the license.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "vpncauth.h"
+
+#include <nm-setting-vpn.h>
+
+#include <QString>
+#include "nm-vpnc-service.h"
+
+#include "connection.h"
+
+class VpncAuthWidgetPrivate
+{
+public:
+    Ui_VpncAuth ui;
+    Knm::VpnSetting * setting;
+};
+
+VpncAuthWidget::VpncAuthWidget(Knm::Connection * connection, QWidget * parent)
+: SettingWidget(connection, parent), d_ptr(new VpncAuthWidgetPrivate)
+{
+    Q_D(VpncAuthWidget);
+    d->ui.setupUi(this);
+    d->setting = static_cast<Knm::VpnSetting *>(connection->setting(Knm::Setting::Vpn));
+}
+
+VpncAuthWidget::~VpncAuthWidget()
+{
+
+}
+
+#if 0
+void VpncAuthWidget::readConfig()
+{
+    Q_D(VpncAuthWidget);
+}
+#endif
+
+void VpncAuthWidget::readSecrets()
+{
+    Q_D(VpncAuthWidget);
+    QVariantMap secrets = d->setting->vpnSecrets();
+    QStringMap secretsType = d->setting->secretsStorageType();
+    QString userType;
+    QString groupType;
+
+    /*
+     * First time "old" settings are loaded secretsType map is empty, so
+     * try to read from data as fallback
+     */
+    userType = secretsType.value(NM_VPNC_KEY_XAUTH_PASSWORD_TYPE);
+    if (userType.isNull()) {
+        userType = d->setting->data().value(NM_VPNC_KEY_XAUTH_PASSWORD_TYPE);
+    }
+    if (userType == QLatin1String(NM_VPN_PW_TYPE_SAVE)) {
+        d->ui.leUserPassword->setText(secrets.value(QLatin1String(NM_VPNC_KEY_XAUTH_PASSWORD)).toString());
+        d->ui.leUserPassword->setEnabled(false);
+    }
+
+    groupType = secretsType.value(NM_VPNC_KEY_SECRET_TYPE);
+    if (userType.isNull()) {
+        groupType = d->setting->data().value(NM_VPNC_KEY_SECRET_TYPE);
+    }
+    if (groupType == QLatin1String(NM_VPN_PW_TYPE_SAVE)) {
+        d->ui.leGroupPassword->setText(secrets.value(QLatin1String(NM_VPNC_KEY_SECRET)).toString());
+        d->ui.leGroupPassword->setEnabled(false);
+    }
+}
+
+void VpncAuthWidget::writeConfig()
+{
+    Q_D(VpncAuthWidget);
+
+    QVariantMap secretData;
+
+    //   user password
+    if (!d->ui.leUserPassword->text().isEmpty()) {
+        secretData.insert(NM_VPNC_KEY_XAUTH_PASSWORD, d->ui.leUserPassword->text());
+    }
+    //   group password
+    if (!d->ui.leGroupPassword->text().isEmpty()) {
+        secretData.insert(NM_VPNC_KEY_SECRET, d->ui.leGroupPassword->text());
+    }
+
+    d->setting->setVpnSecrets(secretData);
+}
+
+// vim: sw=4 sts=4 et tw=100
diff --git a/vpnplugins/vpnc/vpncauth.h b/vpnplugins/vpnc/vpncauth.h
new file mode 100644
index 0000000..389b9c3
--- /dev/null
+++ b/vpnplugins/vpnc/vpncauth.h
@@ -0,0 +1,53 @@
+/*
+Copyright 2008 Will Stephenson <wstephenson@kde.org>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of
+the License or (at your option) version 3 or any later version
+accepted by the membership of KDE e.V. (or its successor approved
+by the membership of KDE e.V.), which shall act as a proxy
+defined in Section 14 of version 3 of the license.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef VPNCAUTH_H
+#define VPNCAUTH_H
+
+#include "settingwidget.h"
+
+#include "ui_vpncauth.h"
+#include "settings/vpn.h"
+
+namespace Knm
+{
+    class Connection;
+} // namespace Knm
+
+class VpncAuthWidgetPrivate;
+
+class VpncAuthWidget : public SettingWidget
+{
+Q_OBJECT
+Q_DECLARE_PRIVATE(VpncAuthWidget)
+public:
+    VpncAuthWidget(Knm::Connection *, QWidget * parent = 0);
+    ~VpncAuthWidget();
+    void readConfig() {};
+    void readSecrets();
+    void writeConfig();
+protected Q_SLOTS:
+    void validate() {};
+
+private:
+    VpncAuthWidgetPrivate * d_ptr;
+};
+
+#endif // VPNCAUTH_H
diff --git a/vpnplugins/vpnc/vpncauth.ui b/vpnplugins/vpnc/vpncauth.ui
index 2e89b20..bee07cb 100644
--- a/vpnplugins/vpnc/vpncauth.ui
+++ b/vpnplugins/vpnc/vpncauth.ui
@@ -1,94 +1,89 @@
-<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
-<class>VPNCAuthenticationWidget</class>
-<widget class="QWidget">
-    <property name="name">
-        <cstring>VPNCAuthenticationWidget</cstring>
-    </property>
-    <property name="geometry">
-        <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>372</width>
-            <height>171</height>
-        </rect>
-    </property>
-    <property name="caption">
-        <string>VPNCAuthentication</string>
-    </property>
-    <grid>
-        <property name="name">
-            <cstring>unnamed</cstring>
-        </property>
-        <property name="margin">
-            <number>0</number>
-        </property>
-        <widget class="QLabel" row="0" column="0">
-            <property name="name">
-                <cstring>textLabel1</cstring>
-            </property>
-            <property name="text">
-                <string>Password</string>
-            </property>
-        </widget>
-        <widget class="QLabel" row="1" column="0">
-            <property name="name">
-                <cstring>textLabel2</cstring>
-            </property>
-            <property name="text">
-                <string>Group Password</string>
-            </property>
-        </widget>
-        <spacer row="0" column="2">
-            <property name="name">
-                <cstring>spacer2</cstring>
-            </property>
-            <property name="orientation">
-                <enum>Horizontal</enum>
-            </property>
-            <property name="sizeType">
-                <enum>Expanding</enum>
-            </property>
-            <property name="sizeHint">
-                <size>
-                    <width>40</width>
-                    <height>20</height>
-                </size>
-            </property>
-        </spacer>
-        <spacer row="2" column="1">
-            <property name="name">
-                <cstring>spacer1</cstring>
-            </property>
-            <property name="orientation">
-                <enum>Vertical</enum>
-            </property>
-            <property name="sizeType">
-                <enum>Expanding</enum>
-            </property>
-            <property name="sizeHint">
-                <size>
-                    <width>20</width>
-                    <height>40</height>
-                </size>
-            </property>
-        </spacer>
-        <widget class="KPasswordEdit" row="0" column="1">
-            <property name="name">
-                <cstring>editUserPassword</cstring>
-            </property>
-        </widget>
-        <widget class="KPasswordEdit" row="1" column="1">
-            <property name="name">
-                <cstring>editGroupPassword</cstring>
-            </property>
-        </widget>
-    </grid>
-</widget>
-<customwidgets>
-</customwidgets>
-<layoutdefaults spacing="6" margin="11"/>
-<includehints>
-    
-    
-</includehints>
-</UI>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>VpncAuth</class>
+ <widget class="QWidget" name="VpncAuth">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>372</width>
+    <height>171</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>VPNCAuthentication</string>
+  </property>
+  <layout class="QGridLayout">
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QLabel" name="textLabel1">
+     <property name="text">
+      <string>User Password</string>
+     </property>
+     <property name="wordWrap">
+      <bool>false</bool>
+     </property>
+     <property name="buddy">
+      <cstring>leUserPassword</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="textLabel2">
+     <property name="text">
+      <string>Group Password</string>
+     </property>
+     <property name="wordWrap">
+      <bool>false</bool>
+     </property>
+     <property name="buddy">
+      <cstring>leGroupPassword</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="2">
+    <widget class="KLineEdit" name="leUserPassword">
+     <property name="passwordMode">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <spacer name="spacer1">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Expanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="1" column="2">
+    <widget class="KLineEdit" name="leGroupPassword">
+     <property name="passwordMode">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+  <customwidget>
+   <class>KLineEdit</class>
+   <extends>QLineEdit</extends>
+   <header>klineedit.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/vpnplugins/vpnc/vpncwidget.cpp b/vpnplugins/vpnc/vpncwidget.cpp
index bc9c48d..71c828b 100644
--- a/vpnplugins/vpnc/vpncwidget.cpp
+++ b/vpnplugins/vpnc/vpncwidget.cpp
@@ -116,12 +116,12 @@ void VpncSettingWidget::readConfig()
     }
 }
 
-void VpncSettingWidget::fillOnePasswordCombo(QComboBox * combo, const QString & key, const QStringMap & data, bool hasPassword)
+void VpncSettingWidget::fillOnePasswordCombo(QComboBox * combo, const QString & type, bool hasPassword)
 {
-    if (data.contains(key)) {
-        if (data.value(key) == NM_VPNC_PW_TYPE_SAVE) {
+    if (!type.isNull()) {
+        if (type == QLatin1String(NM_VPN_PW_TYPE_SAVE)) {
             combo->setCurrentIndex(1);
-        } else if (data.value(key) == NM_VPNC_PW_TYPE_UNUSED) {
+        } else if (type == QLatin1String(NM_VPN_PW_TYPE_UNUSED)) {
             combo->setCurrentIndex(2);
         }
     } else if (!hasPassword) {
@@ -138,6 +138,7 @@ void VpncSettingWidget::writeConfig()
 
     QStringMap data;
     QVariantMap secretData;
+    QStringMap secretsType;
 
     // General settings
     //   gateway
@@ -158,8 +159,8 @@ void VpncSettingWidget::writeConfig()
     if (!d->ui.leGroupPassword->text().isEmpty() && d->ui.cboGroupPassOptions->currentIndex() == 1) {
         secretData.insert(NM_VPNC_KEY_SECRET, d->ui.leGroupPassword->text());
     }
-    handleOnePasswordType(d->ui.cboUserPassOptions, NM_VPNC_KEY_XAUTH_PASSWORD_TYPE, data);
-    handleOnePasswordType(d->ui.cboGroupPassOptions, NM_VPNC_KEY_SECRET_TYPE, data);
+    handleOnePasswordType(d->ui.cboUserPassOptions, NM_VPNC_KEY_XAUTH_PASSWORD_TYPE, secretsType);
+    handleOnePasswordType(d->ui.cboGroupPassOptions, NM_VPNC_KEY_SECRET_TYPE, secretsType);
 
     // Optional settings
     //   username
@@ -207,6 +208,7 @@ void VpncSettingWidget::writeConfig()
 
     d->setting->setData(data);
     d->setting->setVpnSecrets(secretData);
+    d->setting->setSecretsStorageType(secretsType);
 }
 
 uint VpncSettingWidget::handleOnePasswordType(const QComboBox * combo, const QString & key, QStringMap & data)
@@ -214,13 +216,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,15 +232,31 @@ 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)) {
+    QStringMap secretsType = d->setting->secretsStorageType();
+    QString userType;
+    QString groupType;
+
+    /*
+     * First time "old" settings are loaded secretsType map is empty, so
+     * try to read from data as fallback
+     */
+    userType = secretsType.value(NM_VPNC_KEY_XAUTH_PASSWORD_TYPE);
+    if (userType.isNull()) {
+        userType = d->setting->data().value(NM_VPNC_KEY_XAUTH_PASSWORD_TYPE);
+    }
+    if (userType == 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());
+    fillOnePasswordCombo(d->ui.cboUserPassOptions, userType, !d->ui.leUserName->text().isEmpty());
 
-    if (d->setting->data().value(NM_VPNC_KEY_SECRET_TYPE) == QLatin1String(NM_VPNC_PW_TYPE_SAVE)) {
+    groupType = secretsType.value(NM_VPNC_KEY_SECRET_TYPE);
+    if (userType.isNull()) {
+        groupType = d->setting->data().value(NM_VPNC_KEY_SECRET_TYPE);
+    }
+    if (groupType == 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());
+    fillOnePasswordCombo(d->ui.cboGroupPassOptions, groupType, !d->ui.leGroupPassword->text().isEmpty());
 }
 
 void VpncSettingWidget::validate()
diff --git a/vpnplugins/vpnc/vpncwidget.h b/vpnplugins/vpnc/vpncwidget.h
index 49ca38e..568ccf5 100644
--- a/vpnplugins/vpnc/vpncwidget.h
+++ b/vpnplugins/vpnc/vpncwidget.h
@@ -24,6 +24,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "settingwidget.h"
 
 #include "ui_vpncprop.h"
+#include "ui_vpncauth.h"
 #include "settings/vpn.h"
 
 namespace Knm
@@ -48,7 +49,7 @@ protected Q_SLOTS:
     void groupPasswordTypeChanged(int);
     void validate();
 private:
-    void fillOnePasswordCombo(QComboBox * combo, const QString & key, const QStringMap & data, bool hasPassword);
+    void fillOnePasswordCombo(QComboBox * combo, const QString & type, bool hasPassword);
     uint handleOnePasswordType(const QComboBox * combo, const QString & key, QStringMap & data);
     VpncSettingWidgetPrivate * d_ptr;
 };