64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
""" Vincennes authentifications
|
|
"""
|
|
import base64
|
|
import logging
|
|
import traceback
|
|
|
|
from Crypto.Cipher import AES
|
|
|
|
#from mandaye.dispatchers.auth import AuthFormDispatcher
|
|
from mandaye.response import _502, _302
|
|
|
|
class VincennesAuth(object):
|
|
|
|
def __init__(self, url):
|
|
self.url = url
|
|
|
|
def _parse_qs(self, query):
|
|
""" Parse query string
|
|
Return a dict
|
|
"""
|
|
res = {}
|
|
values = query.split('&')
|
|
for value in values:
|
|
keyvalue = value.split('=', 1)
|
|
res[keyvalue[0]] = keyvalue[1]
|
|
return res
|
|
|
|
def get_current_login(self, env):
|
|
""" Return the current Vincennes pseudo
|
|
"""
|
|
from mandaye import config
|
|
# TODO: test time validity
|
|
if not env['QUERY_STRING']:
|
|
return None
|
|
query = self._parse_qs(env['QUERY_STRING'])
|
|
if query.has_key('token'):
|
|
# TODO: catch exceptions
|
|
try:
|
|
token = query['token']
|
|
token = base64.b64decode(token)
|
|
cipher = AES.new(config.secret, AES.MODE_CFB)
|
|
decode = cipher.decrypt(token)
|
|
info = eval(decode[16:])
|
|
session = env['beaker.session']
|
|
session['pseudo'] = info['pseudo']
|
|
session.save()
|
|
return info['pseudo']
|
|
except Exception, e:
|
|
if config.debug:
|
|
traceback.print_exc()
|
|
return None
|
|
return None
|
|
|
|
def connection(self, env, values, request):
|
|
""" Connection to the compte citoyen
|
|
"""
|
|
dest_url = "%s://%s%s" % (env['wsgi.url_scheme'], env['HTTP_HOST'],
|
|
values.get('next_url'))
|
|
location = "%s?next_url=%s&service=%s" % \
|
|
(self.url, dest_url, values.get('service_name'))
|
|
return _302(location)
|
|
|
|
|