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 .= '
+
+
';
+ return message($html, $title, 201, 1);
+ }
+ }
+ $html = '
+
+ ';
+ 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 = '
+
+ ';
+ 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 = '
+
+ ';
+ 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 = '
+
+ ';
+ 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 = '
+
+ ';
+ 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 .= '
+
+ ';
+ $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 .= '
+
+ ';
+ $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 .= '
+ ';
+ 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 .= '
+ ';
+ 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 = '
+
+ ';
+ 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 = '
+
+ ';
+ 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 [](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 [](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 @@
-
+
-
+