Development/Tutorials/KWallet

    From KDE TechBase
    Warning
    This page needs a review and probably holds information that needs to be fixed.

    Parts to be reviewed:

    • Port to KF5
    • Improve content

    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})