You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudreve/application/index/model/ShareHandler.php

322 lines
9.7 KiB

<?php
namespace app\index\model;
use think\Model;
use think\Db;
use \think\Session;
use \app\index\model\FileManage;
use \app\index\model\Option;
use \app\index\model\User;
class ShareHandler extends Model{
public $shareData;
public $querryStatus = true;
public $shareOwner;
public $fileData;
public $dirData;
public $lockStatus = false;
public function __construct($key,$notExist=true){
$this->shareData = Db::name('shares')->where('share_key',$key)->find();
if(empty($this->shareData)){
$this->querryStatus = false;
}else{
if($notExist){
if($this->shareData["source_type"] == "file"){
$this->fileShareHandler();
}else{
$this->dirShareHandler();
}
}
}
if($this->shareData["type"] == "private"){
$this->lockStatus = Session::has("share".$this->shareData["id"])?false:true;
}
}
public function deleteShare($uid){
if($this->shareData["owner"] != $uid){
return array(
"error" => 1,
"msg" => "无权操作"
);
}
Db::name('shares')->where('share_key',$this->shareData["share_key"])->delete();
return array(
"error" => 0,
"msg" => "分享取消成功"
);
}
public function changePromission($uid,$ignore=false){
if($this->shareData["owner"] != $uid && $ignore == false){
return array(
"error" => 1,
"msg" => "无权操作"
);
}
Db::name('shares')->where('share_key',$this->shareData["share_key"])->update([
'type' => $this->shareData["type"] == "public"?"private":"public",
'share_pwd' => self::getRandomKey(6)
]);
return array(
"error" =>0,
"msg" => "更改成功"
);
}
public function checkPwd($pwd){
if($pwd == $this->shareData["share_pwd"]){
Session::set("share".$this->shareData["id"],"1");
return array(
"error" =>0,
);
}else{
return array(
"error" =>1,
"msg" => "密码错误"
);
}
}
public function getThumb($user,$path,$folder=false){
$checkStatus = $this->checkSession($user);
if(!$checkStatus[0]){
return [$checkStatus[0],$checkStatus[1]];
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
if($folder){
$fileObj = new FileManage($path,$this->shareData["owner"]);
}else{
$fileObj = new FileManage($reqPath["position_absolute"].$path,$this->shareData["owner"]);
}
return $fileObj->getThumb();
}
public function checkSession($user){
if($this->lockStatus){
return [false,"会话过期,请刷新页面"];
}
if(Option::getValue("allowdVisitorDownload") == "false" && !$user->loginStatus){
return [false,"未登录用户禁止下载,请先登录"];
}
if(!$this->querryStatus){
return [false,"分享不存在,请检查链接是否正确"];
}
return[true,null];
}
public function Download($user){
$checkStatus = $this->checkSession($user);
if(!$checkStatus[0]){
return [$checkStatus[0],$checkStatus[1]];
}
$reqPath = Db::name('files')->where('id',$this->shareData["source_name"])->find();
if($reqPath["dir"] == "/"){
$reqPath["dir"] = $reqPath["dir"].$reqPath["orign_name"];
}else{
$reqPath["dir"] = $reqPath["dir"]."/".$reqPath["orign_name"];
}
$fileObj = new FileManage($reqPath["dir"],$this->shareData["owner"]);
$FileHandler = $fileObj->Download();
return $FileHandler;
}
public function DownloadFolder($user,$path){
$checkStatus = $this->checkSession($user);
if(!$checkStatus[0]){
return [$checkStatus[0],$checkStatus[1]];
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
$path = $path == "/"?"":$path;
$fileObj = new FileManage($reqPath["position_absolute"].$path,$this->shareData["owner"]);
$this->numIncrease("download_num");
$FileHandler = $fileObj->Download();
return $FileHandler;
}
public function ListFile($path){
if($this->lockStatus){
die('{ "result": { "success": false, "error": "会话过期,请重新登陆" } }');
}
if(!$this->querryStatus){
return [false,"分享不存在,请检查链接是否正确"];
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
$path = $path == "/"?"":$path;
return FileManage::ListFile($this->shareData["source_name"].$path,$this->shareData["owner"]);
}
public function Preview($user){
$checkStatus = $this->checkSession($user);
if(!$checkStatus[0]){
return [$checkStatus[0],$checkStatus[1]];
}
$reqPath = Db::name('files')->where('id',$this->shareData["source_name"])->find();
if($reqPath["dir"] == "/"){
$reqPath["dir"] = $reqPath["dir"].$reqPath["orign_name"];
}else{
$reqPath["dir"] = $reqPath["dir"]."/".$reqPath["orign_name"];
}
$fileObj = new FileManage($reqPath["dir"],$this->shareData["owner"]);
return $fileObj->PreviewHandler();
}
public function PreviewFolder($user,$path,$folder=false){
$checkStatus = $this->checkSession($user);
if(!$checkStatus[0]){
return [$checkStatus[0],$checkStatus[1]];
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
if($folder){
$fileObj = new FileManage($path,$this->shareData["owner"]);
}else{
$fileObj = new FileManage($reqPath["position_absolute"].$path,$this->shareData["owner"]);
}
return $fileObj->PreviewHandler();
}
public function listPic($id,$path){
if($this->lockStatus){
die('{ "result": { "success": false, "error": "会话过期,请重新登陆" } }');
}
if(!$this->querryStatus){
return [false,"分享不存在,请检查链接是否正确"];
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
$path = $path == "/"?"":$path;
return FileManage::listPic($this->shareData["source_name"].$path,$this->shareData["owner"],"/Share/Preview/".$this->shareData["share_key"]."?folder=true");
}
public function numIncrease($name){
Db::name('shares')->where('share_key',$this->shareData["share_key"])->setInc($name);
}
public function getDownloadUrl($user){
if(Option::getValue("allowdVisitorDownload") == "false" && !$user->loginStatus){
return array(
"error" => 1,
"msg" => "未登录用户禁止下载,请先登录",
);
}else{
$this->numIncrease("download_num");
return array(
"error" => 0,
"result" => "/Share/Download/".$this->shareData["share_key"],
);
}
}
public function fileShareHandler(){
$this->shareOwner = new User($this->shareData["owner"],null,true);
$this->fileData = Db::name('files')
->where('upload_user',$this->shareData["owner"])
->where('id',(int)$this->shareData["source_name"])
->find();
if(!$this->shareOwner->loginStatus || empty($this->fileData)){
$this->querryStatus = false;
}else{
$this->querryStatus = true;
}
}
public function dirShareHandler(){
$this->shareOwner = new User($this->shareData["owner"],null,true);
$this->dirData = Db::name('folders')
->where('owner',$this->shareData["owner"])
->where('position_absolute',$this->shareData["source_name"])
->find();
if(!$this->shareOwner->loginStatus || empty($this->dirData)){
$this->querryStatus = false;
}else{
$this->querryStatus = true;
}
}
static function createShare($fname,$type,$user,$group){
if(!$group["allow_share"]){
self::setError("您当前的用户组无权分享文件");
}
$path = FileManage::getFileName($fname)[1];
$fnameTmp = FileManage::getFileName($fname)[0];
$fileRecord = Db::name('files')->where('upload_user',$user["id"])->where('orign_name',$fnameTmp)->where('dir',$path)->find();
if(empty($fileRecord)){
self::createDirShare($fname,$type,$user,$group);
}else{
self::createFileShare($fileRecord,$type,$user,$group);
}
}
static function setError($text){
die('{ "result": { "success": false, "error": "'.$text.'" } }');
}
static function setSuccess($text){
die('{ "result": "'.$text.'" }');
}
static function createDirShare($fname,$type,$user,$group){
$dirRecord = Db::name('folders')->where('owner',$user["id"])->where('position_absolute',$fname)->find();
if(empty($dirRecord)){
self::setError("目录不存在");
}
$shareKey = self::getRandomKey(8);
$sharePwd = $type=="public" ? "0" : self::getRandomKey(6);
$SQLData = [
'type' => $type=="public" ? "public" : "private",
'share_time' => date("Y-m-d H:i:s"),
'owner' => $user["id"],
'source_name' => $fname,
'origin_name' => $fname,
'download_num' => 0,
'view_num' => 0,
'source_type' => "dir",
'share_key' => $shareKey,
'share_pwd' => $sharePwd,
];
if(Db::name('shares')->insert($SQLData)){
if($sharePwd == "0"){
self::setSuccess(Option::getValue("siteURL")."s/".$shareKey);
}else{
self::setSuccess("链接:".Option::getValue("siteURL")."s/".$shareKey." 密码:".$sharePwd);
}
}
}
static function createFileShare($file,$type,$user,$group){
$shareKey = self::getRandomKey(8);
$sharePwd = $type=="public" ? "0" : self::getRandomKey(6);
$SQLData = [
'type' => $type=="public" ? "public" : "private",
'share_time' => date("Y-m-d H:i:s"),
'owner' => $user["id"],
'source_name' => $file["id"],
'origin_name' => $file["orign_name"],
'download_num' => 0,
'view_num' => 0,
'source_type' => "file",
'share_key' => $shareKey,
'share_pwd' => $sharePwd,
];
if(Db::name('shares')->insert($SQLData)){
if($sharePwd == "0"){
self::setSuccess(Option::getValue("siteURL")."s/".$shareKey);
}else{
self::setSuccess("链接:".Option::getValue("siteURL")."s/".$shareKey." 密码:".$sharePwd);
}
}
}
static function getRandomKey($length = 16){
$charTable = 'abcdefghijklmnopqrstuvwxyz0123456789';
$result = "";
for ( $i = 0; $i < $length; $i++ ){
$result .= $charTable[ mt_rand(0, strlen($charTable) - 1) ];
}
return $result;
}
}
?>