summaryrefslogtreecommitdiff
path: root/bzrlib/plugins/launchpad/account.py
diff options
context:
space:
mode:
Diffstat (limited to 'bzrlib/plugins/launchpad/account.py')
-rw-r--r--bzrlib/plugins/launchpad/account.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/bzrlib/plugins/launchpad/account.py b/bzrlib/plugins/launchpad/account.py
new file mode 100644
index 0000000..657b261
--- /dev/null
+++ b/bzrlib/plugins/launchpad/account.py
@@ -0,0 +1,113 @@
+# Copyright (C) 2007-2010 Canonical Ltd
+#
+# 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
+
+"""Functions to manage the user's Launchpad user ID.
+
+This allows the user to configure their Launchpad user ID once, rather
+than once for each place that needs to take it into account.
+"""
+
+from __future__ import absolute_import
+
+from bzrlib import (
+ errors,
+ trace,
+ transport,
+ )
+from bzrlib.config import AuthenticationConfig, GlobalStack
+from bzrlib.i18n import gettext
+
+LAUNCHPAD_BASE = 'https://launchpad.net/'
+
+
+class UnknownLaunchpadUsername(errors.BzrError):
+ _fmt = "The user name %(user)s is not registered on Launchpad."
+
+
+class NoRegisteredSSHKeys(errors.BzrError):
+ _fmt = "The user %(user)s has not registered any SSH keys with Launchpad.\n" \
+ "See <https://launchpad.net/people/+me>"
+
+
+class MismatchedUsernames(errors.BzrError):
+
+ _fmt = ('bazaar.conf and authentication.conf disagree about launchpad'
+ ' account name. Please re-run launchpad-login.')
+
+
+def get_lp_login(_config=None):
+ """Return the user's Launchpad username.
+
+ :raises: MismatchedUsername if authentication.conf and bazaar.conf
+ disagree about username.
+ """
+ if _config is None:
+ _config = GlobalStack()
+
+ username = _config.get('launchpad_username')
+ if username is not None:
+ auth = AuthenticationConfig()
+ auth_username = _get_auth_user(auth)
+ # Auto-upgrading
+ if auth_username is None:
+ trace.note(gettext('Setting ssh/sftp usernames for launchpad.net.'))
+ _set_auth_user(username, auth)
+ elif auth_username != username:
+ raise MismatchedUsernames()
+ return username
+
+
+def _set_global_option(username, _config=None):
+ if _config is None:
+ _config = GlobalStack()
+ _config.set('launchpad_username', username)
+
+
+def set_lp_login(username, _config=None):
+ """Set the user's Launchpad username"""
+ _set_global_option(username, _config)
+ _set_auth_user(username)
+
+
+def _get_auth_user(auth=None):
+ if auth is None:
+ auth = AuthenticationConfig()
+ username = auth.get_user('ssh', '.launchpad.net')
+ return username
+
+def _set_auth_user(username, auth=None):
+ if auth is None:
+ auth = AuthenticationConfig()
+ auth.set_credentials(
+ 'Launchpad', '.launchpad.net', username, 'ssh')
+
+
+def check_lp_login(username, _transport=None):
+ """Check whether the given Launchpad username is okay.
+
+ This will check for both existence and whether the user has
+ uploaded SSH keys.
+ """
+ if _transport is None:
+ _transport = transport.get_transport_from_url(LAUNCHPAD_BASE)
+
+ try:
+ data = _transport.get_bytes('~%s/+sshkeys' % username)
+ except errors.NoSuchFile:
+ raise UnknownLaunchpadUsername(user=username)
+
+ if not data:
+ raise NoRegisteredSSHKeys(user=username)