perl/keyring/kdewallet / experiments / kwallet_by_dbus.pl

#!/usr/bin/perl -w

# See http://stderr.org/doc/kde/HTML/en/kdelibs-apidocs/kwallet/html/classKWallet_1_1Wallet.html

use strict;
use Net::DBus;
use Data::Dumper;
use feature 'say';

my $APP_NAME = "DBUStest";
my $FOLDER_NAME = "DBUStestfolder";
my $KEY1 = "Some key";
my $KEY2 = "Yet another key";
my $PWD1 = "Very secret";
my $PWD2 = "Even more secret";
my $PWD3 = "Uuuuuuuu";

my $dbus = Net::DBus->session()
  or die("KWallet not available (can't access DBus)");
#print "dbus: ", Dumper($dbus);
say "DBus connected"; 

my $kwallet_svc = $dbus->get_service('org.kde.kwalletd')
  or die("KWallet not available (can't access KWallet, likely kwalletd not running)");
#print "kwalletd: ", Dumper($kwallet_svc);
say "org.kde.kwalletd connected";

my $kwallet = $kwallet_svc->get_object('/modules/kwalletd', 'org.kde.KWallet')
  or die("Kwallet not available (can't find wallet)");
#print "kwallet: ", Dumper($kwallet);
say "/modules/kwalletd connected";
# $kwallet = $kwallet->as_interface(...);

# This is text name
my $net_wallet = $kwallet->networkWallet()
  or die "No net wallet";
say "net_wallet id: $net_wallet";

my $handle = $kwallet->open($net_wallet, 0, $APP_NAME); # 0 - window id
$handle > 0 or die "No handle"; # decline means -1
say "Opened, handle = $handle";

sub report_value {
    my $value = shift;
    return $value if defined($value);
    return "(undef)";
}

{
    my $is_open = $kwallet->isOpen($handle);
    say "is open($handle): $is_open";
}

{
    my $folders = $kwallet->folderList($handle, $APP_NAME);
    say "Folders = ", join(", ", @$folders);
}

{
    unless($kwallet->hasFolder($handle, $FOLDER_NAME, $APP_NAME)) {
        say "Folder $FOLDER_NAME does not exists";
        $kwallet->createFolder($handle, $FOLDER_NAME, $APP_NAME) or die "Failed to create";
        say "Folder $FOLDER_NAME created";
    } else {
        say "Folder $FOLDER_NAME already exists";
    }
}

{
    my $password = $kwallet->readPassword($handle, $FOLDER_NAME, $KEY1, $APP_NAME);
    say "Read password for key $KEY1: ", report_value($password);
}

{
    my $sth = $kwallet->writePassword($handle, $FOLDER_NAME, $KEY1, $PWD1, $APP_NAME);
    say "Wrote password $PWD1 under key $KEY1, got $sth";
    # NOn-zero output seems to mean failure
}

{
    my $password = $kwallet->readPassword($handle, $FOLDER_NAME, $KEY1, $APP_NAME);
    say "Read password for key $KEY1: ", report_value($password);
}

{
    my $sth = $kwallet->writePassword($handle, $FOLDER_NAME, $KEY1, $PWD2, $APP_NAME);
    say "Wrote password $PWD2 for key $KEY1, got $sth";
}

{
    my $password = $kwallet->readPassword($handle, $FOLDER_NAME, $KEY1, $APP_NAME);
    say "Read password for key $KEY1: ", report_value($password);
}

{
    my $sth = $kwallet->writePassword($handle, $FOLDER_NAME, $KEY1, undef, $APP_NAME);
    say "Wrote undef password for key $KEY1, got $sth";
}

{
    my $password = $kwallet->readPassword($handle, $FOLDER_NAME, $KEY1, $APP_NAME);
    say "Read password for key $KEY1: ", report_value($password);
}


{
    $kwallet->removeFolder($handle, $FOLDER_NAME, $APP_NAME);
    say "Folder $FOLDER_NAME removed";
}

eval {
    my $sth = $kwallet->writePassword($handle, $FOLDER_NAME, $KEY2, $PWD3, $APP_NAME);
    say "Wrote password $PWD3 for key $KEY2 to non-existant folder, got $sth";
}; if($@) {
    say "Got error while writing password to non-existant folder: $@";
}

{
    my $password = $kwallet->readPassword($handle, $FOLDER_NAME, $KEY2, $APP_NAME);
    say "Read password for key $KEY2: ", report_value($password);
}

{
    my $sth = $kwallet->removeEntry($handle, $FOLDER_NAME, $KEY2, $APP_NAME);
    say "Cleared password for key $KEY2, got $sth";
}


{
    my $password = $kwallet->readPassword($handle, $FOLDER_NAME, $KEY2, $APP_NAME);
    say "Read (cleared) password for key $KEY2: ", report_value($password);
}

{
    my $sth = $kwallet->removeEntry($handle, $FOLDER_NAME, $KEY2, $APP_NAME);
    say "Cleared non-existing password for key $KEY2, got $sth";
}


{
    my $password = $kwallet->readPassword($handle, $FOLDER_NAME, $KEY2, $APP_NAME);
    say "Read (cleared) password for key $KEY2: ", report_value($password);
}


say "Spawn  kwalletmanager  to check what is going on";
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.