热搜词
发表于 2022-8-29 17:18:47 | 显示全部楼层 |阅读模式
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   文件,查找如下代码:
  1. $userpatharray = $gateKeeper->getUserInfo('dir') !== null ? json_decode($gateKeeper->getUserInfo('dir'), true) : false;
复制代码
此代码修改为:
  1. $userpatharray = $gateKeeper->getUserInfo('dir') !== null ? json_decode($gateKeeper->getUserInfo('dir'), true) : false;
  2. $public_dirs = $setUp->getConfig('public_dirs');
  3. @$userpatharray = array_merge($userpatharray,$public_dirs);
复制代码
修改过后,发现用户访问公共目录(public_dirs)时,不显示子目录,但是手工输入子目录地址可以进入,解决方法如下:
再查找此文件中获取用户分配的文件夹的遍历语句,在此段语句增加一个 && !$this->location->readAllowed($relative) 判断条件,修改后如下:
  1. if (is_array($content)) {
  2.     foreach ($content as $item) {

  3.         if (is_dir($item)) {

  4.             $mbitem = Utils::mbPathinfo($item);
  5.             $item_basename = $mbitem['basename'];

  6.             // get only users' assigned folders if any
  7.             if ($userpatharray
  8.             && !in_array($item_basename, $userpatharray)
  9.             && !$this->location->editAllowed($relative)
  10.             && !$this->location->readAllowed($relative)) {
  11. continue;
  12.             }
  13.         
  14.             // Skip /vfm-admin/ if the main uploads dir is the root
  15.             if (!$hidefiles || ($hidefiles && !in_array($item_basename, $hidden_dirs))) {
  16. $this->dirs[] = new Dir($item_basename, $this->location, $relative);
  17.             }
  18.         }
  19.     }
  20. }
复制代码


另外根目录/vfm-admin/ajax/get-dirs.php 文件与此功能修改相关,但无需修改,与用户文件夹相关代码如下:
  1.     $thedirs = new Dirs($location, $fullpath, '../../');
  2.     $getdirs = $thedirs->dirs;
复制代码

获取 $getdirs 数组中的数据,并且显示在前端的代码如下:
  1. $data = array();

  2. $dirname = $dir->getName();
  3. $normalized = Utils::normalizeName($dirname);
  4. $dirpath = $fullpath.$dirname;
  5. $dirtime = $setUp->formatModTime($dir->getModTime());
  6. $nameencoded = $dir->getNameEncoded();
  7. $locationDir = $location->getDir(false, true, false, 0);
  8. $del = $locationDir.$nameencoded;
  9. $delquery = base64_encode($del);
  10. $cash = md5($delquery.$alt.$altone);
  11. $thislink = $location->makeLink(false, null, $del);
  12. $thisdel = $location->makeLink(false, $del, $locationDir);
  13. $thisdir = urldecode($locationDir);
  14. $dash = md5($alt.base64_encode($thisdir.$normalized).$altone);

  15. if ($setUp->getConfig("show_folder_counter") === true) {
  16.     $quanti = $dir->countContents('../../'.$location->getDir(false, false, false, 0).$dirname);
  17.     $quantifiles = $quanti['files'];
  18.     $quantedir = $quanti['folders'];

  19.     $data['counter'] = '<a href="'.$thislink.'"><span class="badge rounded-pill bg-light"><i class="bi bi-folder"></i> '.$quantedir.'</span>
  20.     <span class="badge rounded-pill bg-light"><i class="bi bi-files"></i> '.$quantifiles.'</span></a>';
  21. } else {
  22.     $data['counter'] = '';
  23. }
复制代码








全部评论1
灰儿 发表于 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)云盘,增加用户只读游客无权限公共目录


回复

使用道具 举报

回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2024-12-27 19:30 , Processed in 0.215993 second(s), 31 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2024 Discuz! Team