You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesshaskpass/src/ksshaskpass.cpp

134 lines
4.5 KiB

/*
* 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
TQString walletFolder = about.appName();
TQString dialog = I18N_NOOP("Please enter password"); // Default dialog text
TQString keyFile;
TQCString 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);
TQString 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;
}
}