灰儿 发表于 2022-8-29 17:18:47

Veno-File-Manager (VFM4)云盘让登录用户可显示公共文件夹方法

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'] = '';
}







灰儿 发表于 2022-8-29 17:19:24

http://www.admin365.cn/thread-46373-1-1.html
Veno-File-Manager (VFM4)云盘,添加仅限游客和用户访问公共目录

http://www.admin365.cn/thread-46386-1-1.html
Veno-File-Manager (VFM4)云盘让登录用户可显示公共文件夹方法

http://www.admin365.cn/thread-46442-1-1.html
Veno-File-Manager (VFM4)云盘,增加用户只读游客无权限公共目录


页: [1]
查看完整版本: Veno-File-Manager (VFM4)云盘让登录用户可显示公共文件夹方法