~ubuntu-branches/debian/sid/openchange/sid

« back to all changes in this revision

Viewing changes to mapiproxy/services/ocsmanager/ocsmanager/controllers/authenticate.py

  • Committer: Package Import Robot
  • Author(s): Jelmer Vernooij
  • Date: 2012-04-12 20:07:57 UTC
  • mfrom: (11 sid)
  • mto: This revision was merged to the branch mainline in revision 12.
  • Revision ID: package-import@ubuntu.com-20120412200757-k933d9trljmxj1l4
Tags: 1:1.0-4
* openchangeserver: Add dependency on openchangeproxy.
* Rebuild against newer version of Samba 4.
* Use dpkg-buildflags.
* Migrate to Git, update Vcs-Git header.
* Switch to debhelper 9.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import logging
 
2
import hashlib
 
3
import os
 
4
 
 
5
from base64 import urlsafe_b64encode as encode
 
6
from base64 import urlsafe_b64decode as decode
 
7
 
 
8
from pylons import request, response, session, tmpl_context as c, url
 
9
from pylons.controllers.util import abort, redirect
 
10
from pylons.decorators.rest import restrict
 
11
from ocsmanager.model import AuthenticateModel
 
12
 
 
13
from ocsmanager.lib.base import BaseController, render
 
14
 
 
15
log = logging.getLogger(__name__)
 
16
 
 
17
class AuthenticateController(BaseController):
 
18
 
 
19
    def _auth_abort(self, code, message):
 
20
        c.code = code
 
21
        c.message = message
 
22
        return render('/error.xml')
 
23
 
 
24
    @restrict('POST')
 
25
    def token(self):
 
26
        """ Return a session token, one-time hash and password hash
 
27
        for the user.
 
28
        """
 
29
        # Ensure Content-type is text/xml
 
30
        if request.headers.get("Content-Type", "").startswith("text/xml") is False: 
 
31
            return self._auth_abort(417, 'Invalid Parameter')
 
32
 
 
33
        # Retrieve request XML body
 
34
        payload = request.body
 
35
        if payload is None: 
 
36
            log.error('Empty payload in auth:token()')
 
37
            return self._auth_abort(417, 'Invalid Parameter')
 
38
 
 
39
        # Retrieve the salt from the model
 
40
        authModel = AuthenticateModel.AuthenticateModel()
 
41
        login = authModel.getTokenLogin(payload)
 
42
        if login is None: 
 
43
            return self._auth_abort(417, 'Invalid Parameter')
 
44
 
 
45
        salt = authModel.getTokenLoginSalt(login)
 
46
        if salt is None:
 
47
            log.debug('Invalid user %s', login)
 
48
            salt = encode(hashlib.sha1(os.urandom(4)).digest())
 
49
 
 
50
        session['token'] = encode(hashlib.sha1(os.urandom(8)).digest())
 
51
        session['token_salt'] = encode(hashlib.sha1(os.urandom(8)).digest())
 
52
        session['salt'] = salt
 
53
        session['login'] = login
 
54
        session.save()
 
55
 
 
56
        c.token_salt = session['token_salt']
 
57
        c.salt = salt
 
58
 
 
59
        response.set_cookie('token', session['token'])
 
60
        response.headers['content-type'] = 'text/xml; charset=utf-8'
 
61
        return render('/token.xml')
 
62
 
 
63
    @restrict('POST')
 
64
    def login(self):
 
65
        """Authenticate the user on ocsmanager.
 
66
        """
 
67
 
 
68
        if not "ocsmanager" in request.cookies: return self._auth_abort(403, 'Invalid Session')
 
69
        if not "token" in session: return self._auth_abort(403, 'Invalid Session')
 
70
        if not "token" in request.cookies: return self._auth_abort(403, 'Invalid Token')
 
71
        if request.cookies.get('token') != session['token']: return self._auth_abort(403, 'Invalid Token')
 
72
        if not "login" in session: return self._auth_abort(403, 'Invalid Session')
 
73
 
 
74
        payload = request.body
 
75
        if payload is None:
 
76
            log.error('Empty payload in auth:login()')
 
77
            return self._auth_abort(417, 'Invalid Parameter')
 
78
 
 
79
        authModel = AuthenticateModel.AuthenticateModel()
 
80
        (error, msg) = authModel.verifyPassword(session['login'], session['token_salt'], session['salt'], payload)
 
81
        if error is True:
 
82
            response.delete_cookie('token')
 
83
            session['token'] = None
 
84
            return self._auth_abort(401, 'Invalid credentials')
 
85
 
 
86
        # Authentication was successful, remove auth token - no longer needed
 
87
        session['token'] = None
 
88
        response.delete_cookie('token')
 
89
        session['tokenLogin'] = hashlib.sha1(os.urandom(8)).hexdigest()
 
90
        session.save()
 
91
        c.tokenLogin = encode(session['tokenLogin'])
 
92
        c.ttl = 10
 
93
        return render('/login.xml')