Veno-File-Manager (VFM4)云盘让登录用户只显示用户私有文件夹(有读写权限)和公共文件夹方法
需实现功能:
1.用户登录后,显示用户私有文件夹和公共文件夹;
2.游客只能查看并下载公共文件夹内容,无权查看用户私有文件夹。
与解决此漏洞相关文件:
根目录/vfm-admin/class/class.dirs.php //检查当前用户目录权限类(重要)
根目录/vfm-admin/ajax/get-dirs.php //获取用户文件夹并列表显示
根目录/vfm-admin/template/list-folders.php //前端文件夹列表显示UI模板
根目录/vfm-admin/class/class.location.php //检查当前用户位置权限的类
根目录/vfm-admin/class/class.gatekeeper.php //验证当前网关(角色、用户、登录状态)权限的类
解决思路:
打开 根目录/vfm-admin/class/class.dirs.php 文件,查找如下代码:
- $userpatharray = $gateKeeper->getUserInfo('dir') !== null ? json_decode($gateKeeper->getUserInfo('dir'), true) : false;
复制代码 此代码修改为:- $userpatharray = $gateKeeper->getUserInfo('dir') !== null ? json_decode($gateKeeper->getUserInfo('dir'), true) : false;
- $public_dirs = $setUp->getConfig('public_dirs');
- @$userpatharray = array_merge($userpatharray,$public_dirs);
复制代码 修改过后,发现用户访问公共目录(public_dirs)时,不显示子目录,但是手工输入子目录地址可以进入,解决方法如下:
再查找此文件中获取用户分配的文件夹的遍历语句,在此段语句增加一个 && !$this->location->readAllowed($relative) 判断条件,修改后如下:
- if (is_array($content)) {
- foreach ($content as $item) {
- if (is_dir($item)) {
- $mbitem = Utils::mbPathinfo($item);
- $item_basename = $mbitem['basename'];
- // get only users' assigned folders if any
- if ($userpatharray
- && !in_array($item_basename, $userpatharray)
- && !$this->location->editAllowed($relative)
- && !$this->location->readAllowed($relative)) {
- continue;
- }
-
- // Skip /vfm-admin/ if the main uploads dir is the root
- if (!$hidefiles || ($hidefiles && !in_array($item_basename, $hidden_dirs))) {
- $this->dirs[] = new Dir($item_basename, $this->location, $relative);
- }
- }
- }
- }
复制代码
另外根目录/vfm-admin/ajax/get-dirs.php 文件与此功能修改相关,但无需修改,与用户文件夹相关代码如下:
- $thedirs = new Dirs($location, $fullpath, '../../');
- $getdirs = $thedirs->dirs;
复制代码
获取 $getdirs 数组中的数据,并且显示在前端的代码如下:
- $data = array();
- $dirname = $dir->getName();
- $normalized = Utils::normalizeName($dirname);
- $dirpath = $fullpath.$dirname;
- $dirtime = $setUp->formatModTime($dir->getModTime());
- $nameencoded = $dir->getNameEncoded();
- $locationDir = $location->getDir(false, true, false, 0);
- $del = $locationDir.$nameencoded;
- $delquery = base64_encode($del);
- $cash = md5($delquery.$alt.$altone);
- $thislink = $location->makeLink(false, null, $del);
- $thisdel = $location->makeLink(false, $del, $locationDir);
- $thisdir = urldecode($locationDir);
- $dash = md5($alt.base64_encode($thisdir.$normalized).$altone);
- if ($setUp->getConfig("show_folder_counter") === true) {
- $quanti = $dir->countContents('../../'.$location->getDir(false, false, false, 0).$dirname);
- $quantifiles = $quanti['files'];
- $quantedir = $quanti['folders'];
- $data['counter'] = '<a href="'.$thislink.'"><span class="badge rounded-pill bg-light"><i class="bi bi-folder"></i> '.$quantedir.'</span>
- <span class="badge rounded-pill bg-light"><i class="bi bi-files"></i> '.$quantifiles.'</span></a>';
- } else {
- $data['counter'] = '';
- }
复制代码
|
|