diff --git a/.replit b/.replit new file mode 100644 index 0000000..1dbf6d9 --- /dev/null +++ b/.replit @@ -0,0 +1,3 @@ +language = "php74" +run = "php -S 0.0.0.0:8000 index.php" +entrypoint = "index.php" diff --git a/common.php b/common.php index a2723a1..0fe8a32 100644 --- a/common.php +++ b/common.php @@ -167,6 +167,13 @@ function main($path) if (isset($_COOKIE['timezone'])&&$_COOKIE['timezone']!='') $_SERVER['timezone'] = $_COOKIE['timezone']; if ($_SERVER['timezone']=='') $_SERVER['timezone'] = 0; + if (isset($_GET['WaitFunction'])) { + $response = WaitFunction($_GET['WaitFunction']); + //var_dump($response); + if ($response===true) return output("ok", 200); + elseif ($response===false) return output("", 206); + else return $response; + } if (getConfig('admin')=='') return install(); if (getConfig('adminloginpage')=='') { $adminloginpage = 'admin'; @@ -204,13 +211,6 @@ function main($path) $url = path_format($_SERVER['PHP_SELF'] . '/'); return output('', 302, [ 'Location' => $url ]); } - if (isset($_GET['WaitFunction'])) { - $response = WaitFunction($_GET['WaitFunction']); - //var_dump($response); - if ($response===true) return output("ok", 200); - elseif ($response===false) return output("", 206); - else return $response; - } $_SERVER['sitename'] = getConfig('sitename'); if (empty($_SERVER['sitename'])) $_SERVER['sitename'] = getconstStr('defaultSitename'); @@ -249,7 +249,8 @@ function main($path) return output('Please visit ' . $tmp . '.', 302, [ 'Location' => $tmp ]); //return message('Please visit from Home Page.', 'Error', 404); } - $path = substr($path, strlen('/' . $_SERVER['disktag'])); + //$path = substr($path, strlen('/' . $_SERVER['disktag'])); + $path = splitfirst($path, $_SERVER['disktag'])[1]; if ($_SERVER['disktag']!='') $_SERVER['base_disk_path'] = path_format($_SERVER['base_disk_path'] . '/' . $_SERVER['disktag'] . '/'); } } else $_SERVER['disktag'] = $disktags[0]; @@ -302,6 +303,7 @@ function main($path) if ($_SERVER['ajax']) { if ($_GET['action']=='del_upload_cache') { // del '.tmp' without login. 无需登录即可删除.tmp后缀文件 + savecache('path_' . $path1, '', $_SERVER['disktag'], 1); // clear cache. return $drive->del_upload_cache($path); } if ($_GET['action']=='upbigfile') { @@ -358,7 +360,8 @@ function main($path) } else { $files = $drive->list_files($path1); } - if ($path!=='') if ( $files['type']=='folder' && substr($path, -1)!=='/' ) { + //if ($path!=='') + if ( $files['type']=='folder' && substr($path, -1)!=='/' ) { $tmp = path_format($_SERVER['base_disk_path'] . $path . '/'); return output(' @@ -552,7 +555,7 @@ function compareadminsha1($adminsha1, $timestamp, $pass) if (!is_numeric($timestamp)) return 'Timestamp not Number'; if (abs(time()-$timestamp) > 5*60) { date_default_timezone_set('UTC'); - return 'The timestamp in server is ' . time() . ' (' . date("Y-m-d H:i:s") . ' UTC),
and your posted timestamp is ' . $timestamp . ' (' . date("Y-m-d H:i:s", $timestamp) . ' UTC)'; + return 'The time in server is ' . time() . ' (' . date("Y-m-d H:i:s") . ' UTC),
and your time is ' . $timestamp . ' (' . date("Y-m-d H:i:s", $timestamp) . ' UTC)'; } if ($adminsha1 == sha1($timestamp . $pass)) return ''; else return 'Error password'; @@ -618,7 +621,7 @@ function filecache($disktag) if ( is_writable($tmp) ) $dir = $tmp; } elseif ( mkdir($tmp) ) $dir = $tmp; } - $tag = __DIR__ . '/OneManager/' . $disktag; + $tag = $_SERVER['HTTP_HOST'] . '/OneManager/' . $disktag; while (strpos($tag, '/')>-1) $tag = str_replace('/', '_', $tag); if (strpos($tag, ':')>-1) { $tag = str_replace(':', '_', $tag); @@ -629,14 +632,35 @@ function filecache($disktag) return $cache; } +function findIndexPath($rootpath, $path = '') +{// find the path of the first 'index.php' that not in rootpath. + global $slash; + if (substr($rootpath,-1)==$slash) $rootpath = substr($rootpath, 0, -1); + if (substr($path,0,1)==$slash) $path = substr($path, 1); + $handler=opendir(path_format($rootpath.$slash.$path)); //打开当前文件夹 + while($filename=readdir($handler)){ + if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作 + $nowname = path_format($rootpath.$slash.$path.$slash.$filename); + if(is_dir($nowname)){// 如果读取的某个对象是文件夹,则递归 + $res = findIndexPath($rootpath, $path.$slash.$filename); + if ($res!=='') return $res; + }else{ + if ($filename==='index.php') if ($path!='') return $rootpath.$slash.$path; + } + } + } + @closedir($handler); + return ''; +} + function sortConfig(&$arr) { ksort($arr); - $tags = explode('|', $arr['disktag']); - unset($arr['disktag']); - if ($tags[0]!='') { - foreach($tags as $tag) { + if (isset($arr['disktag'])) { + $tags = explode('|', $arr['disktag']); + unset($arr['disktag']); + foreach($tags as $tag) if (isset($arr[$tag])) { $disks[$tag] = $arr[$tag]; unset($arr[$tag]); } @@ -917,7 +941,7 @@ function message($message, $title = 'Message', $statusCode = 200, $wainstat = 0) //setTimeout(function() { getStatus() }, 1000); } } else if (xhr.status==206) { - errordiv.innerHTML = min + "
' . getconstStr('Wait') . '" + x; + errordiv.innerHTML = "' . getconstStr('Wait') . '" + x + "
" + min; setTimeout(function() { getStatus() }, 1000); } else { errordiv.innerHTML = "ERROR
" + xhr.status + "
" + xhr.responseText; @@ -949,7 +973,8 @@ function needUpdate() $current_ver = explode(urldecode('%0D'),$current_ver)[0]; $split = splitfirst($current_version, '.' . $current_ver)[0] . '.' . $current_ver; if (!($github_version = getcache('github_version'))) { - $tmp = curl('GET', 'https://raw.githubusercontent.com/qkqpttgf/OneManager-php/master/version'); + //$tmp = curl('GET', 'https://raw.githubusercontent.com/qkqpttgf/OneManager-php/master/version'); + $tmp = curl('GET', 'https://git.hit.edu.cn/ysun/OneManager-php/-/raw/master/version'); if ($tmp['stat']==0) return 0; $github_version = $tmp['body']; savecache('github_version', $github_version); @@ -1082,7 +1107,7 @@ function adminform($name = '', $pass = '', $storage = '', $path = '') } } -'; +'; $html .= ''; return output($html, $statusCode); } @@ -1207,6 +1232,7 @@ function splitfirst($str, $split) $tmp[0] = ''; $tmp[1] = substr($str, $len); } + if ($tmp[1]===false) $tmp[1] = ''; return $tmp; } @@ -1224,6 +1250,7 @@ function splitlast($str, $split) $tmp[0] = ''; $tmp[1] = substr($str, $len); } + if ($tmp[1]===false) $tmp[1] = ''; return $tmp; } @@ -1251,7 +1278,7 @@ function EnvOpt($needUpdate = 0) $html = 'OneManager '.getconstStr('Setup').''; if (isset($_POST['updateProgram'])&&$_POST['updateProgram']==getconstStr('updateProgram')) if (compareadminmd5('admin', getConfig('admin'), $_COOKIE['admin'], $_POST['_admin'])) { - $response = setConfigResponse(OnekeyUpate($_POST['auth'], $_POST['project'], $_POST['branch'])); + $response = setConfigResponse(OnekeyUpate($_POST['GitSource'], $_POST['auth'], $_POST['project'], $_POST['branch'])); if (api_error($response)) { $html = api_error_msg($response); $title = 'Error'; @@ -1391,19 +1418,18 @@ function EnvOpt($needUpdate = 0) } } else return message('please login again', 'Need login', 403); - if (isset($_GET['preview'])) { - $preurl = $_SERVER['PHP_SELF'] . '?preview'; - } else { - $preurl = path_format($_SERVER['PHP_SELF'] . '/'); - } $html .= ' -' . getconstStr('Back') . '
+' . getconstStr('Back') . '
+ '; if ($_GET['setup']==='cmd') { $statusCode = 200; $html .= ' +OneManager DIR: ' . __DIR__ . '
-
+
'; if ($_POST['cmd']!='') { @@ -1433,6 +1459,9 @@ output: '; return message($html, 'Run cmd', $statusCode); } + if ($_GET['setup']==='auth') { + return changeAuthKey(); + } if ($_GET['setup']==='platform') { $frame .= ' @@ -1716,7 +1745,10 @@ output: $canOneKeyUpate = 1; } } - $frame .= 'Github'; + $frame .= ' + Github +HIT Gitlab

+'; if (!$canOneKeyUpate) { $frame .= ' ' . getconstStr('CannotOneKeyUpate') . '
'; @@ -1724,17 +1756,33 @@ output: $frame .= ' + Update from + - + + +
@@ -1995,6 +2086,7 @@ function render_list($path = '', $files = []) $authinfo = ' '; //$authinfo = $path . '
' . json_encode($files, JSON_PRETTY_PRINT) . '
'; @@ -2559,7 +2651,7 @@ function render_list($path = '', $files = []) while (strpos($html, '')) $html = str_replace('', (substr($_SERVER['base_disk_path'],-1)=='/'?substr($_SERVER['base_disk_path'],0,-1):$_SERVER['base_disk_path']), $html); while (strpos($html, '')) $html = str_replace('', $_SERVER['base_path'], $html); - while (strpos($html, '')) $html = str_replace('', str_replace('%23', '#', str_replace('&','&', path_format($path1.'/'))), $html); + $html = str_replace('', str_replace('\'', '\\\'', str_replace('%23', '#', str_replace('&','&', path_format($path1.'/')))), $html); while (strpos($html, '')) $html = str_replace('', getconstStr('Home'), $html); $html = str_replace('', getConfig('customCss'), $html); diff --git a/conststr.php b/conststr.php index 3914a8c..6faf71b 100644 --- a/conststr.php +++ b/conststr.php @@ -7,7 +7,7 @@ $exts['img'] = ['ico', 'bmp', 'gif', 'jpg', 'jpeg', 'jpe', 'jfif', 'tif', 'tiff' $exts['music'] = ['mp3', 'wma', 'flac', 'ape', 'wav', 'ogg', 'm4a']; $exts['office'] = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx']; $exts['txt'] = ['txt', 'bat', 'sh', 'php', 'asp', 'js', 'css', 'json', 'html', 'c', 'cpp', 'md', 'py', 'omf']; -$exts['video'] = ['mp4', 'webm', 'mkv', 'mov', 'flv', 'blv', 'avi', 'wmv', 'm3u8', 'rm', 'ts', 'rmvb']; +$exts['video'] = ['mp4', 'webm', 'mkv', 'mov', 'flv', 'blv', 'avi', 'wmv', 'm3u8', 'rm', '3gp', 'rmvb']; $exts['zip'] = ['zip', 'rar', '7z', 'gz', 'tar']; $constStr = [ diff --git a/disk/Onedrive.php b/disk/Onedrive.php index cdf1b23..3ae42a0 100644 --- a/disk/Onedrive.php +++ b/disk/Onedrive.php @@ -611,6 +611,7 @@ class Onedrive { texta[i].style.height = texta[i].scrollHeight + \'px\'; } '; + $tmptoken['Driver'] = get_class($this); $tmptoken['refresh_token'] = $refresh_token; $tmptoken['token_expires'] = time()+7*24*60*60; $response = setConfigResponse( setConfig($tmptoken, $this->disktag) ); @@ -733,7 +734,7 @@ class Onedrive {
@@ -743,7 +744,7 @@ class Onedrive {
diff --git a/index.php b/index.php index a06dc76..725de56 100644 --- a/index.php +++ b/index.php @@ -39,6 +39,22 @@ if (isset($_SERVER['USER'])&&$_SERVER['USER']==='qcloud') { //echo 'path:'. $path; $_GET = getGET(); //echo '
'. json_encode($_GET, JSON_PRETTY_PRINT).'
'; + $re = main($path); + $sendHeaders = array(); + foreach ($re['headers'] as $headerName => $headerVal) { + header($headerName . ': ' . $headerVal, true); + } + http_response_code($re['statusCode']); + if ($re['isBase64Encoded']) echo base64_decode($re['body']); + else echo $re['body']; +} elseif (isset($_SERVER['DOCUMENT_ROOT'])&&substr($_SERVER['DOCUMENT_ROOT'], 0, 13)==='/home/runner/') { + include 'platform/Replit.php'; + + $path = getpath(); + //echo 'path:'. $path; + $_GET = getGET(); + //echo '
'. json_encode($_GET, JSON_PRETTY_PRINT).'
'; + $re = main($path); $sendHeaders = array(); foreach ($re['headers'] as $headerName => $headerVal) { @@ -56,7 +72,6 @@ if (isset($_SERVER['USER'])&&$_SERVER['USER']==='qcloud') { //echo 'path:'. $path; $_GET = getGET(); //echo '
'. json_encode($_GET, JSON_PRETTY_PRINT).'
'; - $re = main($path); $sendHeaders = array(); foreach ($re['headers'] as $headerName => $headerVal) { diff --git a/platform/AliyunFC.php b/platform/AliyunFC.php index 2618d89..7b944ee 100644 --- a/platform/AliyunFC.php +++ b/platform/AliyunFC.php @@ -185,16 +185,16 @@ function install() if ($_GET['install1']) { //if ($_POST['admin']!='') { $tmp['timezone'] = $_COOKIE['timezone']; - $AccessKeyID = getConfig('AccessKeyID'); - if ($AccessKeyID=='') { + //$AccessKeyID = getConfig('AccessKeyID'); + //if ($AccessKeyID=='') { $AccessKeyID = $_POST['AccessKeyID']; $tmp['AccessKeyID'] = $AccessKeyID; - } - $AccessKeySecret = getConfig('AccessKeySecret'); - if ($AccessKeySecret=='') { + //} + //$AccessKeySecret = getConfig('AccessKeySecret'); + //if ($AccessKeySecret=='') { $AccessKeySecret = $_POST['AccessKeySecret']; $tmp['AccessKeySecret'] = $AccessKeySecret; - } + //} $response = setConfigResponse( SetbaseConfig($tmp, $_SERVER['accountId'], $_SERVER['region'], $_SERVER['service_name'], $_SERVER['function_name'], $AccessKeyID, $AccessKeySecret) ); if (api_error($response)) { $html = api_error_msg($response); @@ -229,12 +229,13 @@ language:
'; $html .= '
'; } - if (getConfig('AccessKeyID')==''||getConfig('AccessKeySecret')=='') $html .= ' - '.getconstStr('Create').' AccessKeyID & AccessKeySecret
-
-
'; + //if (getConfig('AccessKeyID')==''||getConfig('AccessKeySecret')=='') $html .= ' - + ' . getconstStr('Create') . ' AccessKeyID & AccessKeySecret
+
+
'; + $html .= ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + ' . getconstStr('Create') . ' AccessKeyID & AccessKeySecret
+
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/platform/BaiduCFC.php b/platform/BaiduCFC.php index f2b21e6..77ad2f0 100644 --- a/platform/BaiduCFC.php +++ b/platform/BaiduCFC.php @@ -1,4 +1,6 @@ '; $html .= '
'; } - if (getConfig('SecretId')==''||getConfig('SecretKey')=='') $html .= ' - '.getconstStr('Create').' Access Key & Secret Key
-
-
'; + //if (getConfig('SecretId')==''||getConfig('SecretKey')=='') $html .= ' - + ' . getconstStr('Create') . ' Access Key & Secret Key
+
+
'; + $html .= ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + ' . getconstStr('Create') . ' Access Key & Secret Key
+
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/platform/Heroku.php b/platform/Heroku.php index 971463e..b8887b3 100644 --- a/platform/Heroku.php +++ b/platform/Heroku.php @@ -170,11 +170,8 @@ function install() $tmp['admin'] = $_POST['admin']; //$tmp['language'] = $_POST['language']; $tmp['timezone'] = $_COOKIE['timezone']; - $APIKey = getConfig('APIKey'); - if ($APIKey=='') { - $APIKey = $_POST['APIKey']; - $tmp['APIKey'] = $APIKey; - } + $APIKey = $_POST['APIKey']; + $tmp['APIKey'] = $APIKey; $HerokuappId = getConfig('HerokuappId'); if ($HerokuappId=='') { $function_name = getConfig('function_name'); @@ -197,17 +194,27 @@ function install() if (api_error($response)) { $html = api_error_msg($response); $title = 'Error'; + return message($html, $title, 400); } else { - return output('Jump + $html = getconstStr('Success') . ' - ', 302); + var status = "' . $response['DplStatus'] . '"; + var i = 0; + var uploadList = setInterval(function(){ + if (document.getElementById("dis").style.display=="none") { + console.log(i++); + } else { + clearInterval(uploadList); + location.href = "' . path_format($_SERVER['base_path'] . '/') . '"; + } + }, 1000); + '; + return message($html, $title, 201, 1); } - return message($html, $title, 201); } } if ($_GET['install0']) { @@ -218,9 +225,9 @@ language:
'; $html .= '
'; } - if (getConfig('APIKey')=='') $html .= ' - '.getconstStr('Create').' API Key
-
'; + $html .= ' + ' . getconstStr('Create') . ' API Key
+
'; $html .= '
'; $html .= ' @@ -247,7 +254,7 @@ language:
'; alert(\'input admin\'); return false; }'; - if (getConfig('APIKey')=='') $html .= ' + $html .= ' if (t.APIKey.value==\'\') { alert(\'input API Key\'); return false; @@ -333,10 +340,15 @@ function_name:' . $_SERVER['function_name'] . '
'; } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { - //'https://github.com/qkqpttgf/OneManager-php/tarball/master/'; - $source = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + //'https://github.com/qkqpttgf/OneManager-php/tarball/master/'; + $source = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $source = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return ['stat'=>403, 'body'=>json_encode(['id'=>'Error', 'message'=>'Git Source input Error!'])]; + return updateHerokuapp(getConfig('HerokuappId'), getConfig('APIKey'), $source); } @@ -358,3 +370,48 @@ function WaitFunction($buildId = '') { return $response; } } + +function changeAuthKey() { + if ($_POST['APIKey']!='') { + $APIKey = $_POST['APIKey']; + $tmp['APIKey'] = $APIKey; + $response = setConfigResponse( setHerokuConfig($tmp, getConfig('HerokuappId'), $APIKey) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $html = getconstStr('Success') . ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + '.getconstStr('Create').' API Key
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/platform/HuaweiFG_env.php b/platform/HuaweiFG_env.php index d3cebd9..a037d3e 100644 --- a/platform/HuaweiFG_env.php +++ b/platform/HuaweiFG_env.php @@ -1,4 +1,7 @@ '; $html .= '
'; } - if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') $html .= ' + //if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') + $html .= ' 在函数代码操作页上方找到URN,鼠标放上去后显示URN,复制填入:

点击链接,新增访问密钥, 在下载的credentials.csv文件中找到对应信息,填入:

-
'; +
'; $html .= '

'; @@ -273,7 +268,8 @@ language:
'; } function notnull(t) {'; - if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') $html .= ' + //if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') + $html .= ' if (t.HW_urn.value==\'\') { alert(\'input URN\'); return false; @@ -433,27 +429,24 @@ function setConfigResponse($response) return json_decode( $response, true ); } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { $source = '/tmp/code.zip'; $outPath = '/tmp/'; - // 从github下载对应tar.gz,并解压 - $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return json_encode(['error_code'=>'Error', 'error_msg'=>'Git Source input Error!']); $tarfile = '/tmp/github.tar.gz'; file_put_contents($tarfile, file_get_contents($url)); $phar = new PharData($tarfile); $html = $phar->extractTo($outPath, null, true);//路径 要解压的文件 是否覆盖 // 获取解压出的目录名 - $tmp = scandir($outPath); - $name = $auth.'-'.$project; - foreach ($tmp as $f) { - if ( substr($f, 0, strlen($name)) == $name) { - $outPath .= $f; - break; - } - } + $outPath = findIndexPath($outPath); // 将目录中文件打包成zip //$zip=new ZipArchive(); @@ -485,9 +478,60 @@ function addFileToZip($zip, $rootpath, $path = '') } } } - @closedir($path); + @closedir($handler); } function WaitFunction() { return true; } + +function changeAuthKey() { + if ($_POST['HW_key']!=''&&$_POST['HW_secret']!='') { + $tmp['HW_key'] = $_POST['HW_key']; + $tmp['HW_secret'] = $_POST['HW_secret']; + $response = setConfigResponse( SetbaseConfig($tmp, getConfig('HW_urn'), $tmp['HW_key'], $tmp['HW_secret']) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $html = getconstStr('Success') . ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + 点击链接,新增访问密钥, + 在下载的credentials.csv文件中找到对应信息,填入:
+
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/platform/HuaweiFG_file.php b/platform/HuaweiFG_file.php index 64e6199..353f7b1 100644 --- a/platform/HuaweiFG_file.php +++ b/platform/HuaweiFG_file.php @@ -1,4 +1,7 @@ '; $html .= '
'; } - if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') $html .= ' + //if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') + $html .= ' 在函数代码操作页上方找到URN,鼠标放上去后显示URN,复制填入:

点击链接,新增访问密钥, 在下载的credentials.csv文件中找到对应信息,填入:

-
'; +
'; $html .= '

'; @@ -287,17 +279,18 @@ language:
'; } function notnull(t) {'; - if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') $html .= ' + //if (getConfig('HW_urn')==''||getConfig('HW_key')==''||getConfig('HW_secret')=='') + $html .= ' if (t.HW_urn.value==\'\') { alert(\'input URN\'); return false; } if (t.HW_key.value==\'\') { - alert(\'input name\'); + alert(\'input Access Key Id\'); return false; } if (t.HW_secret.value==\'\') { - alert(\'input pwd\'); + alert(\'input Secret Access Key\'); return false; }'; $html .= ' @@ -426,7 +419,6 @@ function updateEnvironment($Envs, $HW_urn, $HW_key, $HW_secret) function SetbaseConfig($Envs, $HW_urn, $HW_key, $HW_secret) { - global $slash; //echo json_encode($Envs,JSON_PRETTY_PRINT); if ($Envs['ONEMANAGER_CONFIG_SAVE'] == 'file') $envs = Array( 'ONEMANAGER_CONFIG_SAVE' => 'file' ); else { @@ -469,8 +461,8 @@ function SetbaseConfig($Envs, $HW_urn, $HW_key, $HW_secret) return $response; } - $projectPath = splitlast(__DIR__, $slash)[0]; - $configPath = $projectPath . $slash . '.data' . $slash . 'config.php'; + $projectPath = splitlast(__DIR__, '/')[0]; + $configPath = $projectPath . '/.data/config.php'; $s = file_get_contents($configPath); $configs = '{' . splitlast(splitfirst($s, '{')[1], '}')[0] . '}'; if ($configs!='') $tmp_env = json_decode($configs, true); @@ -525,39 +517,24 @@ function setConfigResponse($response) return json_decode( $response, true ); } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { $source = '/tmp/code.zip'; $outPath = '/tmp/'; - // 从github下载对应tar.gz,并解压 - $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return json_encode(['error_code'=>'Error', 'error_msg'=>'Git Source input Error!']); $tarfile = '/tmp/github.tar.gz'; file_put_contents($tarfile, file_get_contents($url)); $phar = new PharData($tarfile); $html = $phar->extractTo($outPath, null, true);//路径 要解压的文件 是否覆盖 // 获取解压出的目录名 -/* - @ob_start(); - passthru('ls /tmp | grep '.$auth.'-'.$project.'',$stat); - $html.='状态:' . $stat . ' - 结果: - '; - $archivefolder = ob_get_clean(); - if (substr($archivefolder,-1)==PHP_EOL) $archivefolder = substr($archivefolder, 0, -1); - $outPath .= $archivefolder; - $html.=htmlspecialchars($archivefolder); - //return $html; -*/ - $tmp = scandir($outPath); - $name = $auth.'-'.$project; - foreach ($tmp as $f) { - if ( substr($f, 0, strlen($name)) == $name) { - $outPath .= $f; - break; - } - } + $outPath = findIndexPath($outPath); // 放入配置文件 file_put_contents($outPath . '/.data/config.php', file_get_contents(__DIR__ . '/../.data/config.php')); @@ -592,7 +569,7 @@ function addFileToZip($zip, $rootpath, $path = '') } } } - @closedir($path); + @closedir($handler); } @@ -602,6 +579,7 @@ function addFileToZip($zip, $rootpath, $path = '') + define("BasicDateFormat", "Ymd\THis\Z"); define("Algorithm", "SDK-HMAC-SHA256"); define("HeaderXDate", "X-Sdk-Date"); @@ -872,3 +850,54 @@ class Signer function WaitFunction() { return true; } + +function changeAuthKey() { + if ($_POST['HW_key']!=''&&$_POST['HW_secret']!='') { + $tmp['HW_key'] = $_POST['HW_key']; + $tmp['HW_secret'] = $_POST['HW_secret']; + $response = setConfigResponse( SetbaseConfig($tmp, getConfig('HW_urn'), $tmp['HW_key'], $tmp['HW_secret']) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $html = getconstStr('Success') . ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + 点击链接,新增访问密钥, + 在下载的credentials.csv文件中找到对应信息,填入:
+
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/platform/Normal.php b/platform/Normal.php index 5002b19..2cb9e4c 100644 --- a/platform/Normal.php +++ b/platform/Normal.php @@ -312,19 +312,23 @@ function setConfigResponse($response) return json_decode($response, true); } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { - $slash = '/'; - if (strpos(__DIR__, ':')) $slash = '\\'; + global $slash; // __DIR__ is xxx/platform $projectPath = splitlast(__DIR__, $slash)[0]; - // 从github下载对应tar.gz,并解压 - $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return 0; $tarfile = $projectPath . $slash .'github.tar.gz'; $githubfile = file_get_contents($url); if (!$githubfile) return 0; file_put_contents($tarfile, $githubfile); + if (splitfirst(PHP_VERSION, '.')[0] > '5') { $phar = new PharData($tarfile); // need php5.3, 7, 8 $phar->extractTo($projectPath, null, true);//路径 要解压的文件 是否覆盖 @@ -336,14 +340,7 @@ function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = unlink($tarfile); $outPath = ''; - $tmp = scandir($projectPath); - $name = $auth . '-' . $project; - foreach ($tmp as $f) { - if ( substr($f, 0, strlen($name)) == $name) { - $outPath = $projectPath . $slash . $f; - break; - } - } + $outPath = findIndexPath($projectPath); //error_log1($outPath); if ($outPath=='') return 0; @@ -354,11 +351,12 @@ function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = $tmp1['message'] = "Can not move " . $projectPath . $slash . '.data' . $slash . 'config.php' . " to " . $outPath . $slash . '.data' . $slash . 'config.php'; return json_encode($tmp1); } - return moveFolder($outPath, $projectPath, $slash); + return moveFolder($outPath, $projectPath); } -function moveFolder($from, $to, $slash) +function moveFolder($from, $to) { + global $slash; if (substr($from, -1)==$slash) $from = substr($from, 0, -1); if (substr($to, -1)==$slash) $to = substr($to, 0, -1); if (!file_exists($to)) mkdir($to, 0777); @@ -368,7 +366,7 @@ function moveFolder($from, $to, $slash) $fromfile = $from . $slash . $filename; $tofile = $to . $slash . $filename; if(is_dir($fromfile)){// 如果读取的某个对象是文件夹,则递归 - $response = moveFolder($fromfile, $tofile, $slash); + $response = moveFolder($fromfile, $tofile); if (api_error(setConfigResponse($response))) return $response; }else{ //if (file_exists($tofile)) unlink($tofile); @@ -390,3 +388,7 @@ function moveFolder($from, $to, $slash) function WaitFunction() { return true; } + +function changeAuthKey() { + return message("Not need.", 'Change platform Auth token or key', 404); +} diff --git a/platform/Replit.php b/platform/Replit.php new file mode 100644 index 0000000..a682197 --- /dev/null +++ b/platform/Replit.php @@ -0,0 +1,357 @@ +0) $path = substr($_SERVER['REQUEST_URI'], 0, $p); + else $path = $_SERVER['REQUEST_URI']; + $path = path_format( substr($path, strlen($_SERVER['base_path'])) ); + return $path; +} + +function getGET() +{ + if (!$_POST) { + if (!!$HTTP_RAW_POST_DATA) { + $tmpdata = $HTTP_RAW_POST_DATA; + } else { + $tmpdata = file_get_contents('php://input'); + } + if (!!$tmpdata) { + $postbody = explode("&", $tmpdata); + foreach ($postbody as $postvalues) { + $pos = strpos($postvalues,"="); + $_POST[urldecode(substr($postvalues,0,$pos))]=urldecode(substr($postvalues,$pos+1)); + } + } + } + if (isset($_SERVER['UNENCODED_URL'])) $_SERVER['REQUEST_URI'] = $_SERVER['UNENCODED_URL']; + $p = strpos($_SERVER['REQUEST_URI'],'?'); + if ($p>0) { + $getstr = substr($_SERVER['REQUEST_URI'], $p+1); + $getstrarr = explode("&",$getstr); + foreach ($getstrarr as $getvalues) { + if ($getvalues != '') { + $pos = strpos($getvalues, "="); + //echo $pos; + if ($pos > 0) { + $getarry[urldecode(substr($getvalues, 0, $pos))] = urldecode(substr($getvalues, $pos + 1)); + } else { + $getarry[urldecode($getvalues)] = true; + } + } + } + } + if (isset($getarry)) { + return $getarry; + } else { + return []; + } +} + +function ReplitAPI($op, $key, $value = '') { + //error_log1($op . '_' . $key . '_' . $value); + $apiurl = getenv('REPLIT_DB_URL'); + //foreach (explode("\n", curl('GET', $apiurl . '?prefix')['body']) as $a) curl('DELETE', $apiurl . '/' . $a); + if ($op === 'r') { + if (!($config = getcache('REPLIT_CONFIG'))) { + $config = json_decode(curl('GET', $apiurl . '/REPLIT_CONFIG')['body'], true); + savecache('REPLIT_CONFIG', $config); + } + return ['stat'=>200, 'body'=>(is_array($config[$key])?json_encode($config[$key]):$config[$key])]; + } elseif ($op === 'w') { + return curl('POST', $apiurl, 'REPLIT_CONFIG=' . $value, ["Content-Type"=>"application/x-www-form-urlencoded"]); + } elseif ($op === 'd') { + // not use + return curl('DELETE', $apiurl . '/' . $key); + } else { + return ['stat'=>500, 'body'=>'error option input to function ReplitAPI().']; + } +} + +function getConfig($str, $disktag = '') +{ + if (isInnerEnv($str)) { + if ($disktag=='') $disktag = $_SERVER['disktag']; + $env = json_decode(ReplitAPI('r', $disktag)['body'], true); + if (isset($env[$str])) { + if (isBase64Env($str)) return base64y_decode($env[$str]); + else return $env[$str]; + } + } else { + if (isBase64Env($str)) return base64y_decode(ReplitAPI('r', $str)['body']); + else return ReplitAPI('r', $str)['body']; + } + return ''; +} + +function setConfig($arr, $disktag = '') +{ + if (!($envs = getcache('REPLIT_CONFIG'))) { + $envs = json_decode(curl('GET', getenv('REPLIT_DB_URL') . '/REPLIT_CONFIG')['body'], true); + savecache('REPLIT_CONFIG', $envs); + } + if ($disktag=='') $disktag = $_SERVER['disktag']; + $disktags = explode("|", getConfig('disktag')); + $indisk = 0; + $operatedisk = 0; + foreach ($arr as $k => $v) { + if (isCommonEnv($k)) { + if (isBase64Env($k)) $envs[$k] = base64y_encode($v); + else $envs[$k] = $v; + } elseif (isInnerEnv($k)) { + if (isBase64Env($k)) $envs[$disktag][$k] = base64y_encode($v); + else $envs[$disktag][$k] = $v; + $indisk = 1; + } elseif ($k=='disktag_add') { + array_push($disktags, $v); + $operatedisk = 1; + } elseif ($k=='disktag_del') { + $disktags = array_diff($disktags, [ $v ]); + $envs[$v] = ''; + $operatedisk = 1; + } elseif ($k=='disktag_copy') { + $newtag = $v . '_' . date("Ymd_His"); + $envs[$newtag] = $envs[$v]; + array_push($disktags, $newtag); + $operatedisk = 1; + } elseif ($k=='disktag_rename' || $k=='disktag_newname') { + if ($arr['disktag_rename']!=$arr['disktag_newname']) $operatedisk = 1; + } else { + $envs[$k] = $v; + } + } + if ($indisk) { + $diskconfig = $envs[$disktag]; + $diskconfig = array_filter($diskconfig, 'array_value_isnot_null'); + ksort($diskconfig); + $envs[$disktag] = $diskconfig; + } + if ($operatedisk) { + if (isset($arr['disktag_newname']) && $arr['disktag_newname']!='') { + $tags = []; + foreach ($disktags as $tag) { + if ($tag==$arr['disktag_rename']) array_push($tags, $arr['disktag_newname']); + else array_push($tags, $tag); + } + $envs['disktag'] = implode('|', $tags); + $envs[$arr['disktag_newname']] = $envs[$arr['disktag_rename']]; + unset($envs[$arr['disktag_rename']]); + } else { + $disktags = array_unique($disktags); + foreach ($disktags as $disktag) if ($disktag!='') $disktag_s .= $disktag . '|'; + if ($disktag_s!='') $envs['disktag'] = substr($disktag_s, 0, -1); + else $envs['disktag'] = ''; + } + } + $envs = array_filter($envs, 'array_value_isnot_null'); + sortConfig($envs); + $response = ReplitAPI('w', 'REPLIT_CONFIG', json_encode($envs)); + //error_log1(json_encode($arr, JSON_PRETTY_PRINT) . ' => tmp:' . json_encode($envs, JSON_PRETTY_PRINT)); + savecache('REPLIT_CONFIG', null, '', 0); + if (api_error($response)) return ['stat'=>$response['stat'], 'body'=>$response['body'] . "
\nError in writting " . $key . "=" . $val]; + return $response; +} + +function install() +{ + global $constStr; + if ($_GET['install2']) { + if ($_POST['admin']!='') { + $tmp['admin'] = $_POST['admin']; + //$tmp['language'] = $_COOKIE['language']; + $tmp['timezone'] = $_COOKIE['timezone']; + $response = setConfigResponse( setConfig($tmp) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 201); + } else { + return output('Jump + + ', 302); + } + } + } + if ($_GET['install1']) { + /*if (!ConfigWriteable()) { + $html .= getconstStr('MakesuerWriteable'); + $title = 'Error'; + return message($html, $title, 201); + } + if (!RewriteEngineOn()) { + $html .= getconstStr('MakesuerRewriteOn'); + $title = 'Error'; + return message($html, $title, 201); + }*/ + $html .= ' + +
+ + + '; + $title = getconstStr('SetAdminPassword'); + return message($html, $title, 201); + } + if ($_GET['install0']) { + $html .= ' + +language:
'; + foreach ($constStr['languages'] as $key1 => $value1) { + $html .= ' +
'; + } + $html .= ' + + + '; + $title = getconstStr('SelectLanguage'); + return message($html, $title, 201); + } + + $title = 'Install'; + $html = '' . getconstStr('ClickInstall') . ', ' . getconstStr('LogintoBind'); + return message($html, $title, 201); +} + +function ConfigWriteable() +{ + $t = md5( md5(time()).rand(1000,9999) ); + $r = setConfig([ 'tmp' => $t ]); + $tmp = getConfig('tmp'); + setConfig([ 'tmp' => '' ]); + if ($tmp == $t) return true; + if ($r) return true; + return false; +} + +function api_error($response) +{ + return !($response['stat']==200||$response['stat']==204||$response['stat']==404); + //return isset($response['message']); +} + +function api_error_msg($response) +{ + return '
'. json_encode($response, JSON_PRETTY_PRINT).'
' . '
+'; +} + +function setConfigResponse($response) +{ + return $response; + //return json_decode($response, true); +} + +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +{ + // __DIR__ is xxx/platform + $projectPath = splitlast(__DIR__, '/')[0]; + + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return ['stat'=>500, 'body'=>'Git Source input Error!']; + $tarfile = $projectPath . '/github.tar.gz'; + $githubfile = file_get_contents($url); + if (!$githubfile) return ['stat'=>500, 'body'=>'download error from github.']; + file_put_contents($tarfile, $githubfile); + if (splitfirst(PHP_VERSION, '.')[0] > '5') { + $phar = new PharData($tarfile); // need php5.3, 7, 8 + $phar->extractTo($projectPath, null, true);//路径 要解压的文件 是否覆盖 + } else { + ob_start(); + passthru('tar -xzvf ' . $tarfile, $stat); + ob_get_clean(); + } + unlink($tarfile); + + $outPath = ''; + $outPath = findIndexPath($projectPath); + //error_log1($outPath); + if ($outPath=='') return ['stat'=>500, 'body'=>'can\'t find folder after download from github.']; + + return moveFolder($outPath, $projectPath); +} + +function moveFolder($from, $to) +{ + if (substr($from, -1)=='/') $from = substr($from, 0, -1); + if (substr($to, -1)=='/') $to = substr($to, 0, -1); + if (!file_exists($to)) mkdir($to, 0777); + $handler=opendir($from); + while($filename=readdir($handler)) { + if($filename != '.' && $filename != '..'){ + $fromfile = $from . '/' . $filename; + $tofile = $to . '/' . $filename; + if(is_dir($fromfile)){// 如果读取的某个对象是文件夹,则递归 + $response = moveFolder($fromfile, $tofile); + if (api_error(setConfigResponse($response))) return $response; + }else{ + if (file_exists($tofile)) unlink($tofile); + $response = rename($fromfile, $tofile); + if (!$response) { + $tmp['code'] = "Move Failed"; + $tmp['message'] = "Can not move " . $fromfile . " to " . $tofile; + return ['stat'=>500, 'body'=>json_encode($tmp)]; + } + if (file_exists($fromfile)) unlink($fromfile); + } + } + } + closedir($handler); + rmdir($from); + return ['stat'=>200, 'body'=>'success.']; +} + +function WaitFunction() { + return true; +} + +function changeAuthKey() { + return message("Not need.", 'Change platform Auth token or key', 404); +} diff --git a/platform/Replit_old.php b/platform/Replit_old.php new file mode 100644 index 0000000..572c150 --- /dev/null +++ b/platform/Replit_old.php @@ -0,0 +1,379 @@ +0) $path = substr($_SERVER['REQUEST_URI'], 0, $p); + else $path = $_SERVER['REQUEST_URI']; + $path = path_format( substr($path, strlen($_SERVER['base_path'])) ); + return $path; +} + +function getGET() +{ + if (!$_POST) { + if (!!$HTTP_RAW_POST_DATA) { + $tmpdata = $HTTP_RAW_POST_DATA; + } else { + $tmpdata = file_get_contents('php://input'); + } + if (!!$tmpdata) { + $postbody = explode("&", $tmpdata); + foreach ($postbody as $postvalues) { + $pos = strpos($postvalues,"="); + $_POST[urldecode(substr($postvalues,0,$pos))]=urldecode(substr($postvalues,$pos+1)); + } + } + } + if (isset($_SERVER['UNENCODED_URL'])) $_SERVER['REQUEST_URI'] = $_SERVER['UNENCODED_URL']; + $p = strpos($_SERVER['REQUEST_URI'],'?'); + if ($p>0) { + $getstr = substr($_SERVER['REQUEST_URI'], $p+1); + $getstrarr = explode("&",$getstr); + foreach ($getstrarr as $getvalues) { + if ($getvalues != '') { + $pos = strpos($getvalues, "="); + //echo $pos; + if ($pos > 0) { + $getarry[urldecode(substr($getvalues, 0, $pos))] = urldecode(substr($getvalues, $pos + 1)); + } else { + $getarry[urldecode($getvalues)] = true; + } + } + } + } + if (isset($getarry)) { + return $getarry; + } else { + return []; + } +} + +function ReplitAPI($op, $key, $value = '') { + //error_log1($op . '_' . $key . '_' . $value); + $apiurl = getenv('REPLIT_DB_URL'); + if ($op === 'r') { + return curl('GET', $apiurl . '/' . $key); + } elseif ($op === 'w') { + return curl('POST', $apiurl, $key . '=' . $value, ["Content-Type"=>"application/x-www-form-urlencoded"]); + } elseif ($op === 'd') { + return curl('DELETE', $apiurl . '/' . $key); + } else { + return ['stat'=>500, 'body'=>'error option input to function ReplitAPI().']; + } +} + +function getConfig($str, $disktag = '') +{ + if (isInnerEnv($str)) { + if ($disktag=='') $disktag = $_SERVER['disktag']; + $env = json_decode(ReplitAPI('r', $disktag)['body'], true); + if (isset($env[$str])) { + if (isBase64Env($str)) return base64y_decode($env[$str]); + else return $env[$str]; + } + } else { + if (isBase64Env($str)) return base64y_decode(ReplitAPI('r', $str)['body']); + else return ReplitAPI('r', $str)['body']; + } + return ''; +} + +function setConfig($arr, $disktag = '') +{ + if ($disktag=='') $disktag = $_SERVER['disktag']; + $disktags = explode("|", getConfig('disktag')); + if ($disktag!='') $diskconfig = json_decode(ReplitAPI('r', $disktag)['body'], true); + $tmp = []; + $indisk = 0; + $operatedisk = 0; + foreach ($arr as $k => $v) { + if (isCommonEnv($k)) { + if (isBase64Env($k)) $tmp[$k] = base64y_encode($v); + else $tmp[$k] = $v; + } elseif (isInnerEnv($k)) { + if (isBase64Env($k)) $diskconfig[$k] = base64y_encode($v); + else $diskconfig[$k] = $v; + $indisk = 1; + } elseif ($k=='disktag_add') { + array_push($disktags, $v); + $operatedisk = 1; + } elseif ($k=='disktag_del') { + $disktags = array_diff($disktags, [ $v ]); + $tmp[$v] = ''; + $operatedisk = 1; + } elseif ($k=='disktag_copy') { + $newtag = $v . '_' . date("Ymd_His"); + $tmp[$newtag] = getConfig($v); + array_push($disktags, $newtag); + $operatedisk = 1; + } elseif ($k=='disktag_rename' || $k=='disktag_newname') { + if ($arr['disktag_rename']!=$arr['disktag_newname']) $operatedisk = 1; + } else { + $tmp[$k] = json_encode($v); + } + } + if ($indisk) { + $diskconfig = array_filter($diskconfig, 'array_value_isnot_null'); + ksort($diskconfig); + $tmp[$disktag] = json_encode($diskconfig); + } + if ($operatedisk) { + if (isset($arr['disktag_newname']) && $arr['disktag_newname']!='') { + $tags = []; + foreach ($disktags as $tag) { + if ($tag==$arr['disktag_rename']) array_push($tags, $arr['disktag_newname']); + else array_push($tags, $tag); + } + $tmp['disktag'] = implode('|', $tags); + $tmp[$arr['disktag_newname']] = getConfig($arr['disktag_rename']); + $tmp[$arr['disktag_rename']] = null; + } else { + $disktags = array_unique($disktags); + foreach ($disktags as $disktag) if ($disktag!='') $disktag_s .= $disktag . '|'; + if ($disktag_s!='') $tmp['disktag'] = substr($disktag_s, 0, -1); + else $tmp['disktag'] = null; + } + } + $response = null; + foreach ($tmp as $key => $val) { + if (!!$val) $response = ReplitAPI('w', $key, $val); + else $response = ReplitAPI('d', $key); + if (api_error($response)) return ['stat'=>$response['stat'], 'body'=>$response['body'] . "
\nError in writting " . $key . "=" . $val]; + } + //error_log1(json_encode($arr, JSON_PRETTY_PRINT) . ' => tmp:' . json_encode($tmp, JSON_PRETTY_PRINT)); + return $response; +} + +function install() +{ + global $constStr; + if ($_GET['install2']) { + if ($_POST['admin']!='') { + $tmp['admin'] = $_POST['admin']; + //$tmp['language'] = $_COOKIE['language']; + $tmp['timezone'] = $_COOKIE['timezone']; + $response = setConfigResponse( setConfig($tmp) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 201); + } else { + return output('Jump + + ', 302); + } + } + } + if ($_GET['install1']) { + if (!ConfigWriteable()) { + $html .= getconstStr('MakesuerWriteable'); + $title = 'Error'; + return message($html, $title, 201); + } + /*if (!RewriteEngineOn()) { + $html .= getconstStr('MakesuerRewriteOn'); + $title = 'Error'; + return message($html, $title, 201); + }*/ + $html .= ' + + '; + $title = getconstStr('SetAdminPassword'); + return message($html, $title, 201); + } + if ($_GET['install0']) { + $html .= ' + +language:
'; + foreach ($constStr['languages'] as $key1 => $value1) { + $html .= ' +
'; + } + $html .= ' + + + '; + $title = getconstStr('SelectLanguage'); + return message($html, $title, 201); + } + + $title = 'Install'; + $html = '' . getconstStr('ClickInstall') . ', ' . getconstStr('LogintoBind'); + return message($html, $title, 201); +} + +function ConfigWriteable() +{ + $t = md5( md5(time()).rand(1000,9999) ); + $r = setConfig([ 'tmp' => $t ]); + $tmp = getConfig('tmp'); + setConfig([ 'tmp' => '' ]); + if ($tmp == $t) return true; + if ($r) return true; + return false; +} + +function api_error($response) +{ + return !($response['stat']==200||$response['stat']==204||$response['stat']==404); + //return isset($response['message']); +} + +function api_error_msg($response) +{ + return '
'. json_encode($response, JSON_PRETTY_PRINT).'
' . '
+'; +} + +function setConfigResponse($response) +{ + return $response; + //return json_decode($response, true); +} + +function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +{ + $slash = '/'; + if (strpos(__DIR__, ':')) $slash = '\\'; + // __DIR__ is xxx/platform + $projectPath = splitlast(__DIR__, $slash)[0]; + + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + $tarfile = $projectPath . $slash .'github.tar.gz'; + $githubfile = file_get_contents($url); + if (!$githubfile) return ['stat'=>500, 'body'=>'download error from github.']; + file_put_contents($tarfile, $githubfile); + if (splitfirst(PHP_VERSION, '.')[0] > '5') { + $phar = new PharData($tarfile); // need php5.3, 7, 8 + $phar->extractTo($projectPath, null, true);//路径 要解压的文件 是否覆盖 + } else { + ob_start(); + passthru('tar -xzvf ' . $tarfile, $stat); + ob_get_clean(); + } + unlink($tarfile); + + $outPath = ''; + $tmp = scandir($projectPath); + $name = $auth . '-' . $project; + foreach ($tmp as $f) { + if ( substr($f, 0, strlen($name)) == $name) { + $outPath = $projectPath . $slash . $f; + break; + } + } + //error_log1($outPath); + if ($outPath=='') return ['stat'=>500, 'body'=>'can\'t find folder after download from github.']; + + return moveFolder($outPath, $projectPath, $slash); +} + +function moveFolder($from, $to, $slash) +{ + if (substr($from, -1)==$slash) $from = substr($from, 0, -1); + if (substr($to, -1)==$slash) $to = substr($to, 0, -1); + if (!file_exists($to)) mkdir($to, 0777); + $handler=opendir($from); + while($filename=readdir($handler)) { + if($filename != '.' && $filename != '..'){ + $fromfile = $from . $slash . $filename; + $tofile = $to . $slash . $filename; + if(is_dir($fromfile)){// 如果读取的某个对象是文件夹,则递归 + $response = moveFolder($fromfile, $tofile, $slash); + if (api_error(setConfigResponse($response))) return $response; + }else{ + if (file_exists($tofile)) unlink($tofile); + $response = rename($fromfile, $tofile); + if (!$response) { + $tmp['code'] = "Move Failed"; + $tmp['message'] = "Can not move " . $fromfile . " to " . $tofile; + return ['stat'=>500, 'body'=>json_encode($tmp)]; + } + if (file_exists($fromfile)) unlink($fromfile); + } + } + } + closedir($handler); + rmdir($from); + return ['stat'=>200, 'body'=>'success.']; +} + +function WaitFunction() { + return true; +} + +function changeAuthKey() { + return message("Not need.", 'Change platform Auth token or key', 404); +} diff --git a/platform/TencentSCF_env.php b/platform/TencentSCF_env.php index c8084ae..492a081 100644 --- a/platform/TencentSCF_env.php +++ b/platform/TencentSCF_env.php @@ -1,4 +1,7 @@ - ', 'Program updating', 201); + ', 'Program updating', 201, 1); } - return output('Jump + return message(getconstStr('Success') . ' - ', 302); + var i = 0; + var uploadList = setInterval(function(){ + if (document.getElementById("dis").style.display=="none") { + console.log(i++); + } else { + clearInterval(uploadList); + location.href = "' . path_format($_SERVER['base_path'] . '/') . '"; + } + }, 1000); + ', 201, 1); } if ($_GET['install1']) { $tmp['timezone'] = $_COOKIE['timezone']; @@ -199,7 +210,7 @@ function install() if ($tmp['ONEMANAGER_CONFIG_SAVE'] == 'file') { $html = getconstStr('ONEMANAGER_CONFIG_SAVE_FILE') . '
' . getconstStr('Home') . ''; $title = 'Reinstall'; - return message($html, $title, 201); + return message($html, $title, 201, 1); } $html .= ' @@ -217,7 +228,7 @@ function install() } '; $title = getconstStr('SetAdminPassword'); - return message($html, $title, 201); + return message($html, $title, 201, 1); } } if ($_GET['install0']) { @@ -228,10 +239,11 @@ language:
'; $html .= '
'; } - if (getConfig('SecretId')==''||getConfig('SecretKey')=='') $html .= ' + //if (getConfig('SecretId')==''||getConfig('SecretKey')=='') + $html .= ' ' . getconstStr('Create') . ' SecretId & SecretKey

-
'; +
'; $html .= '

'; @@ -255,7 +267,8 @@ language:
'; } function notnull(t) {'; - if (getConfig('SecretId')==''||getConfig('SecretKey')=='') $html .= ' + //if (getConfig('SecretId')==''||getConfig('SecretKey')=='') + $html .= ' if (t.SecretId.value==\'\') { alert(\'input SecretId\'); return false; @@ -547,29 +560,24 @@ function updateProgram($function_name, $Region, $Namespace, $SecretId, $SecretKe return curl('POST', 'https://'.$host, $payload, $headers)['body']; } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { $source = '/tmp/code.zip'; $outPath = '/tmp/'; - // 从github下载对应tar.gz,并解压 - $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return json_encode(['Response'=>['Error'=>['code'=>'Git Source input Error!']]]); $tarfile = '/tmp/github.tar.gz'; file_put_contents($tarfile, file_get_contents($url)); $phar = new PharData($tarfile); $html = $phar->extractTo($outPath, null, true);//路径 要解压的文件 是否覆盖 - // 获取包中目录名 - $tmp = scandir('phar://'.$tarfile); - $name = $auth.'-'.$project; - foreach ($tmp as $f) { - if ( substr($f, 0, strlen($name)) == $name) { - $outPath .= $f; - break; - } - } - // 放入配置文件 - file_put_contents($outPath . '/.data/config.php', file_get_contents(__DIR__ . '/../.data/config.php')); + // 获取解压出的目录名 + $outPath = findIndexPath($outPath); // 将目录中文件打包成zip //$zip=new ZipArchive(); @@ -601,5 +609,55 @@ function addFileToZip($zip, $rootpath, $path = '') } } } - @closedir($path); + @closedir($handler); +} + +function changeAuthKey() { + if ($_POST['SecretId']!=''&&$_POST['SecretId']!='') { + $tmp['SecretId'] = $_POST['SecretId']; + $tmp['SecretKey'] = $_POST['SecretKey']; + $response = setConfigResponse( SetbaseConfig($tmp, $_SERVER['function_name'], $_SERVER['Region'], $_SERVER['namespace'], $tmp['SecretId'], $tmp['SecretKey']) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $html = getconstStr('Success') . ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + ' . getconstStr('Create') . ' SecretId & SecretKey
+
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); } diff --git a/platform/TencentSCF_file.php b/platform/TencentSCF_file.php index 78e8600..479ea5d 100644 --- a/platform/TencentSCF_file.php +++ b/platform/TencentSCF_file.php @@ -1,4 +1,7 @@ - ', 'Program updating', 201); + ', 'Program updating', 201, 1); } - return output('Jump + return message(getconstStr('Success') . ' - ', 302); + var i = 0; + var uploadList = setInterval(function(){ + if (document.getElementById("dis").style.display=="none") { + console.log(i++); + } else { + clearInterval(uploadList); + location.href = "' . path_format($_SERVER['base_path'] . '/') . '"; + } + }, 1000); + ', 201, 1); } if ($_GET['install1']) { $tmp['timezone'] = $_COOKIE['timezone']; - $SecretId = getConfig('SecretId'); - if ($SecretId=='') { - $SecretId = $_POST['SecretId']; - $tmp['SecretId'] = $SecretId; - } - $SecretKey = getConfig('SecretKey'); - if ($SecretKey=='') { - $SecretKey = $_POST['SecretKey']; - $tmp['SecretKey'] = $SecretKey; - } + $SecretId = $_POST['SecretId']; + $tmp['SecretId'] = $SecretId; + $SecretKey = $_POST['SecretKey']; + $tmp['SecretKey'] = $SecretKey; $tmp['ONEMANAGER_CONFIG_SAVE'] = $_POST['ONEMANAGER_CONFIG_SAVE']; $response = json_decode(SetbaseConfig($tmp, $_SERVER['function_name'], $_SERVER['Region'], $_SERVER['namespace'], $SecretId, $SecretKey), true)['Response']; if (api_error($response)) { @@ -211,7 +216,7 @@ function install() if ($tmp['ONEMANAGER_CONFIG_SAVE'] != 'file') { $html = getconstStr('ONEMANAGER_CONFIG_SAVE_ENV') . '
' . getconstStr('Home') . ''; $title = 'Reinstall'; - return message($html, $title, 201); + return message($html, $title, 201, 1); } $html .= ' @@ -229,7 +234,7 @@ function install() } '; $title = getconstStr('SetAdminPassword'); - return message($html, $title, 201); + return message($html, $title, 201, 1); } } if ($_GET['install0']) { @@ -240,10 +245,11 @@ language:
'; $html .= '
'; } - if (getConfig('SecretId')==''||getConfig('SecretKey')=='') $html .= ' + //if (getConfig('SecretId')==''||getConfig('SecretKey')=='') + $html .= ' '.getconstStr('Create').' SecretId & SecretKey

-
'; +
'; $html .= '

'; @@ -267,7 +273,8 @@ language:
'; } function notnull(t) {'; - if (getConfig('SecretId')==''||getConfig('SecretKey')=='') $html .= ' + //if (getConfig('SecretId')==''||getConfig('SecretKey')=='') + $html .= ' if (t.SecretId.value==\'\') { alert(\'input SecretId\'); return false; @@ -588,27 +595,25 @@ function setConfigResponse($response) return json_decode( $response, true )['Response']; } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { $source = '/tmp/code.zip'; $outPath = '/tmp/'; - // 从github下载对应tar.gz,并解压 - $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return json_encode(['Response'=>['Error'=>['code'=>'Git Source input Error!']]]); $tarfile = '/tmp/github.tar.gz'; file_put_contents($tarfile, file_get_contents($url)); $phar = new PharData($tarfile); $html = $phar->extractTo($outPath, null, true);//路径 要解压的文件 是否覆盖 - // 获取包中目录名 - $tmp = scandir('phar://'.$tarfile); - $name = $auth.'-'.$project; - foreach ($tmp as $f) { - if ( substr($f, 0, strlen($name)) == $name) { - $outPath .= $f; - break; - } - } + // 获取解压出的目录名 + $outPath = findIndexPath($outPath); + // 放入配置文件 file_put_contents($outPath . '/.data/config.php', file_get_contents(__DIR__ . '/../.data/config.php')); @@ -642,10 +647,60 @@ function addFileToZip($zip, $rootpath, $path = '') } } } - @closedir($path); + @closedir($handler); } function WaitFunction() { if ( json_decode(getfunctioninfo($_SERVER['function_name'], $_SERVER['Region'], $_SERVER['namespace'], getConfig('SecretId'), getConfig('SecretKey')),true)['Response']['Status']=='Active' ) return true; else return false; } + +function changeAuthKey() { + if ($_POST['SecretId']!=''&&$_POST['SecretId']!='') { + $tmp['SecretId'] = $_POST['SecretId']; + $tmp['SecretKey'] = $_POST['SecretKey']; + $response = setConfigResponse( SetbaseConfig($tmp, $_SERVER['function_name'], $_SERVER['Region'], $_SERVER['namespace'], $tmp['SecretId'], $tmp['SecretKey']) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $html = getconstStr('Success') . ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + ' . getconstStr('Create') . ' SecretId & SecretKey
+
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/platform/Vercel.php b/platform/Vercel.php index 07d0dd6..aa4a4f8 100644 --- a/platform/Vercel.php +++ b/platform/Vercel.php @@ -151,6 +151,7 @@ function setConfig($arr, $disktag = '') } $envs = array_filter($envs, 'array_value_isnot_null'); //ksort($envs); + //sortConfig($envs); //error_log1(json_encode($arr, JSON_PRETTY_PRINT) . ' => tmp:' . json_encode($envs, JSON_PRETTY_PRINT)); //echo json_encode($arr, JSON_PRETTY_PRINT) . ' => tmp:' . json_encode($envs, JSON_PRETTY_PRINT); return setVercelConfig($envs, getConfig('HerokuappId'), getConfig('APIKey')); @@ -186,16 +187,24 @@ function install() $title = 'Error'; return message($html, $title, 400); } else { - /*$html = ''; - return message($html, $title, 201, 1);*/ - $data["dplId"] = $response['DplStatus']; - return output(json_encode($data), 201); + return message($html, $title, 201, 1); } } } @@ -207,10 +216,9 @@ language:
'; $html .= '
'; } - //if (getConfig('APIKey')=='') $html .= '
' . getconstStr('Create') . ' token
-
'; +
'; $html .= '

'; $html .= ' @@ -243,52 +251,7 @@ language:
'; alert(\'input Token\'); return false; } - t.style.display = "none"; - errordiv.innerHTML = "' . getconstStr('Wait') . '"; - var xhr = new XMLHttpRequest(); - xhr.open("POST", t.action); - xhr.onload = function(e) { - if (xhr.status==201) { - var res = JSON.parse(xhr.responseText); - getStatus(res.dplId, t.APIKey.value); - } else { - t.style.display = ""; - errordiv.innerHTML = xhr.status + "
" + xhr.responseText; - } - } - xhr.send("admin=" + t.admin.value + "&APIKey=" + t.APIKey.value); - - var x = ""; - var min = 0; - function getStatus(id, VercelToken) { - x += "."; - min++; - var xhr = new XMLHttpRequest(); - var url = "https://api.vercel.com/v11/now/deployments/" + id; - xhr.open("GET", url); - xhr.setRequestHeader("Authorization", "Bearer " + VercelToken); - xhr.onload = function(e) { - if (xhr.status==200) { - var deployStat = JSON.parse(xhr.responseText).readyState; - if (deployStat=="READY") { - x = ""; - min = 0; - errordiv.innerHTML = "Deploy done."; - location.href = "/"; - } else { - errordiv.innerHTML = deployStat + ", " + min + ".
' . getconstStr('Wait') . ' " + x; - if (deployStat!=="ERROR") setTimeout(function() { getStatus(id, VercelToken) }, 1000); - } - } else { - t.style.display = ""; - console.log(xhr.status); - console.log(xhr.responseText); - } - } - xhr.send(null); - } - - return false; + return true; } '; $title = getconstStr('SelectLanguage'); @@ -328,7 +291,7 @@ function copyFolder($from, $to) function setVercelConfig($envs, $appId, $token) { - //sortConfig($envs); cant view in vercel, not need sort. + sortConfig($envs); $outPath = '/tmp/code/'; $outPath_Api = $outPath . 'api/'; $coderoot = __DIR__; @@ -344,7 +307,8 @@ function setVercelConfig($envs, $appId, $token) function VercelUpdate($appId, $token, $sourcePath = "") { - $url = "https://api.vercel.com/v12/now/deployments"; + if (checkBuilding($appId, $token)) return '{"error":{"message":"Another building is in progress."}}'; + $url = "https://api.vercel.com/v13/deployments"; $header["Authorization"] = "Bearer " . $token; $header["Content-Type"] = "application/json"; $data["name"] = "OneManager"; @@ -366,6 +330,23 @@ function VercelUpdate($appId, $token, $sourcePath = "") return json_encode($result); } +function checkBuilding($projectId, $token) +{ + $r = 0; + $url = "https://api.vercel.com/v6/deployments/?projectId=" . $projectId; + $header["Authorization"] = "Bearer " . $token; + $header["Content-Type"] = "application/json"; + $response = curl("GET", $url, '', $header); + //echo json_encode($response, JSON_PRETTY_PRINT) . " ,res
"; + $result = json_decode($response["body"], true); + foreach ( $result['deployments'] as $deployment ) { + if ($deployment['state']!=="READY") $r++; + } + return $r; + //if ($r===0) return true; + //else return false; +} + function getEachFiles(&$file, $base, $path = "") { //if (substr($base, -1)=="/") $base = substr($base, 0, -1); @@ -407,34 +388,33 @@ function setConfigResponse($response) return json_decode($response, true); } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { $tmppath = '/tmp'; - // 从github下载对应tar.gz,并解压 - $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return json_encode(['error'=>['code'=>'Git Source input Error!']]); + $tarfile = $tmppath . '/github.tar.gz'; - $githubfile = file_get_contents($url); - if (!$githubfile) return '{"error":{"message":"fail to download from github"}}'; - file_put_contents($tarfile, $githubfile); - $phar = new PharData($tarfile); // need php5.3, 7, 8 - $phar->extractTo($tmppath, null, true);//路径 要解压的文件 是否覆盖 + file_put_contents($tarfile, file_get_contents($url)); + $phar = new PharData($tarfile); + $html = $phar->extractTo($tmppath, null, true);//路径 要解压的文件 是否覆盖 unlink($tarfile); - $outPath = ''; - $tmp = scandir($tmppath); - $name = $auth . '-' . $project; + // 获取解压出的目录名 + $outPath = findIndexPath($tmppath); + + if ($outPath=='') return '{"error":{"message":"no outpath"}}'; + $name = $project . 'CODE'; mkdir($tmppath . "/" . $name, 0777, 1); - foreach ($tmp as $f) { - if ( substr($f, 0, strlen($name)) == $name) { - rename($tmppath . '/' . $f, $tmppath . "/" . $name . '/api'); - $outPath = $tmppath . "/" . $name; - break; - } - } + rename($outPath, $tmppath . "/" . $name . '/api'); + $outPath = $tmppath . "/" . $name; //echo $outPath . "
"; //error_log1($outPath); - if ($outPath=='') return '{"error":{"message":"no outpath"}}'; // put in config $coderoot = __DIR__; @@ -452,7 +432,7 @@ function WaitFunction($deployid = '') { } $header["Authorization"] = "Bearer " . getConfig('APIKey'); $header["Content-Type"] = "application/json"; - $url = "https://api.vercel.com/v11/now/deployments/" . $deployid; + $url = "https://api.vercel.com/v11/deployments/" . $deployid; $response = curl("GET", $url, "", $header); if ($response['stat']==200) { $result = json_decode($response['body'], true); @@ -464,3 +444,48 @@ function WaitFunction($deployid = '') { return $response; } } + +function changeAuthKey() { + if ($_POST['APIKey']!='') { + $APIKey = $_POST['APIKey']; + $tmp['APIKey'] = $APIKey; + $response = setConfigResponse( setVercelConfig($tmp, getConfig('HerokuappId'), $APIKey) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $html = getconstStr('Success') . ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + ' . getconstStr('Create') . ' token
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/platform/Vercel_env.php b/platform/Vercel_env.php index 4ebd486..c0f3607 100644 --- a/platform/Vercel_env.php +++ b/platform/Vercel_env.php @@ -163,9 +163,6 @@ function install() //$tmp['language'] = $_POST['language']; $tmp['timezone'] = $_COOKIE['timezone']; $APIKey = $_POST['APIKey']; - //if ($APIKey=='') { - // $APIKey = getConfig('APIKey'); - //} $tmp['APIKey'] = $APIKey; $token = $APIKey; @@ -184,16 +181,24 @@ function install() $title = 'Error'; return message($html, $title, 400); } else { - /*$html = ''; - return message($html, $title, 201, 1);*/ - $data["dplId"] = $response['DplStatus']; - return output(json_encode($data), 201); + return message($html, $title, 201, 1); } } } @@ -205,10 +210,9 @@ language:
'; $html .= '
'; } - //if (getConfig('APIKey')=='') $html .= '
' . getconstStr('Create') . ' token
-
'; +
'; $html .= '

'; $html .= ' @@ -241,52 +245,7 @@ language:
'; alert(\'input Token\'); return false; } - t.style.display = "none"; - errordiv.innerHTML = "' . getconstStr('Wait') . '"; - var xhr = new XMLHttpRequest(); - xhr.open("POST", t.action); - xhr.onload = function(e) { - if (xhr.status==201) { - var res = JSON.parse(xhr.responseText); - getStatus(res.dplId, t.APIKey.value); - } else { - t.style.display = ""; - errordiv.innerHTML = xhr.status + "
" + xhr.responseText; - } - } - xhr.send("admin=" + t.admin.value + "&APIKey=" + t.APIKey.value); - - var x = ""; - var min = 0; - function getStatus(id, VercelToken) { - x += "."; - min++; - var xhr = new XMLHttpRequest(); - var url = "https://api.vercel.com/v11/now/deployments/" + id; - xhr.open("GET", url); - xhr.setRequestHeader("Authorization", "Bearer " + VercelToken); - xhr.onload = function(e) { - if (xhr.status==200) { - var deployStat = JSON.parse(xhr.responseText).readyState; - if (deployStat=="READY") { - x = ""; - min = 0; - errordiv.innerHTML = "Deploy done."; - location.href = "/"; - } else { - errordiv.innerHTML = deployStat + ", " + min + ".
' . getconstStr('Wait') . ' " + x; - if (deployStat!=="ERROR") setTimeout(function() { getStatus(id, VercelToken) }, 1000); - } - } else { - t.style.display = ""; - console.log(xhr.status); - console.log(xhr.responseText); - } - } - xhr.send(null); - } - - return false; + return true; } '; $title = getconstStr('SelectLanguage'); @@ -335,7 +294,8 @@ function setVercelConfig($envs, $appId, $token) function VercelUpdate($appId, $token, $sourcePath = "") { - $url = "https://api.vercel.com/v12/now/deployments"; + if (checkBuilding($appId, $token)) return '{"error":{"message":"Another building is in progress."}}'; + $url = "https://api.vercel.com/v13/deployments"; $header["Authorization"] = "Bearer " . $token; $header["Content-Type"] = "application/json"; $data["name"] = "OneManager"; @@ -357,6 +317,23 @@ function VercelUpdate($appId, $token, $sourcePath = "") return json_encode($result); } +function checkBuilding($projectId, $token) +{ + $r = 0; + $url = "https://api.vercel.com/v6/deployments/?projectId=" . $projectId; + $header["Authorization"] = "Bearer " . $token; + $header["Content-Type"] = "application/json"; + $response = curl("GET", $url, '', $header); + //echo json_encode($response, JSON_PRETTY_PRINT) . " ,res
"; + $result = json_decode($response["body"], true); + foreach ( $result['deployments'] as $deployment ) { + if ($deployment['state']!=="READY") $r++; + } + return $r; + //if ($r===0) return true; + //else return false; +} + function getEachFiles(&$file, $base, $path = "") { //if (substr($base, -1)=="/") $base = substr($base, 0, -1); @@ -398,34 +375,33 @@ function setConfigResponse($response) return json_decode($response, true); } -function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') +function OnekeyUpate($GitSource = 'Github', $auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master') { $tmppath = '/tmp'; - // 从github下载对应tar.gz,并解压 - $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + if ($GitSource=='Github') { + // 从github下载对应tar.gz,并解压 + $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/'; + } elseif ($GitSource=='HITGitlab') { + $url = 'https://git.hit.edu.cn/' . $auth . '/' . $project . '/-/archive/' . urlencode($branch) . '/' . $project . '-' . urlencode($branch) . '.tar.gz'; + } else return json_encode(['error'=>['code'=>'Git Source input Error!']]); + $tarfile = $tmppath . '/github.tar.gz'; - $githubfile = file_get_contents($url); - if (!$githubfile) return '{"error":{"message":"fail to download from github"}}'; - file_put_contents($tarfile, $githubfile); - $phar = new PharData($tarfile); // need php5.3, 7, 8 - $phar->extractTo($tmppath, null, true);//路径 要解压的文件 是否覆盖 + file_put_contents($tarfile, file_get_contents($url)); + $phar = new PharData($tarfile); + $html = $phar->extractTo($tmppath, null, true);//路径 要解压的文件 是否覆盖 unlink($tarfile); - $outPath = ''; - $tmp = scandir($tmppath); - $name = $auth . '-' . $project; - mkdir($tmppath . "/" . $name, 0777); - foreach ($tmp as $f) { - if ( substr($f, 0, strlen($name)) == $name) { - rename($tmppath . '/' . $f, $tmppath . "/" . $name . '/api'); - $outPath = $tmppath . "/" . $name; - break; - } - } + // 获取解压出的目录名 + $outPath = findIndexPath($tmppath); + + if ($outPath=='') return '{"error":{"message":"no outpath"}}'; + $name = $project . 'CODE'; + mkdir($tmppath . "/" . $name, 0777, 1); + rename($outPath, $tmppath . "/" . $name . '/api'); + $outPath = $tmppath . "/" . $name; //echo $outPath . "
"; //error_log1($outPath); - if ($outPath=='') return '{"error":{"message":"no outpath"}}'; return VercelUpdate(getConfig('HerokuappId'), getConfig('APIKey'), $outPath); } @@ -438,7 +414,7 @@ function WaitFunction($deployid) { } $header["Authorization"] = "Bearer " . getConfig('APIKey'); $header["Content-Type"] = "application/json"; - $url = "https://api.vercel.com/v11/now/deployments/" . $deployid; + $url = "https://api.vercel.com/v11/deployments/" . $deployid; $response = curl("GET", $url, "", $header); if ($response['stat']==200) { $result = json_decode($response['body'], true); @@ -450,3 +426,48 @@ function WaitFunction($deployid) { return $response; } } + +function changeAuthKey() { + if ($_POST['APIKey']!='') { + $APIKey = $_POST['APIKey']; + $tmp['APIKey'] = $APIKey; + $response = json_decode(setVercelConfig($tmp, getConfig('HerokuappId'), $APIKey), true); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $html = getconstStr('Success') . ' + '; + return message($html, $title, 201, 1); + } + } + $html = ' + + ' . getconstStr('Create') . ' token
+
+ + + '; + return message($html, 'Change platform Auth token or key', 200); +} diff --git a/readme.md b/readme.md index 3f12e7d..4bd5dca 100644 --- a/readme.md +++ b/readme.md @@ -8,40 +8,6 @@ --- -# Deploy to Heroku - -### Official - - https://heroku.com - -### Demo - - https://herooneindex.herokuapp.com/ - -### How to Install - -> ~~Click the button [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy) to Deploy a new app~~(`"We couldn't deploy your app because the source code violates the Salesforce Acceptable Use and External-Facing Services Policy."`) -> -> Star this project, then Fork, create a app in Heroku, then turn to the Deploy tab, "Deployment method" via "Connect GitHub", select your github fork. - ---- - -# Deploy to Glitch - -### Official - - https://glitch.com/ - -### Demo - - https://onemanager.glitch.me/ - -### How to Install - - [New Project] -> [Import form Github] -> paste "https://github.com/qkqpttgf/OneManager-php" , after done, [Show] -> [In a New Window]. - ---- - # Deploy to Vercel ### Official @@ -60,7 +26,64 @@ ### How to Install - https://scfonedrive.github.io/Vercel/Deploy.html . +> https://scfonedrive.github.io/Vercel/Deploy.html . + +--- + +# Deploy to Replit + +### Official + + https://repl.it/ + https://replit.com/ + +### Demo + + https://onemanager.qkqpttgf.repl.co/ + +### Notice + +> `Import from Github` useing the `.replit` file in code files will cause an empty web page, may someone help me? + +### How to Install + +> 1. Click the "+" or "Create Repl", find template "PHP Web Server" (via input "php"), input a name for your project in "Title" or left it default, Click the "+ Create Repl". +> 2. After done, input `git clone https://github.com/qkqpttgf/OneManager-php && mv -b OneManager-php/* ./ && mv -b OneManager-php/.[^.]* ./ && rm -rf *~ && rm -rf OneManager-php` to Console or Shell on the right, press "Enter" to run it. +> 3. Click the green button "Run", it will show the web page on the right, you can open it in a new tab or window. + +--- + +# Deploy to Heroku + +### Official + + https://heroku.com + +### Demo + + https://herooneindex.herokuapp.com/ + +### How to Install + +> ~~Click the button [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy) to Deploy a new app~~(`"We couldn't deploy your app because the source code violates the Salesforce Acceptable Use and External-Facing Services Policy."`) +> +> Star this project, then Fork, create an app in Heroku, then turn to the Deploy tab, "Deployment method" via "Connect GitHub", select your github fork. + +--- + +# Deploy to Glitch + +### Official + + https://glitch.com/ + +### Demo + + https://onemanager.glitch.me/ + +### How to Install + + [New Project] -> [Import form Github] -> paste "https://github.com/qkqpttgf/OneManager-php" , after done, [Show] -> [In a New Window]. --- diff --git a/readme_cn.md b/readme_cn.md index 5d45aaf..bf8ab5e 100644 --- a/readme_cn.md +++ b/readme_cn.md @@ -2,12 +2,59 @@ # 注意: + 请关掉浏览器的翻译。 + Releases只是当存档在用的,并不是最新代码。 请将设置中所有的设置项的说明都读一遍,有些问题就不用问了。 --- +# 部署到 Vercel + +### 官网 + + https://vercel.com/ + +### Demo + + https://onemanager-php.vercel.app/ + +### 注意 + +> 1. 每次更改配置后都要等 30-50s 来确保部署成功; +> +> 2. Vercel 每天限制 100 次部署。 + +### 安装(英文) + + https://scfonedrive.github.io/Vercel/Deploy.html + +--- + +# 部署到 Replit + +### 官网 + + https://repl.it/ + https://replit.com/ + +### Demo + + https://onemanager.qkqpttgf.repl.co/ + +### 注意 + +> 直接`Import from Github`通过`.replit`文件指定php时,网页会空白,有人帮忙解决吗? + +### 安装 + +> 1. 点右上的 "+" 或左上的 "+ Create Repl",template中输入php,点选"PHP Web Server",在"Title"里输入你想要的名称或者让它默认, 点下面的"+ Create Repl"。 +> 2. 结束后,在右边的Console或Shell里输入 `git clone https://github.com/qkqpttgf/OneManager-php && mv -b OneManager-php/* ./ && mv -b OneManager-php/.[^.]* ./ && rm -rf *~ && rm -rf OneManager-php` 敲回车运行。 +> 3. 点上方的绿色 "Run" 按钮,右边会显示一个网页,你要在新窗口打开它来安装,不然不能登录。 + +--- + # 部署到 Heroku ### 官网 @@ -40,28 +87,6 @@ --- -# 部署到 Vercel - -### 官网 - - https://vercel.com/ - -### Demo - - https://onemanager-php.vercel.app/ - -### 注意 - -> 1. 每次更改配置后都要等 30-50s 来确保部署成功; -> -> 2. Vercel 每天限制 100 次部署。 - -### 安装(英文) - - https://scfonedrive.github.io/Vercel/Deploy.html - ---- - # 部署到腾讯无服务器云函数 Serverless Cloud Function (SCF) ### 官网 diff --git a/theme/Onedrive-dev.html b/theme/Onedrive-dev.html index 995a818..ac58e13 100644 --- a/theme/Onedrive-dev.html +++ b/theme/Onedrive-dev.html @@ -305,7 +305,7 @@
-   +  
@@ -396,6 +396,7 @@ - + - + diff --git a/theme/flatcard.html b/theme/flatcard.html index 16e4224..739f008 100644 --- a/theme/flatcard.html +++ b/theme/flatcard.html @@ -558,7 +558,9 @@ var $url = document.getElementById('url'); if ($url) { - $url.innerHTML = location.protocol + '//' + location.host + $url.innerHTML; + let url = location.href; + url = url.substr(0, url.length-8); + $url.innerHTML = url.replace(/&/g, '&'); $url.style.height = $url.scrollHeight + 'px'; } diff --git a/theme/nchyn_grey.html b/theme/nchyn_grey.html index b9493d6..e153f42 100644 --- a/theme/nchyn_grey.html +++ b/theme/nchyn_grey.html @@ -222,7 +222,7 @@
-   +  
@@ -717,7 +717,10 @@ return false; var $url = document.getElementById('url'); if ($url) { - $url.innerHTML = location.protocol + '//' + location.host + $url.innerHTML; + //$url.innerHTML = location.protocol + '//' + location.host + $url.innerHTML; + let url = location.href; + url = url.substr(0, url.length-8); + $url.innerHTML = url.replace(/&/g, '&'); $url.style.height = $url.scrollHeight + 'px'; } diff --git a/theme/onemoe.html b/theme/onemoe.html index 76a3308..78a6001 100644 --- a/theme/onemoe.html +++ b/theme/onemoe.html @@ -479,7 +479,10 @@ var $url = document.getElementById('url'); if ($url) { - $url.innerHTML = location.protocol + '//' + location.host + $url.innerHTML; + //$url.innerHTML = location.protocol + '//' + location.host + $url.innerHTML; + let url = location.href; + url = url.substr(0, url.length-8); + $url.innerHTML = url.replace(/&/g, '&'); $url.style.height = $url.scrollHeight + 'px'; } diff --git a/theme/purecool.html b/theme/purecool.html index 3582fa3..419829f 100644 --- a/theme/purecool.html +++ b/theme/purecool.html @@ -179,7 +179,7 @@
-   +  
@@ -509,7 +509,10 @@ var $url = document.getElementById('url'); if ($url) { - $url.innerHTML = location.protocol + '//' + location.host + $url.innerHTML; + //$url.innerHTML = location.protocol + '//' + location.host + $url.innerHTML; + let url = location.href; + url = url.substr(0, url.length-8); + $url.innerHTML = url.replace(/&/g, '&'); $url.style.height = $url.scrollHeight + 'px'; } diff --git a/theme/renexmoe.html b/theme/renexmoe.html index cd0d0c1..b86fc5a 100644 --- a/theme/renexmoe.html +++ b/theme/renexmoe.html @@ -98,13 +98,9 @@
-
  • - account_circle登录 +
  • + account_circle + 登录
  • diff --git a/theme/tfo.html b/theme/tfo.html index cc6aa5c..0e2ca1e 100644 --- a/theme/tfo.html +++ b/theme/tfo.html @@ -187,10 +187,10 @@
    - + -
    • +
      • @@ -300,7 +300,9 @@ var prePath = strFullPath.substring(0, pos); var width = window.innerWidth; // var postPath = strPath.substring(0, strPath.substr(1).indexOf('/') + 1); - document.getElementById("url").value= prePath + ""; + let url = location.href; + url = url.substr(0, url.length-8); + document.getElementById("url").value= url; // document.getElementById("url").value= prePath + postPath + ""; if(width < 495) { if(document.getElementById("office-a")) { @@ -603,7 +605,7 @@ - + - + diff --git a/version b/version index 8241a53..e07b8dd 100644 --- a/version +++ b/version @@ -1,7 +1,31 @@ +20211220-1100.42 +Add new platform Replit. Add a git source for update. sha1.js use jsdelivr cdn. fix some bugs. +新增Replit平台。新增国内git源,以后国内可以选择从HIT源更新。sha1.js换成jsdelivr CDN。修复bug。 + +20211201-1602.41 +add a latent function, you can edit platform token(or API key) via '?setup=auth' when the token invalid, not need edit it in Environment(or Config Var) manually, (even in Vercel, config saved in file, and can't modiy it manually). +新增隐藏功能,在平台操作代码的token或API key失效时,可以在 '?setup=auth' 修改它,不用去环境变量修改了(特别地,Vercel保存在代码中时都改不到)。 +20211129 +check if there is another deployment building when start deploy. +Vercel部署时检测是否有另一个部署。 +20211104 +check if exist php-curl or not in php host and VPS. +在VPS中检测是否有php-curl。 +20211021 +specialchars, fix: list folder, encrypt folder, preview files, rename, show in title, error on back link after login at specialchars folder, etc. +针对特殊字符,解决目录的列表,目录的加密,文件的预览,目录与文件重命名,在网页标题的显示,在特殊字符处登录后跳转出错等问题。 +20211006 +oprate files by fileID, write a localStorage when login to anti CSRF. +管理时对文件id操作,管理登录时写入一个localStorage预防CSRF。 +20210908 +add fileConduitSize&fileConduitCacheTime, little files can stream from program, better to show html/js as local file. +增加fileConduitSize,fileConduitCacheTime,小文件可以从服务器中转,以对html/js本地化更好的支持。 +20210903 +add a latent function, you can run some command by '?setup=cmd', be care, please dont try "top", and set times by "ping -c 4". +新增隐藏功能,你可以通过'?setup=cmd'来跑一些命令,注意不要试图跑top,另外ping请-c设置次数。 20210820-1810.40 because Vercel must redeploy after change Environment Variables, and it must <4k, so decide that, save config in code file. in Vercel, after update, please install again. if you want continue use Environment, please add a ( name: "ONEMANAGER_CONFIG_SAVE", value: "env" ) in Environment Variables in Project Settings before update. 因为Vercel修改环境变量也必须重新部署才生效,而且环境变量只能小于4k,所以决定将配置保存在代码文件中。升级更新后,用Vercel的请重新安装。如果还想继续使用环境变量,请在更新前,在Project Settings的Environment Variables中,新增一个( name: "ONEMANAGER_CONFIG_SAVE", value: "env" )的环境变量。 - 20210817-2030.39 fix bugs in Vercel. add wait function in operating. change update method in SCF. add payme in readme. 修复一些Vercel上的bug。在操作完后添加等待功能,确认平台已经准备好。SCF的更新方式改变。在readme中添加讨饭链接。