92 lines
3.4 KiB
Python
Executable File
92 lines
3.4 KiB
Python
Executable File
#!/usr/bin/python
|
|
#
|
|
# Simple authentication against launchpad and group membership checking.
|
|
# Feel free to use, modify and distribute as you see fit.
|
|
# (c) 2006 Dennis Kaarsemaker <dennis@kaarsemaker.net>
|
|
|
|
import urllib,urllib2
|
|
import xml.dom.minidom as dom
|
|
import sha, re
|
|
|
|
_login_url = 'https://launchpad.net/+login'
|
|
_login_data = 'loginpage_email=%s&loginpage_password=%s&loginpage_submit_login=Log%%20In'
|
|
_login_re = re.compile('logged in as.*?a href=".*?/people/(.*?)"', re.DOTALL)
|
|
_urlopener = urllib2.build_opener(urllib2.HTTPCookieProcessor(), urllib2.HTTPRedirectHandler())
|
|
|
|
class LaunchpadException(Exception):
|
|
pass
|
|
|
|
class LaunchpadPerson:
|
|
def __init__(self, email = None, password = None, nick = None):
|
|
self.authenticated = False
|
|
if email and password:
|
|
self.email = email
|
|
_nick = self._login(password)
|
|
if _nick:
|
|
self.authenticated = True
|
|
nick = _nick
|
|
if nick:
|
|
self.get_data(nick)
|
|
|
|
def get_data(self, nick):
|
|
self.nick = nick
|
|
try:
|
|
u = urllib2.urlopen('http://launchpad.net/people/%s/+rdf' % urllib.quote(nick))
|
|
rdf = u.read()
|
|
rdf = dom.parseString(rdf)
|
|
except:
|
|
raise
|
|
raise LaunchpadException('Could not parse launchpad data')
|
|
self.mail_shasums = map(lambda x: x.childNodes[0].data.lower(), rdf.getElementsByTagName('foaf:mbox_sha1sum'))
|
|
self.name = rdf.getElementsByTagName('foaf:name')[0].childNodes[0].data
|
|
try:
|
|
self.img = rdf.getElementsByTagName('foaf:img')[0].getAttribute('rdf:resource')
|
|
except: # No image
|
|
self.img = None
|
|
try:
|
|
self.key = rdf.getElementsByTagName('wot:fingerprint')[0].childNodes[0].data
|
|
except: # No image
|
|
self.key = None
|
|
|
|
def check_group_membership(self, group):
|
|
try:
|
|
self.mail_shasums
|
|
except AttributeError:
|
|
raise LaunchpadException("Person not logged in and launchpad username not known")
|
|
try:
|
|
fd = urllib2.urlopen('http://launchpad.net/people/%s/+rdf' % urllib.quote(group))
|
|
rdf = fd.read()
|
|
rdf = dom.parseString(rdf)
|
|
except:
|
|
raise LaunchpadException('Could not parse launchpad data')
|
|
group_mail_shasums = map(lambda x: x.childNodes[0].data.lower(), rdf.getElementsByTagName('foaf:mbox_sha1sum'))
|
|
# If the intersection of shasums and shasums2 is not empty, the persons
|
|
# prefered mail address is in the group.
|
|
return len([x for x in self.mail_shasums if x in group_mail_shasums]) > 0
|
|
|
|
def _login(self, pw):
|
|
req = urllib2.Request(_login_url, _login_data % (urllib.quote(self.email),urllib.quote(pw)))
|
|
try:
|
|
fd = _urlopener.open(req)
|
|
data = fd.read().lower()
|
|
except: # Launchpad offline perhaps...
|
|
raise LaunchpadException('Could not parse launchpad data')
|
|
try:
|
|
return _login_re.search(data).group(1)
|
|
except:
|
|
return False
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
person = LaunchpadPerson(sys.argv[1], sys.argv[2])
|
|
print person.authenticated
|
|
try:
|
|
print person.nick
|
|
print person.name
|
|
print person.mail_shasums
|
|
print person.img
|
|
except:
|
|
raise
|
|
pass
|
|
print person.check_group_membership(sys.argv[3])
|