Commit d72f76c6 by btimby

Fixed problem with Chrome using file as a directory

parent 3a283254
...@@ -18,6 +18,7 @@ loopback address. ...@@ -18,6 +18,7 @@ loopback address.
import os import os
import stat import stat
import time import time
import errno
from functools import wraps from functools import wraps
from pyftpdlib import ftpserver from pyftpdlib import ftpserver
...@@ -90,6 +91,16 @@ class FTPFS(ftpserver.AbstractedFS): ...@@ -90,6 +91,16 @@ class FTPFS(ftpserver.AbstractedFS):
return self.fs.open(path, mode) return self.fs.open(path, mode)
def chdir(self, path): def chdir(self, path):
# TODO: can the following conditional checks be farmed out to the fs?
# If we don't raise an error here for files, then the FTP server will
# happily allow the client to CWD into a file. We really only want to
# allow that for directories.
if self.fs.isfile(path):
raise OSError(errno.ENOTDIR, 'Not a directory')
# similarly, if we don't check for existence, the FTP server will allow
# the client to CWD into a non-existent directory.
if not self.fs.exists(path):
raise OSError(errno.ENOENT, 'Does not exist')
self._cwd = self.ftp2fs(path) self._cwd = self.ftp2fs(path)
@convert_fs_errors @convert_fs_errors
...@@ -147,7 +158,8 @@ class FTPFS(ftpserver.AbstractedFS): ...@@ -147,7 +158,8 @@ class FTPFS(ftpserver.AbstractedFS):
elif 'st_mtime' in kwargs: elif 'st_mtime' in kwargs:
# As a last resort, just copy the modified time. # As a last resort, just copy the modified time.
kwargs['st_ctime'] = kwargs['st_mtime'] kwargs['st_ctime'] = kwargs['st_mtime']
mode = 0777 # Not executable by default, Chrome uses the exec flag to denote directories.
mode = 0660
# Merge in the type (dir or file). File is tested first, some file systems # Merge in the type (dir or file). File is tested first, some file systems
# such as ArchiveMountFS treat archive files as directories too. By checking # such as ArchiveMountFS treat archive files as directories too. By checking
# file first, any such files will be only files (not directories). # file first, any such files will be only files (not directories).
...@@ -155,6 +167,7 @@ class FTPFS(ftpserver.AbstractedFS): ...@@ -155,6 +167,7 @@ class FTPFS(ftpserver.AbstractedFS):
mode |= stat.S_IFREG mode |= stat.S_IFREG
elif self.fs.isdir(path): elif self.fs.isdir(path):
mode |= stat.S_IFDIR mode |= stat.S_IFDIR
mode |= 0110 # Merge in exec bit
kwargs['st_mode'] = mode kwargs['st_mode'] = mode
return FakeStat(**kwargs) return FakeStat(**kwargs)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment