def test_is_hidden(): with TemporaryDirectory() as root: subdir1 = os.path.join(root, 'subdir') os.makedirs(subdir1) assert is_hidden(subdir1, root) == False assert is_file_hidden(subdir1) == False subdir2 = os.path.join(root, '.subdir2') os.makedirs(subdir2) assert is_hidden(subdir2, root) == True assert is_file_hidden(subdir2) == True # root dir is always visible assert is_hidden(subdir2, subdir2) == False subdir34 = os.path.join(root, 'subdir3', '.subdir4') os.makedirs(subdir34) assert is_hidden(subdir34, root) == True assert is_hidden(subdir34) == True subdir56 = os.path.join(root, '.subdir5', 'subdir6') os.makedirs(subdir56) assert is_hidden(subdir56, root) == True assert is_hidden(subdir56) == True assert is_file_hidden(subdir56) == False assert is_file_hidden(subdir56, os.stat(subdir56)) == False
def test_is_hidden(): with TemporaryDirectory() as root: subdir1 = os.path.join(root, 'subdir') os.makedirs(subdir1) nt.assert_equal(is_hidden(subdir1, root), False) nt.assert_equal(is_file_hidden(subdir1), False) subdir2 = os.path.join(root, '.subdir2') os.makedirs(subdir2) nt.assert_equal(is_hidden(subdir2, root), True) nt.assert_equal(is_file_hidden(subdir2), True) # # root dir is always visible nt.assert_equal(is_hidden(subdir2, subdir2), False) subdir34 = os.path.join(root, 'subdir3', '.subdir4') os.makedirs(subdir34) nt.assert_equal(is_hidden(subdir34, root), True) nt.assert_equal(is_hidden(subdir34), True) subdir56 = os.path.join(root, '.subdir5', 'subdir6') os.makedirs(subdir56) nt.assert_equal(is_hidden(subdir56, root), True) nt.assert_equal(is_hidden(subdir56), True) nt.assert_equal(is_file_hidden(subdir56), False) nt.assert_equal(is_file_hidden(subdir56, os.stat(subdir56)), False)
def test_is_hidden(): with TemporaryDirectory() as root: subdir1 = os.path.join(root, 'subdir') os.makedirs(subdir1) nt.assert_equal(is_hidden(subdir1, root), False) nt.assert_equal(is_file_hidden(subdir1), False) subdir2 = os.path.join(root, '.subdir2') os.makedirs(subdir2) nt.assert_equal(is_hidden(subdir2, root), True) nt.assert_equal(is_file_hidden(subdir2), True)# # root dir is always visible nt.assert_equal(is_hidden(subdir2, subdir2), False) subdir34 = os.path.join(root, 'subdir3', '.subdir4') os.makedirs(subdir34) nt.assert_equal(is_hidden(subdir34, root), True) nt.assert_equal(is_hidden(subdir34), True) subdir56 = os.path.join(root, '.subdir5', 'subdir6') os.makedirs(subdir56) nt.assert_equal(is_hidden(subdir56, root), True) nt.assert_equal(is_hidden(subdir56), True) nt.assert_equal(is_file_hidden(subdir56), False) nt.assert_equal(is_file_hidden(subdir56, os.stat(subdir56)), False)
def _proj_model(self, path, content=True): """ Build a model for a directory if content is requested, will include a listing of the directory """ os_path = self._get_os_path(path) four_o_four = u'directory does not exist: %r' % path if not os.path.isdir(os_path): raise web.HTTPError(404, four_o_four) elif is_hidden(os_path, self.root_dir): self.log.info( "Refusing to serve hidden directory %r, via 404 Error", os_path) raise web.HTTPError(404, four_o_four) model = self._base_model(path) model['type'] = 'directory' model['is_project'] = True if content: model['content'] = contents = [] os_dir = self._get_os_path(path) for name in os.listdir(os_dir): try: os_path = os.path.join(os_dir, name) except UnicodeDecodeError as e: self.log.warning("failed to decode filename '%s': %s", name, e) continue try: st = os.stat(os_path) except OSError as e: # skip over broken symlinks in listing if e.errno == errno.ENOENT: self.log.warning("%s doesn't exist", os_path) else: self.log.warning("Error stat-ing %s: %s", os_path, e) continue if not stat.S_ISREG(st.st_mode) and not stat.S_ISDIR( st.st_mode): self.log.debug("%s not a regular file", os_path) continue if self.should_list(name) and not is_file_hidden(os_path, stat_res=st): contents.append( self.get(path='%s/%s' % (path, name), content=False)) model['format'] = 'json' return model
def ls(self, path, contain_hidden=False): path_ = self.path(path) self.log.debug("S3contents.GFFS: Listing directory: `%s`", path_) files = [ path + self.separator + f for f in self.fs.listdir(path_) if contain_hidden or not is_file_hidden(f) ] return self.unprefix(files)
def _dir_model(self, path, content=True): """Build a model for a directory if content is requested, will include a listing of the directory """ os_path = self._get_os_path(path) four_o_four = u'directory does not exist: %r' % path if not os.path.isdir(os_path): raise web.HTTPError(404, four_o_four) elif is_hidden(os_path, self.root_dir) and not self.allow_hidden: self.log.info("Refusing to serve hidden directory %r, via 404 Error", os_path ) raise web.HTTPError(404, four_o_four) model = self._base_model(path) model['type'] = 'directory' model['size'] = None if content: model['content'] = contents = [] os_dir = self._get_os_path(path) for name in os.listdir(os_dir): try: os_path = os.path.join(os_dir, name) except UnicodeDecodeError as e: self.log.warning( "failed to decode filename '%s': %s", name, e) continue try: st = os.lstat(os_path) except OSError as e: # skip over broken symlinks in listing if e.errno == errno.ENOENT: self.log.warning("%s doesn't exist", os_path) else: self.log.warning("Error stat-ing %s: %s", os_path, e) continue if (not stat.S_ISLNK(st.st_mode) and not stat.S_ISREG(st.st_mode) and not stat.S_ISDIR(st.st_mode)): self.log.debug("%s not a regular file", os_path) continue if self.should_list(name): if self.allow_hidden or not is_file_hidden(os_path, stat_res=st): contents.append( self.get(path='%s/%s' % (path, name), content=False) ) model['format'] = 'json' return model
def test_is_hidden_win32(): with TemporaryDirectory() as root: root = cast_unicode(root) subdir1 = os.path.join(root, u'subdir') os.makedirs(subdir1) assert not is_hidden(subdir1, root) r = ctypes.windll.kernel32.SetFileAttributesW(subdir1, 0x02) print(r) assert is_hidden(subdir1, root) assert is_file_hidden(subdir1)
def _get_visibles(self, root=None): if root is None: root = self.root_dir result = set() list = os.listdir(root) for name in list: try: os_path = os.path.join(root, name) except UnicodeDecodeError as e: self.log.warning("failed to decode filename '%s': %s", name, e) continue try: st = os.lstat(os_path) except OSError as e: if e.errno == errno.ENOENT: self.log.warning("%s doesn't exist", os_path) else: self.log.warning("Error stat-ing %s: %s", os_path, e) continue if not stat.S_ISLNK(st.st_mode) and not stat.S_ISREG( st.st_mode) and not stat.S_ISDIR(st.st_mode): self.log.debug("%s not a regular file", os_path) continue if not self.should_list(name): continue if not self.allow_hidden and is_file_hidden(os_path, stat_res=st): continue can_read = self.is_path_accessible_for_read(os_path) can_write = self.is_path_accessible_for_write(os_path) if can_read or can_write: result.add(os_path) inner = self._get_visibles(os_path) if os.path.isdir( os_path) else set() if len(inner) > 0: result.add(root) result.add(os_path) result = result | inner return result
def _dir_model(self, path, content=True): """Build a model for a directory if content is requested, will include a listing of the directory """ os_path = self._get_os_path(path) four_o_four = u'directory does not exist: %r' % path if not os.path.isdir(os_path): raise web.HTTPError(404, four_o_four) elif is_hidden(os_path, self.root_dir) and not self.allow_hidden: self.log.info( "Refusing to serve hidden directory %r, via 404 Error", os_path) raise web.HTTPError(404, four_o_four) model = self._base_model(path) model['type'] = 'directory' model['size'] = None if content: model['content'] = contents = [] os_dir = self._get_os_path(path) for name in os.listdir(os_dir): self.log.warning("Looking at %s", name) try: os_path = os.path.join(os_dir, name) except UnicodeDecodeError as e: self.log.warning("failed to decode filename '%s': %s", name, e) continue try: self.log.warning("os.lstat begin %s %s", name, datetime.now()) st = os.lstat(os_path) self.log.warning("os.lstat end %s %s", name, datetime.now()) except OSError as e: # skip over broken symlinks in listing if e.errno == errno.ENOENT: self.log.warning("%s doesn't exist", os_path) else: self.log.warning("Error stat-ing %s: %s", os_path, e) continue self.log.warning("stat.IS_checks start %s %s", name, datetime.now()) if (not stat.S_ISLNK(st.st_mode) and not stat.S_ISREG(st.st_mode) and not stat.S_ISDIR(st.st_mode)): self.log.debug("%s not a regular file", os_path) continue self.log.warning("stat.IS_checks end %s %s", name, datetime.now()) try: if self.should_list(name): if self.allow_hidden or not is_file_hidden( os_path, stat_res=st): contents.append( self.get(path='%s/%s' % (path, name), content=False)) except OSError as e: # ELOOP: recursive symlink if e.errno != errno.ELOOP: self.log.warning( "Unknown error checking if file %r is hidden", os_path, exc_info=True, ) model['format'] = 'json' return model
def _dir_model(self, path, content=True): """Build a model for a directory if content is requested, will include a listing of the directory """ os_path = self._get_os_path(path) four_o_four = u'directory does not exist: %r' % path if not os.path.isdir(os_path): raise web.HTTPError(404, four_o_four) elif is_hidden(os_path, self.root_dir) and not self.allow_hidden: self.log.info("Refusing to serve hidden directory %r, via 404 Error", os_path ) raise web.HTTPError(404, four_o_four) model = self._base_model(path) model['type'] = 'directory' model['size'] = None if content: model['content'] = contents = [] os_dir = self._get_os_path(path) for name in os.listdir(os_dir): try: os_path = os.path.join(os_dir, name) except UnicodeDecodeError as e: self.log.warning( "failed to decode filename '%s': %s", name, e) continue try: st = os.lstat(os_path) except OSError as e: # skip over broken symlinks in listing if e.errno == errno.ENOENT: self.log.warning("%s doesn't exist", os_path) else: # iOS: happens too often for .com.apple.mobile_container_manager.metadata.plist # removed it to reclaim the log file if not (sys.platform == "darwin" and os.uname().machine.startswith("iP")): self.log.warning("Error stat-ing %s: %s", os_path, e) continue if (not stat.S_ISLNK(st.st_mode) and not stat.S_ISREG(st.st_mode) and not stat.S_ISDIR(st.st_mode)): self.log.debug("%s not a regular file", os_path) continue try: if self.should_list(name): if self.allow_hidden or not is_file_hidden(os_path, stat_res=st): contents.append( self.get(path='%s/%s' % (path, name), content=False) ) except OSError as e: # ELOOP: recursive symlink if e.errno != errno.ELOOP: self.log.warning( "Unknown error checking if file %r is hidden", os_path, exc_info=True, ) model['format'] = 'json' return model
def _dir_model(self, path, content=True): os_path = self._get_os_path(path) four_o_four = u'directory does not exist: %r' % path visibles = self._get_visibles() app_log.info( {'#########################################': self.user_info}) if not os.path.isdir(os_path): raise web.HTTPError(404, four_o_four) elif is_hidden(os_path, self.root_dir) and not self.allow_hidden: self.log.info( "Refusing to serve hidden directory %r, via 404 Error", os_path) raise web.HTTPError(404, four_o_four) model = self._base_model(path) model['type'] = 'directory' model['size'] = None model['content'] = contents = [] if content: os_dir = self._get_os_path(path) list = os.listdir(os_dir) for name in list: try: os_path = os.path.join(os_dir, name) except UnicodeDecodeError as e: self.log.warning("failed to decode filename '%s': %s", name, e) continue try: st = os.lstat(os_path) except OSError as e: if e.errno == errno.ENOENT: self.log.warning("%s doesn't exist", os_path) else: self.log.warning("Error stat-ing %s: %s", os_path, e) continue if not stat.S_ISLNK(st.st_mode) and not stat.S_ISREG( st.st_mode) and not stat.S_ISDIR(st.st_mode): self.log.debug("%s not a regular file", os_path) continue if not self.should_list(name): continue if not self.allow_hidden and is_file_hidden(os_path, stat_res=st): continue if not os.path.isdir(os_path): m = self.get( path='%s/%s' % (path, name), content=False) if os_path in visibles else None else: m = self._dir_model( path='%s/%s' % (path, name), content=False) if os_path in visibles else None if m is not None: contents.append(m) model['format'] = 'json' return model