1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# Copyright 2009 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""OpenID adapters and helpers."""
__metaclass__ = type
__all__ = [
'CurrentOpenIDEndPoint',
'OpenIDPersistentIdentity',
]
from zope.component import (
adapter,
adapts,
)
from zope.interface import (
implementer,
implements,
)
from zope.security.proxy import removeSecurityProxy
from canonical.launchpad.interfaces.account import IAccount
from canonical.launchpad.interfaces.lpstorm import IStore
from canonical.launchpad.webapp.vhosts import allvhosts
from lp.registry.interfaces.person import IPerson
from lp.services.openid.interfaces.openid import IOpenIDPersistentIdentity
from lp.services.openid.model.openididentifier import OpenIdIdentifier
class CurrentOpenIDEndPoint:
"""A utility for working with multiple OpenID End Points."""
@classmethod
def getServiceURL(cls):
"""The OpenID server URL (/+openid) for the current request."""
return allvhosts.configs['openid'].rooturl + '+openid'
@classmethod
def supportsURL(cls, identity_url):
"""Does the OpenID current vhost support the identity_url?"""
root_url = allvhosts.configs['openid'].rooturl
return identity_url.startswith(root_url + '+id')
class OpenIDPersistentIdentity:
"""A persistent OpenID identifier for a user."""
adapts(IAccount)
implements(IOpenIDPersistentIdentity)
def __init__(self, account):
self.account = account
@property
def openid_identity_url(self):
"""See `IOpenIDPersistentIdentity`."""
openid_identifier = self.openid_identifier
if openid_identifier is None:
return None
identity_root_url = allvhosts.configs['openid'].rooturl
return identity_root_url + openid_identifier.encode('ascii')
@property
def openid_identifier(self):
"""See `IOpenIDPersistentIdentity`."""
# We might have multiple OpenID identifiers linked to an
# account. We just use the first one which is good enough
# for our purposes.
identifier = IStore(OpenIdIdentifier).find(
OpenIdIdentifier, account=self.account).order_by(
OpenIdIdentifier.date_created).first()
if identifier is None:
return None
else:
return '+id/' + identifier.identifier
@adapter(IPerson)
@implementer(IOpenIDPersistentIdentity)
def person_to_openidpersistentidentity(person):
"""Adapts an `IPerson` into an `IOpenIDPersistentIdentity`."""
return OpenIDPersistentIdentity(person.account)
|