mirror of
https://github.com/9001/copyparty.git
synced 2025-09-28 12:42:26 -06:00
fence fileshares to just those files
when a share is created for just a single file, it was possible to guess other filenames in the source folder and access those files
This commit is contained in:
parent
98386f28f0
commit
e0a92ba72d
|
@ -431,6 +431,8 @@ class VFS(object):
|
||||||
|
|
||||||
self.get_dbv = self._get_dbv
|
self.get_dbv = self._get_dbv
|
||||||
self.ls = self._ls
|
self.ls = self._ls
|
||||||
|
self.canonical = self._canonical
|
||||||
|
self.dcanonical = self._dcanonical
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return "VFS(%s)" % (
|
return "VFS(%s)" % (
|
||||||
|
@ -624,7 +626,7 @@ class VFS(object):
|
||||||
vrem = vjoin(self.vpath[len(dbv.vpath) :].lstrip("/"), vrem)
|
vrem = vjoin(self.vpath[len(dbv.vpath) :].lstrip("/"), vrem)
|
||||||
return dbv, vrem
|
return dbv, vrem
|
||||||
|
|
||||||
def canonical(self, rem: str, resolve: bool = True) -> str:
|
def _canonical(self, rem: str, resolve: bool = True) -> str:
|
||||||
"""returns the canonical path (fully-resolved absolute fs path)"""
|
"""returns the canonical path (fully-resolved absolute fs path)"""
|
||||||
ap = self.realpath
|
ap = self.realpath
|
||||||
if rem:
|
if rem:
|
||||||
|
@ -632,7 +634,7 @@ class VFS(object):
|
||||||
|
|
||||||
return absreal(ap) if resolve else ap
|
return absreal(ap) if resolve else ap
|
||||||
|
|
||||||
def dcanonical(self, rem: str) -> str:
|
def _dcanonical(self, rem: str) -> str:
|
||||||
"""resolves until the final component (filename)"""
|
"""resolves until the final component (filename)"""
|
||||||
ap = self.realpath
|
ap = self.realpath
|
||||||
if rem:
|
if rem:
|
||||||
|
@ -641,6 +643,44 @@ class VFS(object):
|
||||||
ad, fn = os.path.split(ap)
|
ad, fn = os.path.split(ap)
|
||||||
return os.path.join(absreal(ad), fn)
|
return os.path.join(absreal(ad), fn)
|
||||||
|
|
||||||
|
def _canonical_shr(self, rem: str, resolve: bool = True) -> str:
|
||||||
|
"""returns the canonical path (fully-resolved absolute fs path)"""
|
||||||
|
ap = self.realpath
|
||||||
|
if rem:
|
||||||
|
ap += "/" + rem
|
||||||
|
|
||||||
|
rap = absreal(ap)
|
||||||
|
if self.shr_files:
|
||||||
|
assert self.shr_src # !rm
|
||||||
|
vn, rem = self.shr_src
|
||||||
|
chk = absreal(os.path.join(vn.realpath, rem))
|
||||||
|
if chk != rap:
|
||||||
|
# not the dir itself; assert file allowed
|
||||||
|
ad, fn = os.path.split(rap)
|
||||||
|
if chk != ad or fn not in self.shr_files:
|
||||||
|
return "\n\n"
|
||||||
|
|
||||||
|
return rap if resolve else ap
|
||||||
|
|
||||||
|
def _dcanonical_shr(self, rem: str) -> str:
|
||||||
|
"""resolves until the final component (filename)"""
|
||||||
|
ap = self.realpath
|
||||||
|
if rem:
|
||||||
|
ap += "/" + rem
|
||||||
|
|
||||||
|
ad, fn = os.path.split(ap)
|
||||||
|
ad = absreal(ad)
|
||||||
|
if self.shr_files:
|
||||||
|
assert self.shr_src # !rm
|
||||||
|
vn, rem = self.shr_src
|
||||||
|
chk = absreal(os.path.join(vn.realpath, rem))
|
||||||
|
if chk != absreal(ap):
|
||||||
|
# not the dir itself; assert file allowed
|
||||||
|
if ad != chk or fn not in self.shr_files:
|
||||||
|
return "\n\n"
|
||||||
|
|
||||||
|
return os.path.join(ad, fn)
|
||||||
|
|
||||||
def _ls_nope(
|
def _ls_nope(
|
||||||
self, *a, **ka
|
self, *a, **ka
|
||||||
) -> tuple[str, list[tuple[str, os.stat_result]], dict[str, "VFS"]]:
|
) -> tuple[str, list[tuple[str, os.stat_result]], dict[str, "VFS"]]:
|
||||||
|
@ -2751,6 +2791,8 @@ class AuthSrv(object):
|
||||||
|
|
||||||
shn.shr_files = set(fns)
|
shn.shr_files = set(fns)
|
||||||
shn.ls = shn._ls_shr
|
shn.ls = shn._ls_shr
|
||||||
|
shn.canonical = shn._canonical_shr
|
||||||
|
shn.dcanonical = shn._dcanonical_shr
|
||||||
else:
|
else:
|
||||||
shn.ls = shn._ls
|
shn.ls = shn._ls
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue