summaryrefslogtreecommitdiffstats
path: root/src/ksshaskpass.cpp
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2021-08-26 02:36:35 +0200
committerSlávek Banko <slavek.banko@axis.cz>2021-08-26 02:36:35 +0200
commit2c7714e6a1ccc5fdcfc2e1833d6c54135cdffb07 (patch)
tree28c9f93ea62372c472e2eac0cf2e1898d1a871c4 /src/ksshaskpass.cpp
downloadtdesshaskpass-2c7714e6a1ccc5fdcfc2e1833d6c54135cdffb07.tar.gz
tdesshaskpass-2c7714e6a1ccc5fdcfc2e1833d6c54135cdffb07.zip
Initial import of ksshaskpass 0.4.1.
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
Diffstat (limited to 'src/ksshaskpass.cpp')
-rw-r--r--src/ksshaskpass.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/ksshaskpass.cpp b/src/ksshaskpass.cpp
new file mode 100644
index 0000000..0822283
--- /dev/null
+++ b/src/ksshaskpass.cpp
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2006 Hans van Leeuwen <hanz@hanz.nl>
+ * Copyright (C) 2008 Armin Berres <trigger@space-based.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include <iostream>
+#include <kwallet.h>
+#include <kpassdlg.h>
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+static KCmdLineOptions options[] =
+{
+ { "+[dialog]", I18N_NOOP( "Dialog message. Leave undefined for default message" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+
+ KAboutData about (
+ "Ksshaskpass", // appName
+ I18N_NOOP("Ksshaskpass"), // programName
+ "0.4.1", // version
+ I18N_NOOP("KDE version of ssh-askpass"), // shortDescription
+ KAboutData::License_GPL, // licenseType
+ "(c) 2006 Hans van Leeuwen\n(c) 2008 Armin Berres", // copyrightStatement statement
+ I18N_NOOP("Ksshaskpass allows you to interactively prompt users for a passphrase for ssh-add"), // text
+ "http://www.kde-apps.org/content/edit.php?content=50971", // homePageAddress
+ "trigger@space-based.de" // bugsEmailAddress
+ );
+ about.addAuthor("Armin Berres", 0, "trigger@space-based.de");
+ about.addAuthor("Hans van Leeuwen", 0, "hanz@hanz.nl");
+
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ KApplication app;
+
+
+ // Disable Session Management and DCOP. We don't need it.
+ app.disableSessionManagement();
+ app.disableAutoDcopRegistration();
+
+
+ // Declare variables
+ QString walletFolder = about.appName();
+ QString dialog = I18N_NOOP("Please enter password"); // Default dialog text
+ QString keyFile;
+ QCString password;
+
+
+ // Parse commandline arguments
+ if ( args->count() > 0 ) {
+ dialog = args->arg(0);
+ keyFile = dialog.section(" ", -2).remove(":");
+ }
+ args->clear();
+
+
+ // Open KWallet to see if a password was previously stored.
+ KWallet::Wallet *wallet = KWallet::Wallet::openWallet( KWallet::Wallet::NetworkWallet(), 0 );
+
+ if ( wallet && wallet->hasFolder(walletFolder) ) {
+ wallet->setFolder(walletFolder);
+
+ QString retrievedPass;
+
+ wallet->readPassword(keyFile, retrievedPass);
+
+ if ( retrievedPass ) {
+ password = retrievedPass;
+ }
+ }
+
+
+ // Password could not be retrieved from wallet. Open password dialog
+ if ( !password ) {
+ // create the password dialog, but only show "Enable Keep" button, if the wallet is opened
+ KPasswordDialog *kpd = new KPasswordDialog(KPasswordDialog::Password, wallet, 0);
+ kpd->setPrompt(dialog);
+ kpd->setCaption(i18n("Ksshaskpass"));
+ kpd->setAllowEmptyPasswords(false);
+ // We don't want to dump core when the password dialog is shown, because it could contain the entered password.
+ kpd->disableCoreDumps();
+
+ if ( kpd->exec() == KDialog::Accepted ) {
+ password = kpd->password();
+ }
+
+ // If "Enable Keep" is enabled, open/create a folder in KWallet and store the password.
+ if ( password && wallet && kpd->keep() ) {
+ if ( !wallet->hasFolder( walletFolder ) ) {
+ wallet->createFolder(walletFolder);
+ }
+ wallet->setFolder(walletFolder);
+ wallet->writePassword(keyFile, password);
+ }
+
+ delete kpd;
+ }
+
+ // Close the wallet if it is opened.
+ if (wallet) {
+ KWallet::Wallet::closeWallet( KWallet::Wallet::NetworkWallet(), false );
+ }
+
+ // Finally return the password if one has been entered
+ if (password) {
+ std::cout << password;
+ return 0;
+ } else {
+ return 1;
+ }
+}