import repository from arizona
[raven.git] / apps / mprepo / repoauth.py
1 import os
2 import shutil
3 import tempfile
4 import xmlrpclib
5
6 import arizonaconfig
7
8 import repoplc
9
10 class LoginError(Exception):
11     def __init__(self, value):
12         self.value = value
13     def __str__(self):
14         return repr(self.value)
15
16 def determine_geni_filekind(fn):
17     from sfa.trust.certificate import Certificate
18
19     cert = Certificate(filename = fn)
20
21     data = cert.get_data()
22     if data:
23         dict = xmlrpclib.loads(data)[0][0]
24     else:
25         dict = {}
26
27     if "gidCaller" in dict:
28         return "credential"
29
30     if "uuid" in dict:
31         return "gid"
32
33     return "unknown"
34
35 def do_auth_geni(helper, infile):
36     from sfa.trust.gid import *
37     from sfa.trust.credential import *
38     from sfa.util.faults import *
39
40     gid = None
41
42     if not infile.filename:
43        raise LoginError("Must provide a GID or Credential file")
44
45     try:
46        fdt, tmpfile_name = tempfile.mkstemp()
47        tmpfile = os.fdopen(fdt, 'wb')
48        shutil.copyfileobj(infile.file, tmpfile, 8192)
49        tmpfile.close()
50
51        kind = determine_geni_filekind(tmpfile_name)
52
53        if kind == "credential":
54            cred = Credential(filename = tmpfile_name)
55            gid = cred.get_gid_caller()
56
57        elif kind == "gid":
58            gid = GID(filename = tmpfile_name)
59
60        else:
61            raise LoginError("unable to determine type of geni file")
62
63     finally:
64        os.remove(tmpfile_name)
65
66     if not gid:
67         raise LoginError("Failed to extract a GID from the file provided")
68
69     peer_cert_str = helper.req.ssl_var_lookup("SSL_CLIENT_CERT")
70     if not peer_cert_str:
71         raise LoginError("No client certificate specified")
72
73     peer_cert = Certificate(string = peer_cert_str)
74
75     if not peer_cert.is_pubkey(gid.get_pubkey()):
76         raise LoginError("Peer certificate does not match key contained in GID")
77
78     try:
79         gid.verify_chain(helper.get_trusted_cert_list())
80     except CertMissingParent, CertNotSignedByParent:
81         raise LoginError("gid not traceable to trusted root")
82
83     helper.set_gid(gid)
84     helper.set_logged_in(True, "geni")
85
86 def do_auth(helper, username = None, password = None, authmethod = "PLauthenticate", genifile=None):
87     if authmethod not in arizonaconfig.get_option("logintypes"):
88        raise LoginError("authentication type disabled")
89
90     if not username:
91        raise LoginError("Must provide a PlanetLab username")
92
93     if not password:
94        raise LoginError("Must provide a PlanetLab password")
95
96     if authmethod == "PLauthenticate":
97        authsite = "www.planet-lab.org"
98     elif authmethod == "PLEauthenticate":
99        authsite = "www.planet-lab.eu"
100     elif authmethod == "passfileauthenticate":
101        authsite = "localhost"
102     else:
103        raise LoginError("unknown authmethod")
104
105     try:
106        repoplc.login(username, password, authsite=authsite, authmethod=authmethod)
107     except ValueError, errormessage:
108        raise LoginError(str(errormessage) + " (incorrect username or password?)")
109
110     print "successful login using method", authmethod, "for user", username
111
112
113
114
115