sm4rtn0bit4

CGI Session management

Jul 30th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.29 KB | None | 0 0
  1. #!/usr/bin/python
  2. #
  3. # File Name= "cgi_session.py"
  4. # place file at: /usr/lib/python3.5/cgi_session.py
  5. # import as : from cgi_session import CGISession
  6. #   session=CGISession()
  7. #
  8. # -*- coding: utf-8 -*-
  9.  
  10. import stat
  11. import sys
  12. import tempfile
  13. import hashlib
  14. import os
  15. import time
  16. import random
  17. import errno
  18. import ast
  19. import pprint
  20. import fcntl
  21.  
  22.  
  23. class CGISession:
  24.  
  25.     __sessionfile = ''
  26.     __newid = ''
  27.     __date = ''
  28.     __tmp = ''
  29.  
  30.     __pid = ''
  31.     __time = ''
  32.     __rand = ''
  33.  
  34.     __pp = pprint.PrettyPrinter()
  35.     __fs = ''
  36.  
  37.     def __init__(
  38.         self,
  39.         id=None,
  40.         directory=None,
  41.         hash='md5',
  42.         ):
  43.  
  44.         if directory is None:
  45.             self.__directory = tempfile.gettempdir()
  46.         else:
  47.             if not os.path.exists(directory):
  48.                 try:
  49.                     os.makedirs(directory)
  50.                 except error:
  51.                     if error.errno != errno.EEXIST:
  52.                         raise
  53.             self.__directory = directory
  54.  
  55.         if hash not in ['md5', 'sha256', 'sha512']:
  56.             self.__hash = 'md5'
  57.         else:
  58.             self.__hash = hash
  59.  
  60.         if id is None:
  61.             self.__id = self.__genSessionID()
  62.             self.__fs = open(os.path.join(self.__directory,
  63.                              'pycgiession_{0}'.format(self.__id)), 'w')
  64.             fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  65.             self.__fs.write('{}')
  66.             self.__fs.close()
  67.             self.__sessionfile = os.path.join(self.__directory,
  68.                     'pycgiession_{0}'.format(self.__id))
  69.             os.chmod(self.__sessionfile,stat.S_IRWXU and stat.S_IROTH)
  70.         else:
  71.             try:
  72.                 open(os.path.join(self.__directory,
  73.                      'pycgiession_{0}'.format(os.path.basename(id))),
  74.                      'r').close()
  75.                 self.__id = os.path.basename(id)
  76.                 self.__sessionfile = os.path.join(self.__directory,
  77.                         'pycgiession_{0}'.format(self.__id))
  78.                 os.chmod(self.__sessionfile,stat.S_IRWXU and stat.S_IROTH)
  79.             except error:
  80.                 if error.errno == errno.ENOENT:
  81.                     self.__id = self.__genSessionID()
  82.                     self.__fs = open(os.path.join(self.__directory,
  83.                             'pycgiession_{0}'.format(self.__id)), 'w')
  84.                     fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  85.                     self.__fs.write('{}')
  86.                     self.__fs.close()
  87.                     self.__sessionfile = os.path.join(self.__directory,
  88.                             'pycgiession_{0}'.format(self.__id))
  89.                     os.chmod(self.__sessionfile,stat.S_IRWXU and stat.S_IROTH)
  90.                 else:
  91.                     raise
  92.  
  93.     def __genSessionID(self):
  94.  
  95.         self.__pid = str(os.getpid())
  96.         self.__time = ''.join(map(str, time.gmtime()[0:]))
  97.         self.__rand = str(random.random())
  98.  
  99.         if self.__hash == 'sha256':
  100.             sha256 = hashlib.sha256()
  101.             sha256.update(self.__pid)
  102.             sha256.update(self.__time)
  103.             sha256.update(self.__rand)
  104.             self.__newid = sha256.hexdigest()
  105.         elif self.__hash == 'sha512':
  106.  
  107.             sha512 = hashlib.sha512()
  108.             sha512.update(self.__pid)
  109.             sha512.update(self.__time)
  110.             sha512.update(self.__rand)
  111.             self.__newid = sha512.hexdigest()
  112.         else:
  113.  
  114.             md5 = hashlib.md5()
  115.             md5.update(self.__pid.encode('utf-8'))
  116.             md5.update(self.__time.encode('utf-8'))
  117.             md5.update(self.__rand.encode('utf-8'))
  118.             self.__newid = md5.hexdigest()
  119.  
  120.         return self.__newid
  121.  
  122.     def getID(self):
  123.         return self.__id
  124.  
  125.     def setParam(self, key, value):
  126.  
  127.         self.__fs = open(self.__sessionfile, 'r')
  128.         fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  129.         self.__date = self.__fs.readlines()
  130.         self.__fs.close()
  131.  
  132.         self.__fs = open(self.__sessionfile, 'w')
  133.         fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  134.         self.__date = ast.literal_eval(self.__date[0])
  135.         self.__date[key] = value
  136.  
  137.         self.__fs.write(self.__pp.pformat(self.__date))
  138.         self.__fs.close()
  139.  
  140.     def getParam(self, key):
  141.  
  142.         self.__fs = open(self.__sessionfile, 'r')
  143.         fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  144.         self.__date = self.__fs.readline()
  145.         self.__fs.close()
  146.         self.__date = ast.literal_eval(self.__date)
  147.         try:
  148.             self.__date = self.__date[key]
  149.             return self.__date
  150.         except KeyError:
  151.             return None
  152.  
  153.     def getAll(self):
  154.  
  155.         self.__fs = open(self.__sessionfile, 'r')
  156.         fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  157.         self.__date = self.__fs.readlines()
  158.         self.__fs.close()
  159.         self.__date = ast.literal_eval(self.__date[0])
  160.         return self.__date
  161.  
  162.     def delParam(self, key):
  163.  
  164.         self.__fs = open(self.__sessionfile, 'r')
  165.         fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  166.         self.__date = self.__fs.readlines()
  167.         self.__fs.close()
  168.  
  169.         self.__fs = open(self.__sessionfile, 'w')
  170.         fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  171.         self.__date = ast.literal_eval(self.__date[0])
  172.  
  173.         try:
  174.             del self.__date[key]
  175.         except KeyError:
  176.             pass
  177.  
  178.         self.__fs.write(self.__pp.pformat(self.__date))
  179.         self.__fs.close()
  180.  
  181.     def clear(self):
  182.  
  183.         self.__fs = open(self.__sessionfile, 'w')
  184.         fcntl.flock(self.__fs.fileno(), fcntl.LOCK_EX)
  185.         self.__fs.write('{}')
  186.         self.__fs.close()
  187.  
  188.     def delete(self):
  189.  
  190.         os.remove(self.__sessionfile)
  191. ###################################################################
  192. #
  193. #EXAMPLES BELOW:
  194. #
  195. >>> from CGISession import CGISession
  196. >>> session = CGISession()
  197. >>>
  198. >>> session.getID()
  199. '7e487c3c300126fddbecb37b041d66e3'
  200. >>>
  201. >>> session.setParam('name','A')
  202. >>> session.setParam('friends',['C','D','E'])
  203. >>>
  204. >>> session.getParam('name')
  205. 'A'
  206. >>> session.getParam('friends')
  207. ['C', 'D', 'E']
  208. >>>
  209. >>> session.delParam('name')
  210. >>> session.delParam('friends')
  211. >>>
  212. >>> session.getParam('name')
  213. >>> session.delParam('friends')
  214. >>>
  215. >>> session.delete()
  216. >>>
Add Comment
Please, Sign In to add comment