Development/Tutorials/KWallet

From KDE TechBase
Revision as of 21:46, 21 June 2010 by Sandsmark (talk | contribs) (remember code tags)


Development/Tutorials/KWallet


Abstract

A simple introduction for using the KWallet API, a secure storage framework.

Prerequisites: Basic KDE knowledge, C++.

Example

The API is fun and easy to use, and will guarantee you a long and stable life.

In KWallet, entries are organized in Folders (or think of it as categories), and in them there are binary data, maps, passwords and a catch-all unknown. Binary entries are application-specific arrays of bytes, maps should be known from QMaps, where a series of values are accessed by keys. Passwords are simply strings, and Unknown is for everything else.

dialog.cpp

  1. include "dialog.h"
  1. include <QLayout>
  2. include <QLabel>
  3. include <QPushButton>
  4. include <QMap>
  5. include <QVBoxLayout>
  6. include <QSpacerItem>

Dialog::Dialog(QWidget *parent) :

   QDialog(parent)

{

   setLayout(new QVBoxLayout);
   m_wallet = Wallet::openWallet(Wallet::NetworkWallet(),
                                 winId(),
                                 Wallet::Asynchronous);
   QLabel *explanation = new QLabel("HELLO!
" "Please type in something to save in the wallet!
" "It will be saved in the form data folder, under
" "the entry http://test.com/#form."); m_statusLabel = new QLabel("Opening wallet...", this); m_statusLabel->setAlignment(Qt::AlignCenter); m_keyInput = new QLineEdit(this); m_valueInput = new QLineEdit(this); m_launchButton = new QPushButton("Save!", this); m_launchButton->setDisabled(true);
   layout()->addWidget(explanation);
   qobject_cast<QVBoxLayout*>(layout())->addStretch();
   layout()->addWidget(m_statusLabel);
   layout()->addWidget(new QLabel("Key:", this));
   layout()->addWidget(m_keyInput);
   layout()->addWidget(new QLabel("Value:", this));
   layout()->addWidget(m_valueInput);
   layout()->addWidget(m_launchButton);
   connect(m_launchButton, SIGNAL(clicked()), SLOT(doSave()));
   connect(m_wallet, SIGNAL(walletOpened(bool)), SLOT(walletOpened(bool)));
   setMinimumSize(500, 200);

}

void Dialog::walletOpened(bool ok) {

   if (ok &&
       (m_wallet->hasFolder(KWallet::Wallet::FormDataFolder()) ||
       m_wallet->createFolder(KWallet::Wallet::FormDataFolder())) &&
       m_wallet->setFolder(KWallet::Wallet::FormDataFolder())) {
       m_launchButton->setDisabled(false);
       m_statusLabel->setText("Idle.");
   } else
       m_statusLabel->setText("Error opening wallet!");

}

void Dialog::doSave() {

   if (m_keyInput->text().isEmpty() || m_valueInput->text().isEmpty()) {
       m_statusLabel->setText("Empty field!");
       return;
   }
   m_launchButton->setDisabled(true);
   m_statusLabel->setText("Saving ...");
   QMap<QString, QString> map;
   map[m_keyInput->text()] = m_valueInput->text();
   if (m_wallet->writeMap("http://test.com/#form", map)) m_statusLabel->setText("Something went wrong!");
   else {
       m_statusLabel->setText("Saved!");
       m_keyInput->clear();
       m_valueInput->clear();
   }
   m_launchButton->setDisabled(false);

}

dialog.h

  1. ifndef DIALOG_H
  2. define DIALOG_H
  1. include <QDialog>
  2. include <QLabel>
  3. include <QLineEdit>
  4. include <KWallet/Wallet>

using KWallet::Wallet;

class Dialog : public QDialog { Q_OBJECT public:

   Dialog(QWidget *parent = 0);

private slots:

   void doSave();
   void walletOpened(bool ok);

private:

   Wallet *m_wallet;
   QLineEdit *m_keyInput;
   QLineEdit *m_valueInput;
   QLabel *m_statusLabel;
   QPushButton *m_launchButton;

};

  1. endif // DIALOG_H

main.cpp

  1. include "dialog.h"
  1. include <KAboutData>
  2. include <KApplication>
  3. include <KCmdLineArgs>

static KAboutData about(

   "KWalletDemoApplication",
   "",
   ki18n("KWalletDemoApplication"),
   "1.0",
   ki18n("Demonstrates basic KWallet usage."),
   KAboutData::License_LGPL,
   ki18n("(C) 2010 Martin Sandsmark"),
   KLocalizedString(),
   "http://www.mts.ms/");

int main(int argc, char *argv[]) {

   about.addAuthor(ki18n("Martin Sandsmark"), ki18n("Maintainer"), "[email protected]", "http://iskrembilen.com/");
   KCmdLineArgs::init(argc, argv, &about);
   KApplication app;
   Dialog dialog;
   dialog.show();
   return app.exec();

}

CMakeLists.txt

project(Importer)

find_package(KDE4 REQUIRED) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) include(KDE4Defaults) include(MacroLibrary) include_directories(${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES})

set(SRCS main.cpp dialog.cpp)

kde4_add_executable(kwallet-demo ${SRCS}) target_link_libraries(kwallet-demo ${KDE4_KDECORE_LIBS} ${KDE4_KPARTS_LIBS} ${KDE4_KDEUI_LIBS}) install(TARGETS kwallet-demo ${INSTALL_TARGETS_DEFAULT_ARGS})