From: "Lukas Sandström" <luksan@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: "Lukas Sandström" <luksan@gmail.com>, "Jeff King" <peff@peff.net>
Subject: [PATCH] Add a credential-helper for KDE
Date: Sat, 27 Aug 2011 21:54:02 +0200 [thread overview]
Message-ID: <4E594B5A.6070902@gmail.com> (raw)
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@gmail.com>
---
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@gmail.com"
+
+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
next reply other threads:[~2011-08-27 19:54 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-27 19:54 Lukas Sandström [this message]
2011-08-31 1:42 ` [PATCH] Add a credential-helper for KDE Jeff King
2011-09-18 14:52 ` [PATCH v2] " Lukas Sandström
2011-09-18 18:49 ` Jeff King
2011-09-30 10:21 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E594B5A.6070902@gmail.com \
--to=luksan@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).