home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1458 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  11.0 KB  |  325 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import logging
  5.  
  6. try:
  7.     from hashlib import md5
  8. except ImportError:
  9.     from md5 import new as md5
  10.  
  11. import re
  12. import cherrypy
  13. from cherrypy.lib import http as _http
  14.  
  15. def validate_etags(autotags = False):
  16.     response = cherrypy.response
  17.     if hasattr(response, 'ETag'):
  18.         return None
  19.     (status, reason, msg) = _http.valid_status(response.status)
  20.     etag = response.headers.get('ETag')
  21.     if not etag and autotags:
  22.         if status == 200:
  23.             etag = response.collapse_body()
  24.             etag = '"%s"' % md5(etag).hexdigest()
  25.             response.headers['ETag'] = etag
  26.         
  27.     
  28.     response.ETag = etag
  29.  
  30.  
  31. def validate_since():
  32.     response = cherrypy.response
  33.     lastmod = response.headers.get('Last-Modified')
  34.     if lastmod:
  35.         (status, reason, msg) = _http.valid_status(response.status)
  36.         request = cherrypy.request
  37.         since = request.headers.get('If-Unmodified-Since')
  38.         if since and since != lastmod:
  39.             if status >= 200 or status <= 299 or status == 412:
  40.                 raise cherrypy.HTTPError(412)
  41.             status == 412
  42.         
  43.         since = request.headers.get('If-Modified-Since')
  44.         if since and since == lastmod:
  45.             if status >= 200 or status <= 299 or status == 304:
  46.                 if request.method in ('GET', 'HEAD'):
  47.                     raise cherrypy.HTTPRedirect([], 304)
  48.                 request.method in ('GET', 'HEAD')
  49.                 raise cherrypy.HTTPError(412)
  50.             status == 304
  51.         
  52.     
  53.  
  54.  
  55. def proxy(base = None, local = 'X-Forwarded-Host', remote = 'X-Forwarded-For', scheme = 'X-Forwarded-Proto'):
  56.     request = cherrypy.request
  57.     if scheme:
  58.         s = request.headers.get(scheme, None)
  59.         if s == 'on' and 'ssl' in scheme.lower():
  60.             scheme = 'https'
  61.         else:
  62.             scheme = s
  63.     
  64.     if not scheme:
  65.         scheme = request.base[:request.base.find('://')]
  66.     
  67.     if local:
  68.         base = request.headers.get(local, base)
  69.     
  70.     if not base:
  71.         port = cherrypy.request.local.port
  72.         if port == 80:
  73.             base = '127.0.0.1'
  74.         else:
  75.             base = '127.0.0.1:%s' % port
  76.     
  77.     if base.find('://') == -1:
  78.         base = scheme + '://' + base
  79.     
  80.     request.base = base
  81.     if remote:
  82.         xff = request.headers.get(remote)
  83.         if xff:
  84.             if remote == 'X-Forwarded-For':
  85.                 xff = xff.split(',')[-1].strip()
  86.             
  87.             request.remote.ip = xff
  88.         
  89.     
  90.  
  91.  
  92. def ignore_headers(headers = ('Range',)):
  93.     request = cherrypy.request
  94.     for name in headers:
  95.         if name in request.headers:
  96.             del request.headers[name]
  97.             continue
  98.     
  99.  
  100.  
  101. def response_headers(headers = None):
  102.     for name, value in []:
  103.         cherrypy.response.headers[name] = value
  104.  
  105. response_headers.failsafe = True
  106.  
  107. def referer(pattern, accept = True, accept_missing = False, error = 403, message = 'Forbidden Referer header.'):
  108.     
  109.     try:
  110.         match = bool(re.match(pattern, cherrypy.request.headers['Referer']))
  111.         if accept == match:
  112.             return None
  113.     except KeyError:
  114.         if accept_missing:
  115.             return None
  116.     except:
  117.         accept_missing
  118.  
  119.     raise cherrypy.HTTPError(error, message)
  120.  
  121.  
  122. class SessionAuth(object):
  123.     session_key = 'username'
  124.     
  125.     def check_username_and_password(self, username, password):
  126.         pass
  127.  
  128.     
  129.     def anonymous(self):
  130.         pass
  131.  
  132.     
  133.     def on_login(self, username):
  134.         pass
  135.  
  136.     
  137.     def on_logout(self, username):
  138.         pass
  139.  
  140.     
  141.     def on_check(self, username):
  142.         pass
  143.  
  144.     
  145.     def login_screen(self, from_page = '..', username = '', error_msg = '', **kwargs):
  146.         return '<html><body>\nMessage: %(error_msg)s\n<form method="post" action="do_login">\n    Login: <input type="text" name="username" value="%(username)s" size="10" /><br />\n    Password: <input type="password" name="password" size="10" /><br />\n    <input type="hidden" name="from_page" value="%(from_page)s" /><br />\n    <input type="submit" />\n</form>\n</body></html>' % {
  147.             'from_page': from_page,
  148.             'username': username,
  149.             'error_msg': error_msg }
  150.  
  151.     
  152.     def do_login(self, username, password, from_page = '..', **kwargs):
  153.         error_msg = self.check_username_and_password(username, password)
  154.         if error_msg:
  155.             body = self.login_screen(from_page, username, error_msg)
  156.             cherrypy.response.body = body
  157.             if cherrypy.response.headers.has_key('Content-Length'):
  158.                 del cherrypy.response.headers['Content-Length']
  159.             
  160.             return True
  161.         self.on_login(username)
  162.         if not from_page:
  163.             pass
  164.         raise cherrypy.HTTPRedirect('/')
  165.  
  166.     
  167.     def do_logout(self, from_page = '..', **kwargs):
  168.         sess = cherrypy.session
  169.         username = sess.get(self.session_key)
  170.         sess[self.session_key] = None
  171.         if username:
  172.             cherrypy.request.login = None
  173.             self.on_logout(username)
  174.         
  175.         raise cherrypy.HTTPRedirect(from_page)
  176.  
  177.     
  178.     def do_check(self):
  179.         sess = cherrypy.session
  180.         request = cherrypy.request
  181.         username = sess.get(self.session_key)
  182.         if not username:
  183.             sess[self.session_key] = username = self.anonymous()
  184.         
  185.         if not username:
  186.             cherrypy.response.body = self.login_screen(cherrypy.url(qs = request.query_string))
  187.             if cherrypy.response.headers.has_key('Content-Length'):
  188.                 del cherrypy.response.headers['Content-Length']
  189.             
  190.             return True
  191.         cherrypy.request.login = username
  192.         self.on_check(username)
  193.  
  194.     
  195.     def run(self):
  196.         request = cherrypy.request
  197.         path = request.path_info
  198.         if path.endswith('login_screen'):
  199.             return self.login_screen(**request.params)
  200.         if path.endswith('do_login'):
  201.             return self.do_login(**request.params)
  202.         if path.endswith('do_logout'):
  203.             return self.do_logout(**request.params)
  204.         return self.do_check()
  205.  
  206.  
  207.  
  208. def session_auth(**kwargs):
  209.     sa = SessionAuth()
  210.     for k, v in kwargs.iteritems():
  211.         setattr(sa, k, v)
  212.     
  213.     return sa.run()
  214.  
  215. session_auth.__doc__ = [] + [](_[1])
  216.  
  217. def log_traceback(severity = logging.DEBUG):
  218.     cherrypy.log('', 'HTTP', severity = severity, traceback = True)
  219.  
  220.  
  221. def log_request_headers():
  222.     h = [ '  %s: %s' % (k, v) for k, v in cherrypy.request.header_list ]
  223.     cherrypy.log('\nRequest Headers:\n' + '\n'.join(h), 'HTTP')
  224.  
  225.  
  226. def log_hooks():
  227.     msg = []
  228.     _cprequest = _cprequest
  229.     import cherrypy
  230.     points = _cprequest.hookpoints
  231.     for k in cherrypy.request.hooks.keys():
  232.         if k not in points:
  233.             points.append(k)
  234.             continue
  235.     
  236.     for k in points:
  237.         msg.append('    %s:' % k)
  238.         v = cherrypy.request.hooks.get(k, [])
  239.         v.sort()
  240.         for h in v:
  241.             msg.append('        %r' % h)
  242.         
  243.     
  244.     cherrypy.log('\nRequest Hooks for ' + cherrypy.url() + ':\n' + '\n'.join(msg), 'HTTP')
  245.  
  246.  
  247. def redirect(url = '', internal = True):
  248.     if internal:
  249.         raise cherrypy.InternalRedirect(url)
  250.     internal
  251.     raise cherrypy.HTTPRedirect(url)
  252.  
  253.  
  254. def trailing_slash(missing = True, extra = False):
  255.     request = cherrypy.request
  256.     pi = request.path_info
  257.     if request.is_index is True:
  258.         if missing:
  259.             if not pi.endswith('/'):
  260.                 new_url = cherrypy.url(pi + '/', request.query_string)
  261.                 raise cherrypy.HTTPRedirect(new_url)
  262.             pi.endswith('/')
  263.         
  264.     elif request.is_index is False:
  265.         if extra:
  266.             if pi.endswith('/') and pi != '/':
  267.                 new_url = cherrypy.url(pi[:-1], request.query_string)
  268.                 raise cherrypy.HTTPRedirect(new_url)
  269.             pi != '/'
  270.         
  271.     
  272.  
  273.  
  274. def flatten():
  275.     import types
  276.     
  277.     def flattener(input):
  278.         for x in input:
  279.             if not isinstance(x, types.GeneratorType):
  280.                 yield x
  281.                 continue
  282.             for y in flattener(x):
  283.                 yield y
  284.             
  285.         
  286.  
  287.     response = cherrypy.response
  288.     response.body = flattener(response.body)
  289.  
  290.  
  291. def accept(media = None):
  292.     if not media:
  293.         return None
  294.     if isinstance(media, basestring):
  295.         media = [
  296.             media]
  297.     
  298.     ranges = cherrypy.request.headers.elements('Accept')
  299.     if not ranges:
  300.         return media[0]
  301.     for element in ranges:
  302.         if element.qvalue > 0:
  303.             if element.value == '*/*':
  304.                 return media[0]
  305.             if element.value.endswith('/*'):
  306.                 mtype = element.value[:-1]
  307.                 for m in media:
  308.                     if m.startswith(mtype):
  309.                         return m
  310.                 
  311.             elif element.value in media:
  312.                 return element.value
  313.             element.value == '*/*'
  314.             continue
  315.         ranges
  316.     
  317.     ah = cherrypy.request.headers.get('Accept')
  318.     if ah is None:
  319.         msg = 'Your client did not send an Accept header.'
  320.     else:
  321.         msg = 'Your client sent this Accept header: %s.' % ah
  322.     msg += ' But this resource only emits these media types: %s.' % ', '.join(media)
  323.     raise cherrypy.HTTPError(406, msg)
  324.  
  325.