[kde-doc-english] [kwallet] /: Support for reading every folder in the wallet.
Andrea Scarpino
scarpino at kde.org
Sun Jun 14 07:01:15 UTC 2015
Git commit 9ce3f9ce184332cfe46d6fbf543a8f2aa4de30ec by Andrea Scarpino.
Committed on 13/06/2015 at 09:11.
Pushed by vrusu into branch 'master'.
Support for reading every folder in the wallet.
A new -f, --folder option is provided to set the folder name, by
default "Passwords" is used.
Some folder stores map entries instead of passwords,
this required a new method to read and display maps.
M +20 -10 doc/man-kwallet-query.1.docbook
M +5 -0 src/main.cpp
M +46 -16 src/querydriver.cpp
M +5 -1 src/querydriver.h
http://commits.kde.org/kwallet-framework/9ce3f9ce184332cfe46d6fbf543a8f2aa4de30ec
diff --git a/doc/man-kwallet-query.1.docbook b/doc/man-kwallet-query.1.docbook
index 9cddd13..3b70926 100644
--- a/doc/man-kwallet-query.1.docbook
+++ b/doc/man-kwallet-query.1.docbook
@@ -21,11 +21,11 @@
</refsynopsisdiv>
<refsect1 id="_description">
<title>DESCRIPTION</title>
-<simpara>kwallet-query comes in handy when shell scripts need to read or update the KDE
-Wallet. It works by manipulating the entries under the <emphasis role="strong">Passwords</emphasis> section, as
-displayed in the <emphasis role="strong">KDE Wallet Manager</emphasis> utility. It’s only parameter is the
-<emphasis>wallet</emphasis> name the tool should read or update. The operation mode is specified
-by the options.</simpara>
+<simpara>
+ kwallet-query comes in handy when shell scripts need to read or update the KDE Wallet. It works by manipulating the entries
+ displayed in the <emphasis role="strong">KDE Wallet Manager</emphasis> utility. It’s only parameter is the
+ <emphasis>wallet</emphasis> name the tool should read or update. The operation mode is specified by the options.
+</simpara>
</refsect1>
<refsect1 id="_options">
<title>OPTIONS</title>
@@ -46,8 +46,8 @@ by the options.</simpara>
</term>
<listitem>
<simpara>
- List password entries. These are the folder names under the <emphasis role="strong">Passwords</emphasis>
- section when the <emphasis>wallet</emphasis> is displayed in the <emphasis role="strong">KDE Wallet Manager</emphasis> utility.
+ List password entries. These are the folder names displayed in the <emphasis role="strong">KDE Wallet Manager</emphasis>
+ utility.
</simpara>
</listitem>
</varlistentry>
@@ -57,7 +57,7 @@ by the options.</simpara>
</term>
<listitem>
<simpara>
- Read the contents of the given <emphasis>Entry</emphasis> from the <emphasis role="strong">Passwords</emphasis> section of the
+ Read the contents of the given <emphasis>Entry</emphasis> from the <emphasis role="strong">Folder</emphasis> section of the
<emphasis>wallet</emphasis> and output it on the standard output.
</simpara>
</listitem>
@@ -68,7 +68,7 @@ by the options.</simpara>
</term>
<listitem>
<simpara>
- Write secrets to the given <emphasis>Entry</emphasis> under the <emphasis role="strong">Passwords</emphasis> section of the given
+ Write secrets to the given <emphasis>Entry</emphasis> under the <emphasis role="strong">Folder</emphasis> section of the given
<emphasis>wallet</emphasis>. The secrets are read from the standard input.
<emphasis role="strong">IMPORTANT</emphasis> previous wallet entry value will be overwritten by this option, so
be careful when using it!
@@ -77,6 +77,16 @@ by the options.</simpara>
</varlistentry>
<varlistentry>
<term>
+<emphasis role="strong">-f,--folder</emphasis> <emphasis>Folder</emphasis>
+</term>
+<listitem>
+<simpara>
+ Set the <emphasis>wallet</emphasis> folder to <emphasis>Folder</emphasis> value. By default <emphasis role="strong">Passwords</emphasis> is used.
+</simpara>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>
<emphasis role="strong">-v,--verbose</emphasis>
</term>
<listitem>
@@ -127,7 +137,7 @@ by the options.</simpara>
</term>
<listitem>
<simpara>
- The <emphasis role="strong">Passwords</emphasis> section was not found inside the wallet <emphasis>wallet</emphasis>. Perhaps the
+ The <emphasis role="strong">Folder</emphasis> section was not found inside the wallet <emphasis>wallet</emphasis>. Perhaps the
wallet file is corrupt?
</simpara>
</listitem>
diff --git a/src/main.cpp b/src/main.cpp
index 34beb73..b37c944 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -47,12 +47,14 @@ int main(int argc, char* argv[]) {
QCommandLineOption listOption(QStringList() << "l" << "list-entries", i18n("list password entries"));
QCommandLineOption readOption(QStringList() << "r" << "read-password", i18n("reads the secrets from the given <entry>"), i18n("Entry"));
QCommandLineOption writeOption(QStringList() << "w" << "write-password", i18n("write secrets to the given <entry>. The values are read from the standard input. IMPORTANT: previous wallet entry value will be overwritten!"), i18n("Entry"));
+ QCommandLineOption folderOption(QStringList() << "f" << "folder", i18n("specify the folder in the wallet <folder>"), i18n("Folder"));
cmdParser.addHelpOption();
cmdParser.addPositionalArgument(I18N_NOOP("wallet"), i18n("The wallet to query"));
cmdParser.addOption(listOption);
cmdParser.addOption(readOption);
cmdParser.addOption(writeOption);
+ cmdParser.addOption(folderOption);
cmdParser.addOption(verboseOption);
cmdParser.process(app);
@@ -89,6 +91,9 @@ int main(int argc, char* argv[]) {
app.setEntryName(cmdParser.value(writeOption));
app.setMode(QueryDriver::Write);
}
+ if (cmdParser.isSet(folderOption)) {
+ app.setEntryFolder(cmdParser.value(folderOption));
+ }
if (cmdParser.isSet(verboseOption)) {
app.setVerbose();
}
diff --git a/src/querydriver.cpp b/src/querydriver.cpp
index e7282d4..1635a21 100644
--- a/src/querydriver.cpp
+++ b/src/querydriver.cpp
@@ -34,6 +34,7 @@ QueryDriver::QueryDriver(int &argc, char* argv[]) :
QApplication(argc, argv)
, theWallet(0)
, verbose(false)
+ , entryFolder("Passwords")
{
QTimerEvent *timerEvent = new QTimerEvent(100);
postEvent(this, timerEvent);
@@ -78,10 +79,10 @@ void QueryDriver::walletOpened(bool success) {
} else {
switch (mode) {
case List:
- readPasswordEntries();
+ readEntries();
break;
case Read:
- readPasswordValue();
+ readValue();
break;
case Write:
writePasswordValue();
@@ -92,26 +93,49 @@ void QueryDriver::walletOpened(bool success) {
}
}
-void QueryDriver::readPasswordEntries() {
+void QueryDriver::readEntries() {
theWallet = Wallet::openWallet(walletName, 0);
auto fl = theWallet->folderList();
- if (fl.indexOf("Passwords") == -1) {
- std::cout << i18n("'Passwords' folder not found").toStdString() << std::endl;
- exit(3);
+ for (auto f: fl) {
+ std::cout << f.toStdString() << std::endl;
+ theWallet->setFolder(f);
+ auto el = theWallet->entryList();
+ for (auto e: el) {
+ std::cout << "\t" << e.toStdString() << std::endl;
+ }
}
- theWallet->setFolder("Passwords");
- auto el = theWallet->entryList();
- for (auto e: el) {
- if (theWallet->entryType(e) == Wallet::Password)
- std::cout << e.toStdString() << std::endl;
+ quit();
+}
+
+void QueryDriver::readValue() {
+ if (verbose) qDebug() << "reading" << entryName << "from" << entryFolder << "from" << walletName;
+ theWallet->setFolder(entryFolder);
+ Wallet::EntryType kind = theWallet->entryType(entryName);
+ if (kind == Wallet::Password) {
+ readPasswordValue();
+ } else if (kind == Wallet::Map) {
+ readMapValue();
+ } else {
+ std::cout << i18n("Failed to read entry %1 value from the %2 wallet.", entryName, walletName).toStdString() << std::endl;
+ exit(4);
}
quit();
}
+void QueryDriver::readMapValue() {
+ QMap<QString, QString> map;
+ int rc = theWallet->readMap(entryName, map);
+ if (rc != 0) {
+ std::cout << i18n("Failed to read entry %1 value from the %2 wallet", entryName, walletName).toStdString() << std::endl;
+ exit(4);
+ }
+ for (auto e : map.keys()) {
+ std::cout << e.toStdString() << ": " << map.value(e).toStdString() << std::endl;
+ }
+}
+
void QueryDriver::readPasswordValue() {
- if (verbose) qDebug() << "reading " << entryName << " from " << walletName;
QString entryValue;
- theWallet->setFolder("Passwords");
int rc = theWallet->readPassword(entryName, entryValue);
if (rc != 0) {
std::cout << i18n("Failed to read entry %1 value from the %2 wallet", entryName, walletName).toStdString() << std::endl;
@@ -121,12 +145,18 @@ void QueryDriver::readPasswordValue() {
for (auto e : el) {
std::cout << e.toStdString() << std::endl;
}
- quit();
}
void QueryDriver::writePasswordValue() {
- if (verbose) qDebug() << "writing " << entryName << " to " << walletName;
- theWallet->setFolder("Passwords");
+ if (verbose) qDebug() << "writing" << entryName << "to" << entryFolder << "to" << walletName;
+ theWallet->setFolder(entryFolder);
+
+ Wallet::EntryType kind = theWallet->entryType(entryName);
+ if (kind != Wallet::Password) {
+ std::cout << i18n("You can only write password values. Maps are not supported.").toStdString() << std::endl;
+ exit(4);
+ }
+
QString passwordContents;
for (std::string line; std::getline(std::cin, line); ) {
if (!passwordContents.isEmpty()) passwordContents += '\n';
diff --git a/src/querydriver.h b/src/querydriver.h
index 83b4d0d..3f502b2 100644
--- a/src/querydriver.h
+++ b/src/querydriver.h
@@ -42,10 +42,13 @@ public:
void setMode(Mode mode);
void setVerbose() { verbose = true; }
void setEntryName(const QString& entryName) { this->entryName = entryName; }
+ void setEntryFolder(const QString& entryFolder) { this->entryFolder = entryFolder; }
private:
virtual void timerEvent(QTimerEvent* event);
- void readPasswordEntries();
+ void readEntries();
+ void readValue();
+ void readMapValue();
void readPasswordValue();
void writePasswordValue();
@@ -58,5 +61,6 @@ public:
Mode mode;
bool verbose;
QString entryName;
+ QString entryFolder;
};
More information about the kde-doc-english
mailing list