skycaiji/SkycaijiApp/admin/controller/Store.php

369 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/*
|--------------------------------------------------------------------------
| SkyCaiji (蓝天采集器)
|--------------------------------------------------------------------------
| Copyright (c) 2018 https://www.skycaiji.com All rights reserved.
|--------------------------------------------------------------------------
| 使用协议 https://www.skycaiji.com/licenses
|--------------------------------------------------------------------------
*/
namespace skycaiji\admin\controller;
class Store extends BaseController {
public function isLoginAction(){
if(empty($GLOBALS['_sc']['user'])){
$this->dispatchJump(false,lang('user_error_is_not_admin'),url('Admin/Index/index',null,null,true));
}else{
if(request()->isAjax()){
$token=$this->_getToken();
if(empty($token)){
$token=md5(request()->server('HTTP_ORIGIN').date('Y-m-d H:i:s',time()).rand(1,1000000));
session('store_token',array('token'=>$token,time=>time()));
}
$this->dispatchJump(true,$token);
}else{
$this->dispatchJump(false,'无效的操作!');
}
}
}
public function indexAction(){
$url=input('url','','strip_tags');
if(!empty($url)&&!is_official_url($url)){
$provData=model('Provider')->where('url',$url)->find();
if(empty($provData)){
$this->error($url.' 平台未添加');
}
if(empty($provData['enable'])){
$this->error($url.' 已设置为拒绝访问');
}
$url=$provData['url'];
$url.=strpos($url, '?')===false?'?':'&';
$url.='clientinfo='.urlencode($GLOBALS['_sc']['clientinfo']);
$this->assign('provData',$provData);
}
if(empty($url)){
$url='https://www.skycaiji.com/store';
}
if(!empty($url)){
}
$GLOBALS['_sc']['p_name']=lang('store');
$GLOBALS['_sc']['p_nav']=breadcrumb(array(array('url'=>url('Store/index'),'title'=>lang('store'))));
$this->assign('url',$url);
return $this->fetch();
}
/*安装规则*/
public function installRuleAction(){
$this->_checkRequest();
$mrule=model('Rule');
$rule=json_decode(base64_decode(input('post.rule')),true);
$store_id=intval($rule['store_id']);
if(empty($store_id)){
$this->dispatchJump(false,'规则id为空');
}
if(empty($rule['name'])){
$this->dispatchJump(false,'名称为空');
}
if(empty($rule['type'])){
$this->dispatchJump(false,'类型错误');
}
if(empty($rule['module'])){
$this->dispatchJump(false,'模块错误');
}
$rule['config']=base64_decode($rule['config']);
if(empty($rule['config'])){
$this->dispatchJump(false,'规则为空');
}
if($store_id>0){
$newRule=array('type'=>$rule['type'],'module'=>$rule['module'],'store_id'=>$store_id,'name'=>$rule['name'],'uptime'=>($rule['uptime']>0?$rule['uptime']:time()),'config'=>$rule['config']);
$newRule['provider_id']=$this->_getStoreProvid($rule['store_url']);
$ruleData=$mrule->where(array('store_id'=>$newRule['store_id'],'provider_id'=>$newRule['provider_id']))->find();
if(empty($ruleData)){
$newRule['addtime']=NOW_TIME;
$mrule->isUpdate(false)->allowField(true)->save($newRule);
$ruleId=$mrule->id;
}else{
$mrule->strict(false)->where(array('id'=>$ruleData['id']))->update($newRule);
$ruleId=$ruleData['id'];
}
$this->dispatchJump(true,$ruleId);
}else{
$this->dispatchJump(false,'id错误');
}
}
/*安装插件*/
public function installPluginAction(){
$this->_checkRequest();
$plugin=json_decode(base64_decode(input('post.plugin')),true);
$result=$this->_installPlugin($plugin);
$this->dispatchJump($result['success'],$result['msg']);
}
/*安装应用程序*/
public function installAppAction(){
$this->_checkRequest();
$app=json_decode(base64_decode(input('post.app')),true);
if(empty($app['app'])){
$this->dispatchJump(false,'app标识错误');
}
if(!preg_match('/^[\w\-]+$/',$app['app'])){
$this->dispatchJump(false,'app标识不规范');
}
if(empty($app['data'])){
$this->dispatchJump(false,'数据错误');
}
$app['data']=base64_decode($app['data']);
$filePath=RUNTIME_PATH.'/cache_app_zip/'.$app['app'].'/';
$complete=false;
if($app['block']>0){
$app['no']=intval($app['no']);
write_dir_file($filePath.$app['no'],$app['data']);
$blockComplete=true;
for($i=1;$i<=$app['block'];$i++){
if(!file_exists($filePath.$i)){
$blockComplete=false;
break;
}
}
if($blockComplete){
$data=null;
for($i=1;$i<=$app['block'];$i++){
$data.=file_get_contents($filePath.$i);
}
write_dir_file($filePath.$app['app'].'.zip',$data);
$complete=true;
unset($data);
}
}else{
write_dir_file($filePath.$app['app'].'.zip',$app['data']);
$complete=true;
}
if($complete){
$error='';
try {
$zipClass=new \ZipArchive();
if($zipClass->open($filePath.$app['app'].'.zip')===TRUE){
$zipClass->extractTo(config('apps_path').'/'.$app['app']);
$zipClass->close();
}else{
$error='解压失败';
}
}catch(\Exception $ex){
$error='您的服务器不支持ZipArchive解压';
}
if($error){
$this->dispatchJump(false,$error);
}else{
clear_dir($filePath);
$this->dispatchJump(true);
}
}else{
$this->dispatchJump(true);
}
}
/*统一检测更新*/
public function updateAction(){
$updateList=array('status'=>1,'data'=>array());
if(request()->isAjax()){
$storeIds=input('store_ids');
$storeIds=explode(',', $storeIds);
$storeApps=input('store_apps');
$storeApps=explode(',', $storeApps);
$storeIdList=array();
foreach ($storeIds as $id){
if(preg_match('/^(\w+)_(\w+)$/',$id,$id)){
$storeIdList[$id[1]][$id[2]]=$id[2];
}
}
$storeAppList=array();
foreach ($storeApps as $app){
if(preg_match('/^(\w+)_(\w+)$/',$app,$app)){
$storeAppList[$app[1]][$app[2]]=$app[2];
}
}
$provId=$this->_getStoreProvid(input('store_url'));
if(!empty($storeIdList)){
foreach ($storeIdList as $type=>$ids){
$list=array();
$cond=array('store_id'=>array('in',$ids),'provider_id'=>$provId,'type'=>$type);
$list=model('Rule')->field('`id`,`store_id`,`uptime`')->where($cond)->column('uptime','store_id');
$list=is_array($list)?$list:array();
$updateList['data'][$type]=$list;
}
}
if(!empty($storeAppList)){
foreach ($storeAppList as $type=>$apps){
if(empty($type)){
continue;
}
$list=array();
$cond=array('app'=>array('in',$apps),'provider_id'=>$provId);
if($type=='release'||$type=='cms'){
$list=model('ReleaseApp')->where($cond)->column('uptime','app');
}elseif($type=='func'){
$list=model('FuncApp')->where($cond)->column('uptime','app');
}elseif($type=='app'){
foreach ($apps as $app){
$appClass=model('App')->app_class($app,false);
$list[$app]=$appClass->config['version'];
}
}
$list=is_array($list)?$list:array();
$updateList['data'][$type]=$list;
}
}
}
return jsonp($updateList);
}
/*站点验证*/
public function siteCertificationAction(){
if(request()->isAjax()){
$op=input('op');
if($op=='set_key'){
$key=input('post.key');
if(empty($key)){
$this->dispatchJump(false,'密钥错误');
}
cache('site_certification',array('key'=>$key,'time'=>NOW_TIME));
$this->dispatchJump(true);
}else{
$this->dispatchJump(false,'操作错误!');
}
}else{
$this->dispatchJump(false,'无效的操作!');
}
}
public function _installPlugin($plugin){
$result=array('success'=>false,'msg'=>'');
$plugin['code']=base64_decode($plugin['code']);
if(empty($plugin['app'])){
$result['msg']='标识错误';
return $result;
}
if(empty($plugin['name'])){
$result['msg']='名称错误';
return $result;
}
if(empty($plugin['type'])){
$result['msg']='类型错误';
return $result;
}
if(empty($plugin['module'])){
$result['msg']='模块错误';
return $result;
}
if(empty($plugin['code'])){
$result['msg']='插件文件错误';
return $result;
}
if(!empty($plugin['tpl'])){
$plugin['tpl']=base64_decode($plugin['tpl']);
}
$newData=array('app'=>$plugin['app'],'name'=>$plugin['name'],'desc'=>$plugin['desc'],'uptime'=>$plugin['uptime']);
$newData['provider_id']=$this->_getStoreProvid($plugin['store_url']);
if($plugin['type']=='release'){
$success=model('ReleaseApp')->addCms($newData,$plugin['code'],$plugin['tpl']);
$result['success']=$success?true:false;
$result['msg']=$result['success']?'成功':'无效的插件';
}elseif($plugin['type']=='func'){
$newData['module']=$plugin['module'];
$success=model('FuncApp')->addFunc($newData,$plugin['code']);
$result['success']=$success?true:false;
$result['msg']=$result['success']?'成功':'无效的插件';
}else{
$result['msg']='类型错误';
}
return $result;
}
/*获取平台域名Id*/
protected function _getStoreProvid($storeUrl=null){
if(empty($storeUrl)){
$referer=request()->server('HTTP_REFERER');
if(!empty($referer)){
$storeUrl=$referer;
}
}
$provId=model('Provider')->getIdByUrl($storeUrl);
return $provId;
}
/*验证请求源*/
protected function _checkRequest(){
$token=input('token');
$sessionToken=$this->_getToken();
if(empty($token)||empty($sessionToken)||$token!=$sessionToken){
$this->dispatchJump(false,'token验证失败请刷新页面或清除缓存');
}
if(!request()->isAjax()){
$origin=strtolower(request()->server('HTTP_ORIGIN'));
$origin=rtrim($origin,'/');
if(empty($origin)){
$this->dispatchJump(false,'未知来源');
}
$provData=model('Provider')->where(array('domain'=>$origin))->find();
if(empty($provData)){
$this->dispatchJump(false,'未知的第三方来源:'.$origin);
}elseif($provData['enable']!=1){
$this->dispatchJump(false,'未受信任的第三方来源:'.$origin);
}
}
}
protected function _getToken(){
$storeToken=session('store_token');
$token=null;
if(empty($storeToken)||!is_array($storeToken)||empty($storeToken['token'])){
$token='';
}else{
$token=$storeToken['token'];
}
return $token;
}
}