#! /usr/bin/env python # -*- coding: iso-8859-15 -*- import os, random from time import time class session : def __init__ (self, sid = None) : """ Si sid est fournit, on regarde si la session est valide ; on soulève un exeption si il y a un problème Si sid n'est pas fourni un créé une nouvelle session """ self.save = True if sid : # on vérifie la validité if not os.access( self._sess_file(sid), os.W_OK ) : raise ValueError, 'Session inconnue' # on exporte le sid self.sid = sid # on lit les données self.data = {} f = open(self._sess_file(sid)) for i in f.readlines() : if not i.strip() : continue key = i.split(' ')[0] value = ' '.join(i.split(' ')[1:]).strip() self.data[key] = value if int(self.data['perime']) < int(time()) : self.destroy() raise ValueError, 'Session périmée' else : # on créé un nouveau sid self.data = {} ok = False while not ok : sid = ''.join( [ random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(0,30) ]) # est ce que la session existe ? if not os.path.exists(self._sess_file(sid)) : # on créé un nouveau fichier avec un timeout de 60 f = os.open(self._sess_file(sid), os.O_WRONLY + os.O_CREAT , 0600) f # on valide ok = True self.sid = sid # on initialise les données self.data = {'timeout' : '600'} def _sess_file (self, sid = None) : """ Retourne le nom du fichier correspondant à la session """ if not sid : sid = self.sid return '/tmp/pysession-%s' % sid def __del__ (self) : """ On enregsitre la session à la destruction de l'instance """ if self.save : # epok de peromption self.data['perime'] = str(int(time() + int(self.data['timeout']))) f = open(self._sess_file(), 'w') for k in self.data.keys() : f.write( '%s %s\n' % (k,self.data[k]) ) f.close() def destroy(self) : """ Supprime la session """ self.save = False os.remove( self._sess_file() ) # on supprime toutes les vieilles sessions for file in os.listdir('/tmp') : if file[0:10] == 'pysession-' : #print file[10:] try : s = session(file[10:]) s.save = False except : continue