diff --git a/mercurial_keyring.py b/mercurial_keyring.py --- a/mercurial_keyring.py +++ b/mercurial_keyring.py @@ -32,12 +32,47 @@ from urlparse import urlparse KEYRING_SERVICE = "Mercurial" +############################################################ + +def monkeypatch_class(name, bases, namespace): + """http://mail.python.org/pipermail/python-dev/2008-January/076194.html""" + assert len(bases) == 1, "Exactly one base class required" + base = bases[0] + for name, value in namespace.iteritems(): + if name != "__metaclass__": + setattr(base, name, value) + return base + def monkeypatch_method(cls): def decorator(func): setattr(cls, func.__name__, func) return func return decorator +############################################################ + +class PasswordStore(object): + """ + Helper object handling password save&restore. Passwords + are saved both in local memory cache, and keyring, and are + restored from those. + """ + def __init__(self): + self.cache = dict() + def save_password(self, url, username, password): + self.cache[url] = (username, password) + # TODO: keyring save + def get_password(self, url): + r = self.cache.get(url) + if r: + return r + # TODO: keyring restore + return None, None + +password_store = PasswordStore() + +############################################################ + @monkeypatch_method(passwordmgr) def find_user_password(self, realm, authuri): """ @@ -52,23 +87,19 @@ def find_user_password(self, realm, auth base_url = "%s://%s%s" % (parsed_url.scheme, parsed_url.netloc, parsed_url.path) print "find_user_password", realm, base_url - - # TODO: odczyt danych z cache w procesie - - # TODO: odczyt danych już obecnych w keyring-u + user, pwd = password_store.get_password(base_url) + if user and pwd: + return user, pwd if not self.ui.interactive(): raise util.Abort(_('mercurial_keyring: http authorization required')) self.ui.write(_("http authorization required\n")) self.ui.status(_("realm: %s, url: %s\n" % (realm, base_url))) - username = self.ui.prompt(_("user:"), default = None) - password = self.ui.getpass(_("password for user %s:" % username)) - - # TODO: zapis w keyringu + user = self.ui.prompt(_("user:"), default = user) + pwd = self.ui.getpass(_("password: ")) - # TODO: zapis w cache w procesie - + password_store.save_password(base_url, user, pwd) - return username, password + return user, pwd #return None, None - +