This Python script plugs into the credentials API of Git to ask the user for passwords with a nice KDE password dialog. The password is saved in the KWallet. Signed-off-by: Lukas Sandström <luksan@xxxxxxxxx> --- Here is a credentials-helper for KDE. You need to have PyKDE installed to use it. See Documentation/gitcredentials.txt for more info. .../git-kde-credentials-helper.py | 122 ++++++++++++++++++++ 1 files changed, 122 insertions(+), 0 deletions(-) create mode 100755 contrib/kde-credetials-helper/git-kde-credentials-helper.py diff --git a/contrib/kde-credetials-helper/git-kde-credentials-helper.py b/contrib/kde-credetials-helper/git-kde-credentials-helper.py new file mode 100755 index 0000000..8d3be4d --- /dev/null +++ b/contrib/kde-credetials-helper/git-kde-credentials-helper.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# encoding=utf-8 +# +# Copyright 2011, Lukas Sandström +# +# Licensed under the GPL version 2. + +import sys, commands +from PyQt4.QtCore import QString +from PyKDE4.kdecore import i18n, ki18n, KAboutData, KCmdLineArgs, KCmdLineOptions +from PyKDE4.kdeui import KApplication, KWallet, KPasswordDialog + +appName = "git-kde-credentials-helper" +catalog = "" +programName = ki18n ("Git KDE credentials helper") +version = "0.1" +description = ki18n ("Credentials storage helper for Git") +license = KAboutData.License_GPL_V2 +copyright = ki18n ("(c) 2011 Lukas Sandström") +text = ki18n ("none") +homePage = "http://www.git-scm.com" +bugEmail = "luksan@xxxxxxxxx" + +aboutData = KAboutData (appName, catalog, programName, version, description, + license, copyright, text, homePage, bugEmail) + +class CredentialHelper(KApplication): + def __init__(self, token, username = None, desc = None, reject = False): + super(CredentialHelper, self).__init__() + self.password = None + self.username = username + self.save_password = False + self.token = token + self.desc = desc + + if not self.token: + return + + self.open_wallet() + + if reject: + self.wallet.removeEntry(QString(token)) + return + + if not self.check_wallet(): + self.ask_password_dialog() + + if self.save_password: + self.store_password() + + self.output_credentials() + + def output_credentials(self): + if self.username: + print "username=" + self.username + if self.password: + print "password=" + self.password + + def store_password(self): + self.wallet.writeMap(QString(self.token), + {QString("username") : QString(self.username), + QString("password") : QString(self.password)}) + + def open_wallet(self): + self.wallet = KWallet.Wallet.openWallet( + KWallet.Wallet.LocalWallet(), 0, KWallet.Wallet.Synchronous) + if not self.wallet.isOpen(): + return None + if not self.wallet.hasFolder("GitCredentials"): + self.wallet.createFolder("GitCredentials") + self.wallet.setFolder("GitCredentials") + + def check_wallet(self): + (res, data) = self.wallet.readMap(self.token) + if res != 0: + return None + try: + self.username = data[QString("username")] + self.password = data[QString("password")] + except KeyError: + return None + return self.username and self.password + + def ask_password_dialog(self): + dlg = KPasswordDialog(None, + KPasswordDialog.KPasswordDialogFlag( + KPasswordDialog.ShowKeepPassword | + KPasswordDialog.ShowUsernameLine)) + if self.desc: + desc = self.desc + else: + desc = self.token + dlg.setPrompt(i18n("Please enter username and password for %s" % (desc))) + dlg.setUsername(self.username) + dlg.setKeepPassword(True) + if not dlg.exec_(): + return + self.username = dlg.username() + self.password = dlg.password() + self.save_password = dlg.keepPassword() + +def main(): + KCmdLineArgs.init(sys.argv, aboutData) + + options = KCmdLineOptions() + options.add("unique <token>", ki18n("Unique token identifying the credential")) + options.add("description <desc>", ki18n("Human readable description of the credential")) + options.add("username <username>", ki18n("Requested username")) + options.add("reject", ki18n("Purge credential")) + + KCmdLineArgs.addCmdLineOptions(options) + args = KCmdLineArgs.parsedArgs(); + + username = args.getOption("username") + token = args.getOption("unique") + desc = args.getOption("description") + reject = args.isSet("reject") + + app = CredentialHelper(token, username, desc, reject) + +if __name__ == "__main__": + main() -- 1.7.6.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html