Development/Tutorials/KWallet

From KDE TechBase
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


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

#include "dialog.h"

#include <QLayout>
#include <QLabel>
#include <QPushButton>
#include <QMap>
#include <QVBoxLayout>
#include <QSpacerItem>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent)
{
    setLayout(new QVBoxLayout);
    m_wallet = Wallet::openWallet(Wallet::NetworkWallet(),
                                  winId(),
                                  Wallet::Asynchronous);

    QLabel *explanation = new QLabel("<b>HELLO!</b><br/>"
                                     "Please type in something to save in the wallet!<br/>"
                                     "It will be saved in the form data folder, under <br/>"
                                     "the entry <i>http://test.com/#form</i>.");
    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

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#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;
};

#endif // DIALOG_H

main.cpp

#include "dialog.h"

#include <KAboutData>
#include <KApplication>
#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})