rollback to django session management
[myslice.git] / localauth / manifoldbackend.py
1 import time
2
3 from django.contrib.auth.models import User
4
5 from manifoldapi.manifoldapi    import ManifoldAPI, ManifoldException, ManifoldResult
6 from manifold.core.query        import Query
7
8 from myslice.settings import config, logger, DEBUG
9
10 # from unfold.sessioncache import SessionCache
11
12 # Name my backend 'ManifoldBackend'
13 class ManifoldBackend:
14
15     # Create an authentication method
16     # This is called by the standard Django login procedure
17     def authenticate(self, token=None):
18         if not token:
19             return None
20         
21         person = {}
22
23         try:
24             username = token['username']
25             password = token['password']
26             request = token['request']
27
28             auth = {'AuthMethod': 'password', 'Username': username, 'AuthString': password}
29             api = ManifoldAPI(auth)
30             sessions_result = api.forward(Query.create('local:session').to_dict())
31             sessions = sessions_result.ok_value()
32             if not sessions:
33                 logger.error("GetSession failed: {}".format(sessions_result.error()))
34                 return
35             session = sessions[0]
36             logger.debug("SESSION : {}".format(session.keys()))
37             
38             # Change to session authentication
39             api.auth = {'AuthMethod': 'session', 'session': session['session']}
40             #api.auth = session_auth
41             self.api = api
42
43             # Get account details
44             # the new API would expect Get('local:user') instead
45             persons_result = api.forward(Query.get('local:user').to_dict())
46             persons = persons_result.ok_value()
47             if not persons:
48                 logger.error("GetPersons failed: {}".format(persons_result.error()))
49                 return
50             person = persons[0]
51             logger.debug("PERSON : {}".format(person))
52             
53             request.session['manifold'] = {'auth': api.auth, 'person': person, 'expires': session['expires']}
54
55             #logger.info("{} {} <{}> logged in"\
56             #    .format(person['config']['first_name'], person['config']['last_name'], person['config']['email']))
57
58             #SessionCache().store_auth(request, session_auth)
59
60         except ManifoldException as e:
61             logger.error("ManifoldException in Auth Backend: {}".format(e.manifold_result))
62         except Exception as e:
63             logger.error("Exception in Manifold Auth Backend: {}".format(e))
64             import traceback
65             logger.error(traceback.format_exc())
66             return None
67
68         try:
69             # Check if the user exists in Django's local database
70             user = User.objects.get(username=username)
71         except User.DoesNotExist:
72             # Create a user in Django's local database
73             user = User.objects.create_user(username, username, 'passworddoesntmatter')
74             user.email = person['email']
75
76         if 'firstname' in person:
77             user.first_name = person['firstname']
78         if 'lastname' in person:
79             user.last_name = person['lastname']
80
81         return user
82
83     # Required for your backend to work properly - unchanged in most scenarios
84     def get_user(self, user_id):
85         try:
86             return User.objects.get(pk=user_id)
87         except User.DoesNotExist:
88             return None
89
90