78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
import os
|
|
|
|
from storage.base import Storage, Objects
|
|
|
|
class FSStorage(Storage):
|
|
"""
|
|
Simple filesystem storage
|
|
"""
|
|
|
|
def __init__(self, base_path="storage"):
|
|
super().__init__()
|
|
self.base_path = os.path.abspath(base_path)
|
|
os.makedirs(self.base_path, exist_ok=True)
|
|
self.current_dir = "/"
|
|
|
|
def _topath(self, path):
|
|
"""Transform a path to a full path"""
|
|
return os.path.join(self.base_path, path) # TODO: Modifier ca
|
|
if path.startswith("/"):
|
|
return os.path.join(self.base_path, # Always add baspath to avoid going outside protected zone
|
|
os.path.abspath(os.path.join(self.base_path,
|
|
os.path.normpath(path))).lstrip(self.base_path))
|
|
else:
|
|
return os.path.join(self.base_path, # Always add baspath to avoid going outside protected zone
|
|
os.path.abspath(os.path.join(self.base_path,
|
|
self.current_dir,
|
|
os.path.normpath(path))).lstrip(self.base_path))
|
|
|
|
def access(self, path):
|
|
# Normalize path and transform it to absolute path, remove base_path part and add it again to avoid going
|
|
# outside protected folder
|
|
return os.access(self._topath(path))
|
|
|
|
def chdir(self, path):
|
|
self.current_dir = self._topath(path)
|
|
return self.current_dir
|
|
|
|
def getcwd(self):
|
|
return self.current_dir
|
|
|
|
def listdir(self, path="."):
|
|
return os.listdir(self._topath(path))
|
|
|
|
def mkdir(self, path, exist_ok=False):
|
|
if exist_ok:
|
|
if self.exists(path):
|
|
return self._topath(path)
|
|
os.mkdir(self._topath(path))
|
|
return self._topath(path)
|
|
|
|
def makedirs(self, path, exist_ok=False):
|
|
os.makedirs(self._topath(path), exist_ok=exist_ok)
|
|
return self._topath(path)
|
|
|
|
def remove(self, path):
|
|
os.remove(self._topath(path))
|
|
|
|
def rename(self, src, dst):
|
|
os.rename(self._topath(src), self._topath(dst))
|
|
return self._topath(dst)
|
|
|
|
def rmdir(self, path):
|
|
os.rmdir(self._topath(path))
|
|
|
|
def sync(self):
|
|
os.sync()
|
|
|
|
def open(self, path, mode):
|
|
return open(self._topath(path), mode)
|
|
|
|
def exists(self, path):
|
|
return os.path.exists(self._topath(path))
|
|
|
|
def isdir(self, path):
|
|
return os.path.isdir(self._topath(path))
|
|
|
|
class FSObjects(Objects):
|
|
pass |