def doOPTIONSSpec(self, environ, start_response):
     mappedpath = environ['pyfileserver.mappedpath']
     if os.path.isdir(mappedpath):
         start_response('200 OK', [
             ('Content-Type', 'text/html'), ('Content-Length', '0'),
             ('Allow',
              'OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK'
              ), ('DAV', '1,2'), ('Server', 'DAV/2'),
             ('Date', httpdatehelper.getstrftime())
         ])
     elif os.path.isfile(mappedpath):
         start_response('200 OK', [
             ('Content-Type', 'text/html'), ('Content-Length', '0'),
             ('Allow',
              'OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK'
              ), ('DAV', '1,2'), ('Allow-Ranges', 'bytes'),
             ('Date', httpdatehelper.getstrftime())
         ])
     elif os.path.isdir(os.path.dirname(mappedpath)):
         start_response('200 OK', [('Content-Type', 'text/html'),
                                   ('Content-Length', '0'),
                                   ('Allow', 'OPTIONS PUT MKCOL'),
                                   ('DAV', '1,2'),
                                   ('Date', httpdatehelper.getstrftime())])
     else:
         raise HTTPRequestException(
             processrequesterrorhandler.HTTP_NOT_FOUND)
     # @@: I'd say that return [''] is generally better, as you don't set up an unnecessary
     # generator context
     yield ''
     return
 def getProperty(self, respath, propertyname, propertyns):
     if propertyns == 'DAV:':
         isfile = os.path.isfile(respath)
         if propertyname == 'creationdate':
             statresults = os.stat(respath)
             return httpdatehelper.getstrftime(statresults[stat.ST_CTIME])
         elif propertyname == 'getcontenttype':
             return self.getContentType(respath)
         elif propertyname == 'resourcetype':
             if os.path.isdir(respath):
                 return '<D:collection />'
             else:
                 return ''
         elif propertyname == 'getlastmodified':
             statresults = os.stat(respath)
             return httpdatehelper.getstrftime(statresults[stat.ST_MTIME])
         elif propertyname == 'getcontentlength':
             if isfile:
                 statresults = os.stat(respath)
                 return str(statresults[stat.ST_SIZE])
             raise HTTPRequestException(
                 processrequesterrorhandler.HTTP_NOT_FOUND)
         elif propertyname == 'getetag':
             return self.getEntityTag(respath)
     raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND)
def getProperty(pm, lm, mappedpath, displaypath, propns, propname, etagprovider):
    if propns == None:
        propns = ''

    if propns == 'DAV:':
        isfile = os.path.isfile(mappedpath)
        if propname == 'creationdate':
            statresults = os.stat(mappedpath)
            return (httpdatehelper.getstrftime(statresults[stat.ST_CTIME]), "200 OK")        
        elif propname == 'displayname':
            return (displaypath, "200 OK")
        elif propname == 'getcontenttype':
            if isfile:
                (mimetype, mimeencoding) = mimetypes.guess_type(mappedpath);
                if mimetype == '' or mimetype == None:
                    mimetype = 'application/octet-stream'             
                return (mimetype, "200 OK")
            else:
                return ('text/html', "200 OK")
        elif propname == 'resourcetype':
            if os.path.isdir(mappedpath):
                return ('<D:collection />', "200 OK")            
            else:
                return ('', "200 OK")   
        elif propname == 'getlastmodified':
            statresults = os.stat(mappedpath)
            return (httpdatehelper.getstrftime(statresults[stat.ST_MTIME]), "200 OK")                     
        elif propname == 'getcontentlength':
            if isfile:
                statresults = os.stat(mappedpath)
                return (str(statresults[stat.ST_SIZE]), "200 OK")
            return (None, "404 Not Found")
        elif propname == 'getetag':
            if isfile:
                return (etagprovider(mappedpath), "200 OK")
            return (None, "404 Not Found")
        elif propname == 'lockdiscovery':
            lockinfo = ''         
            activelocklist = lm.getURLLocktokenList(displaypath)
            for activelocktoken in activelocklist:
                lockinfo = lockinfo + '<D:activelock>\n'
                lockinfo = lockinfo + '<D:locktype><' + lm.getLockProperty(activelocktoken, 'LOCKTYPE') + '/></D:locktype>\n'
                lockinfo = lockinfo + '<D:lockscope><' + lm.getLockProperty(activelocktoken, 'LOCKSCOPE') + '/></D:lockscope>\n'
                lockinfo = lockinfo + '<D:depth>' + lm.getLockProperty(activelocktoken, 'LOCKDEPTH') + '</D:depth>\n'
                lockinfo = lockinfo + '<D:owner>' + lm.getLockProperty(activelocktoken, 'LOCKOWNER') + '</D:owner>\n'
                lockinfo = lockinfo + '<D:timeout>' + lm.getLockProperty(activelocktoken, 'LOCKTIME') + '</D:timeout>\n'
                lockinfo = lockinfo + '<D:locktoken><D:href>' + activelocktoken + '</D:href></D:locktoken>\n'
                lockinfo = lockinfo + '</D:activelock>\n'
            return (lockinfo, "200 OK")
        elif propname == 'supportedlock':
            return ('<D:lockentry xmlns:D=\"DAV:\" >\n<D:lockscope><D:exclusive/></D:lockscope>\n<D:locktype><D:write/></D:locktype>\n</D:lockentry>\n<D:lockentry xmlns:D=\"DAV:\" >\n<D:lockscope><D:shared/></D:lockscope>\n<D:locktype><D:write/></D:locktype>\n</D:lockentry>', "200 OK")
        elif propname == 'getcontentlanguage' or propname == 'source':
            return (None, "404 Not Found")

    propvalue = pm.getProperty(displaypath, propns + ';' + propname)
    if propvalue == None:
        return (None, "404 Not Found")
    else:
        return (propvalue, "200 OK")
Esempio n. 4
0
    def doOPTIONSSpec(self, environ, start_response):
        resourceAL = environ['pyfileserver.resourceAL']

        headers = []
        if resourceAL.isCollection(environ['pyfileserver.mappedpath']):
            headers.append((
                'Allow',
                'OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK'
            ))
        elif resourceAL.isResource(environ['pyfileserver.mappedpath']):
            headers.append((
                'Allow',
                'OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK'
            ))
            if resourceAL.supportRanges():
                headers.append(('Allow-Ranges', 'bytes'))
        elif resourceAL.isCollection(
                resourceAL.getContainingCollection(
                    environ['pyfileserver.mappedpath'])):
            headers.append(('Allow', 'OPTIONS PUT MKCOL'))
        else:
            raise HTTPRequestException(
                processrequesterrorhandler.HTTP_NOT_FOUND)
        headers.append(('Content-Type', 'text/html'))
        headers.append(('Content-Length', '0'))
        headers.append(('DAV', '1,2'))
        headers.append(('Server', 'DAV/2'))
        headers.append(('Date', httpdatehelper.getstrftime()))
        start_response('200 OK', headers)
        return ['']
 def getResourceDescriptor(self, respath):
     resdesc = self.getResourceDescription(respath)
     ressize = str(self.getContentLength(respath)) + " B"
     resmod = httpdatehelper.getstrftime(self.getLastModified(respath))
     if os.path.isdir(respath):
         ressize = ""
     return [resdesc, ressize, resmod]
    def __call__(self, environ, start_response):
        environ['pyfileserver.config'] = self._srvcfg
        environ['pyfileserver.trailer'] = self._infoHeader

        if self._verbose == 1:
            print >> environ['wsgi.errors'], '[',httpdatehelper.getstrftime(),'] from ', environ.get('REMOTE_ADDR','unknown'), ' ', environ.get('REQUEST_METHOD','unknown'), ' ', environ.get('PATH_INFO','unknown'), ' ', environ.get('HTTP_DESTINATION', '')
        elif self._verbose == 2:      
            print >> environ['wsgi.errors'], "<======== Request Environ"
            for envitem in environ.keys():
                if envitem == envitem.upper():
                    print >> environ['wsgi.errors'], "\t", envitem, ":\t", repr(environ[envitem]) 
            print >> environ['wsgi.errors'], "\n"

        def _start_response(respcode, headers, excinfo=None):   
            if self._verbose == 2:
                print >> environ['wsgi.errors'], "=========> Response"
                print >> environ['wsgi.errors'], 'Response code:', respcode
                headersdict = dict(headers)
                for envitem in headersdict.keys():
                    print >> environ['wsgi.errors'], "\t", envitem, ":\t", repr(headersdict[envitem]) 
                print >> environ['wsgi.errors'], "\n"
            return start_response(respcode, headers, excinfo)

        for v in iter(self._application(environ, _start_response)):
            if self._verbose == 2 and environ['REQUEST_METHOD'] != 'GET':
                print >> environ['wsgi.errors'], v
            yield v 

        return 
        
        
 def getResourceDescriptor(self, respath):
    resdesc = self.getResourceDescription(respath)
    ressize = str(self.getContentLength(respath)) + " B"
    resmod = httpdatehelper.getstrftime(self.getLastModified(respath))
    if os.path.isdir(respath):      
       ressize = ""
    return [resdesc, ressize, resmod]
    def __call__(self, environ, start_response):
        environ['pyfileserver.config'] = self._srvcfg
        environ['pyfileserver.trailer'] = self._infoHeader

        # @@: Really this should be doing print >> environ['wsgi.errors'], ...
        if self._verbose == 1:
            print '[',httpdatehelper.getstrftime(),'] from ', environ.get('REMOTE_ADDR','unknown'), ' ', environ.get('REQUEST_METHOD','unknown'), ' ', environ.get('PATH_INFO','unknown'), ' ', environ.get('HTTP_DESTINATION', '')
        elif self._verbose == 2:      
            print "<======== Request Environ"
            for envitem in environ.keys():
                if envitem == envitem.upper():
                    print "\t", envitem, ":\t", repr(environ[envitem]) 
            print "\n"

        def _start_response(respcode, headers, excinfo=None):   
            if self._verbose == 2:
                print "=========> Response"
                print 'Response code:', respcode
                headersdict = dict(headers)
                for envitem in headersdict.keys():
                    print "\t", envitem, ":\t", repr(headersdict[envitem]) 
                print "\n"
            return start_response(respcode, headers, excinfo)

        for v in iter(self._application(environ, _start_response)):
            if self._verbose == 2 and environ['REQUEST_METHOD'] != 'GET':
                print v
            yield v 

        return 
Esempio n. 9
0
 def doOPTIONS(self, environ, start_response):
     headers = []
     headers.append( ('Content-Type', 'text/html') )
     headers.append( ('Content-Length','0') )
     headers.append( ('DAV','1,2') )
     headers.append( ('Server','DAV/2') )
     headers.append( ('Date',httpdatehelper.getstrftime()) )
     start_response('200 OK', headers)
     return ['']  
Esempio n. 10
0
 def doOPTIONS(self, environ, start_response):
     headers = []
     headers.append(('Content-Type', 'text/html'))
     headers.append(('Content-Length', '0'))
     headers.append(('DAV', '1,2'))
     headers.append(('Server', 'DAV/2'))
     headers.append(('Date', httpdatehelper.getstrftime()))
     start_response('200 OK', headers)
     return ['']
 def doOPTIONSSpec(self, environ, start_response):
     mappedpath = environ["pyfileserver.mappedpath"]
     if os.path.isdir(mappedpath):
         start_response(
             "200 OK",
             [
                 ("Content-Type", "text/html"),
                 ("Content-Length", "0"),
                 ("Allow", "OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK"),
                 ("DAV", "1,2"),
                 ("Server", "DAV/2"),
                 ("Date", httpdatehelper.getstrftime()),
             ],
         )
     elif os.path.isfile(mappedpath):
         start_response(
             "200 OK",
             [
                 ("Content-Type", "text/html"),
                 ("Content-Length", "0"),
                 ("Allow", "OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK"),
                 ("DAV", "1,2"),
                 ("Allow-Ranges", "bytes"),
                 ("Date", httpdatehelper.getstrftime()),
             ],
         )
     elif os.path.isdir(os.path.dirname(mappedpath)):
         start_response(
             "200 OK",
             [
                 ("Content-Type", "text/html"),
                 ("Content-Length", "0"),
                 ("Allow", "OPTIONS PUT MKCOL"),
                 ("DAV", "1,2"),
                 ("Date", httpdatehelper.getstrftime()),
             ],
         )
     else:
         raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND)
     # @@: I'd say that return [''] is generally better, as you don't set up an unnecessary
     # generator context
     yield ""
     return
 def doOPTIONS(self, environ, start_response):
     start_response(
         "200 OK",
         [
             ("Content-Type", "text/html"),
             ("Content-Length", "0"),
             ("DAV", "1,2"),
             ("Server", "DAV/2"),
             ("Date", httpdatehelper.getstrftime()),
         ],
     )
     return [""]
Esempio n. 13
0
    def printConfigErrorMessage(self, environ, start_response):
        message = """\
<html><head><title>Welcome to PyFileServer</title></head>
<body>
<h1>Welcome to PyFileServer</h1>
<p>Thank you for using <a href="http://pyfilesync.berlios.de/">PyFileServer</a> .If you are seeing this message, you have either not specified any realm/mappings to be shared or PyFileServer is having difficulties reading your configuration file. Please check that you have specified a valid configuration file.</p>
</body>        
</html>        
        """
        start_response('200 OK', [('Cache-Control', 'no-cache'),
                                  ('Content-Type', 'text/html'),
                                  ('Date', httpdatehelper.getstrftime())])
        return [message]
 def getProperty(self, respath, propertyname, propertyns):
    if propertyns == 'DAV:':
       isfile = os.path.isfile(respath)
       if propertyname == 'creationdate':
           statresults = os.stat(respath)
           return httpdatehelper.getstrftime(statresults[stat.ST_CTIME])
       elif propertyname == 'getcontenttype':
           return self.getContentType(respath)
       elif propertyname == 'resourcetype':
          if os.path.isdir(respath):
             return '<D:collection />'            
          else:
             return ''   
       elif propertyname == 'getlastmodified':
          statresults = os.stat(respath)
          return httpdatehelper.getstrftime(statresults[stat.ST_MTIME])
       elif propertyname == 'getcontentlength':
          if isfile:
             statresults = os.stat(respath)
             return str(statresults[stat.ST_SIZE])
          raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND)               
       elif propertyname == 'getetag':
          return self.getEntityTag(respath)
    raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND)               
    def printConfigErrorMessage(self):

        message = """\
<html><head><title>Welcome to PyFileServer</title></head>
<body>
<h1>Welcome to PyFileServer</h1>
<p>Thank you for using <a href="http://pyfilesync.berlios.de/">PyFileServer</a> .If you are seeing this message, you have either not specified any realm/mappings to be shared or PyFileServer is having difficulties reading your configuration file. Please check that you have specified a valid configuration file.</p>
</body>        
</html>        
        """
        start_response(
            "200 OK",
            [("Cache-Control", "no-cache"), ("Content-Type", "text/html"), ("Date", httpdatehelper.getstrftime())],
        )
        # @@: ditto on the return; you should only use yield when you really are doing
        # extra work on each iteration
        yield message
        return
Esempio n. 16
0
    def doOPTIONSSpec(self, environ, start_response):
        resourceAL = environ['pyfileserver.resourceAL']

        headers = []
        if resourceAL.isCollection(environ['pyfileserver.mappedpath']):
            headers.append( ('Allow','OPTIONS HEAD GET DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK') )
        elif resourceAL.isResource(environ['pyfileserver.mappedpath']):
            headers.append( ('Allow','OPTIONS HEAD GET PUT DELETE PROPFIND PROPPATCH COPY MOVE LOCK UNLOCK') )
            if resourceAL.supportRanges():
                headers.append( ('Allow-Ranges','bytes') )
        elif resourceAL.isCollection(resourceAL.getContainingCollection(environ['pyfileserver.mappedpath'])):
            headers.append( ('Allow','OPTIONS PUT MKCOL') )
        else:
            raise HTTPRequestException(processrequesterrorhandler.HTTP_NOT_FOUND)
        headers.append( ('Content-Type', 'text/html') )
        headers.append( ('Content-Length','0') )
        headers.append( ('DAV','1,2') )
        headers.append( ('Server','DAV/2') )
        headers.append( ('Date',httpdatehelper.getstrftime()) )
        start_response('200 OK', headers)
        return ['']     
Esempio n. 17
0
    def __call__(self, environ, start_response):
        environ['pyfileserver.config'] = self._srvcfg
        environ['pyfileserver.trailer'] = self._infoHeader

        if self._verbose == 1:
            logging.info( '[' + httpdatehelper.getstrftime() +'] from ' + \
                    environ.get('REMOTE_ADDR','unknown') + ' ' + \
                    environ.get('REQUEST_METHOD','unknown') + ' ' + \
                    environ.get('PATH_INFO','unknown') + ' ' + \
                    environ.get('HTTP_DESTINATION', '') )
        elif self._verbose == 2:
            logging.debug("<======== Request Environ")
            for envitem in environ.keys():
                if envitem == envitem.upper():
                    logging.debug("\t" + envitem + ":\t" +
                                  repr(environ[envitem]))
            logging.debug("\n")

        def _start_response(respcode, headers, excinfo=None):
            if self._verbose == 2:
                logging.debug("=========> Response")
                logging.debug('Response code: %s', respcode)
                headersdict = dict(headers)
                for envitem in headersdict.keys():
                    logging.debug("\t" + envitem + ":\t" +
                                  repr(headersdict[envitem]))
                logging.debug("\n")
            return start_response(respcode, headers, excinfo)

        for v in iter(self._application(environ, _start_response)):
            if isinstance(v, unicode):
                v = v.encode('utf-8')
            if self._verbose == 2 and environ['REQUEST_METHOD'] != 'GET':
                logging.debug(v)
            yield v
        return
Esempio n. 18
0
    def printConfigErrorMessage(self):        
        message = """\
<html><head><title>Welcome to PyFileServer</title></head>
<body>
<h1>Welcome to PyFileServer</h1>
<p>Thank you for using <a href="http://pyfilesync.berlios.de/">PyFileServer</a> .If you are seeing this message, you have either not specified any realm/mappings to be shared or PyFileServer is having difficulties reading your configuration file. Please check that you have specified a valid configuration file.</p>
</body>        
</html>        
        """
        start_response('200 OK', [('Cache-Control','no-cache'), ('Content-Type', 'text/html'), ('Date',httpdatehelper.getstrftime())])
        return [message]          
 def doOPTIONS(self, environ, start_response):
     start_response('200 OK', [('Content-Type', 'text/html'),
                               ('Content-Length', '0'), ('DAV', '1,2'),
                               ('Server', 'DAV/2'),
                               ('Date', httpdatehelper.getstrftime())])
     return ['']