c2899e9ddc45592b1a8606c738d3520647527a76
[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))
37             
38             # Change to session authentication
39             session_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             #logger.info("{} {} <{}> logged in"\
53             #    .format(person['config']['first_name'], person['config']['last_name'], person['config']['email']))
54
55             SessionCache().store_auth(request, session_auth)
56
57         except ManifoldException as e:
58             logger.error("ManifoldException in Auth Backend: {}".format(e.manifold_result))
59         except Exception as e:
60             logger.error("Exception in Manifold Auth Backend: {}".format(e))
61             import traceback
62             logger.error(traceback.format_exc())
63             return None
64
65         try:
66             # Check if the user exists in Django's local database
67             user = User.objects.get(username=username)
68         except User.DoesNotExist:
69             # Create a user in Django's local database
70             user = User.objects.create_user(username, username, 'passworddoesntmatter')
71             user.email = person['email']
72
73         if 'firstname' in person:
74             user.first_name = person['firstname']
75         if 'lastname' in person:
76             user.last_name = person['lastname']
77
78         return user
79
80     # Required for your backend to work properly - unchanged in most scenarios
81     def get_user(self, user_id):
82         try:
83             return User.objects.get(pk=user_id)
84         except User.DoesNotExist:
85             return None
86
87