Normal.php 13.2 KB
Newer Older
Q
qkqpttgf 已提交
1 2 3 4
<?php

function getpath()
{
Q
qkqpttgf 已提交
5
    $_SERVER['firstacceptlanguage'] = strtolower(splitfirst(splitfirst($_SERVER['HTTP_ACCEPT_LANGUAGE'],';')[0],',')[0]);
Q
qkqpttgf 已提交
6
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
Q
qkqpttgf 已提交
7
    $_SERVER['base_path'] = path_format(substr($_SERVER['SCRIPT_NAME'], 0, -10) . '/');
Q
qkqpttgf 已提交
8
    if (isset($_SERVER['UNENCODED_URL'])) $_SERVER['REQUEST_URI'] = $_SERVER['UNENCODED_URL'];
Q
qkqpttgf 已提交
9 10 11 12
    $p = strpos($_SERVER['REQUEST_URI'],'?');
    if ($p>0) $path = substr($_SERVER['REQUEST_URI'], 0, $p);
    else $path = $_SERVER['REQUEST_URI'];
    $path = path_format( substr($path, strlen($_SERVER['base_path'])) );
13 14
    return $path;
    //return substr($path, 1);
Q
qkqpttgf 已提交
15 16 17 18 19
    //return spurlencode($path, '/');
}

function getGET()
{
Q
qkqpttgf 已提交
20
    if (isset($_SERVER['UNENCODED_URL'])) $_SERVER['REQUEST_URI'] = $_SERVER['UNENCODED_URL'];
Q
qkqpttgf 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
    $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 [];
    }
}

Q
qkqpttgf 已提交
44 45
function getConfig($str, $disktag = '')
{
Q
qkqpttgf 已提交
46
    global $InnerEnv;
47
    global $Base64Env;
Q
qkqpttgf 已提交
48 49
    //include 'config.php';
    $s = file_get_contents('config.php');
50 51
    //$configs = substr($s, 18, -2);
    $configs = '{' . splitlast(splitfirst($s, '{')[1], '}')[0] . '}';
Q
qkqpttgf 已提交
52 53
    if ($configs!='') {
        $envs = json_decode($configs, true);
Q
qkqpttgf 已提交
54
        if (in_array($str, $InnerEnv)) {
Q
qkqpttgf 已提交
55 56
            if ($disktag=='') $disktag = $_SERVER['disktag'];
            if (isset($envs[$disktag][$str])) {
R
root 已提交
57
                if (in_array($str, $Base64Env)) return base64y_decode($envs[$disktag][$str]);
Q
qkqpttgf 已提交
58 59
                else return $envs[$disktag][$str];
            }
60
        } else {
Q
qkqpttgf 已提交
61
            if (isset($envs[$str])) {
R
root 已提交
62
                if (in_array($str, $Base64Env)) return base64y_decode($envs[$str]);
Q
qkqpttgf 已提交
63 64
                else return $envs[$str];
            }
65
        }
Q
qkqpttgf 已提交
66 67 68 69 70 71
    }
    return '';
}

function setConfig($arr, $disktag = '')
{
Q
qkqpttgf 已提交
72
    global $InnerEnv;
73
    global $Base64Env;
Q
qkqpttgf 已提交
74 75 76
    if ($disktag=='') $disktag = $_SERVER['disktag'];
    //include 'config.php';
    $s = file_get_contents('config.php');
77 78
    //$configs = substr($s, 18, -2);
    $configs = '{' . splitlast(splitfirst($s, '{')[1], '}')[0] . '}';
Q
qkqpttgf 已提交
79 80
    if ($configs!='') $envs = json_decode($configs, true);
    $disktags = explode("|",getConfig('disktag'));
Q
qkqpttgf 已提交
81
    $indisk = 0;
Q
qkqpttgf 已提交
82 83
    $operatedisk = 0;
    foreach ($arr as $k => $v) {
Q
qkqpttgf 已提交
84
        if (in_array($k, $InnerEnv)) {
R
root 已提交
85
            if (in_array($k, $Base64Env)) $envs[$disktag][$k] = base64y_encode($v);
86
            else $envs[$disktag][$k] = $v;
Q
qkqpttgf 已提交
87
            $indisk = 1;
Q
qkqpttgf 已提交
88 89 90 91 92 93 94 95
        } elseif ($k=='disktag_add') {
            array_push($disktags, $v);
            $operatedisk = 1;
        } elseif ($k=='disktag_del') {
            $disktags = array_diff($disktags, [ $v ]);
            $envs[$v] = '';
            $operatedisk = 1;
        } else {
R
root 已提交
96
            if (in_array($k, $Base64Env)) $envs[$k] = base64y_encode($v);
Q
qkqpttgf 已提交
97
            else $envs[$k] = $v;
Q
qkqpttgf 已提交
98 99
        }
    }
Q
qkqpttgf 已提交
100 101
    if ($indisk) {
        $diskconfig = $envs[$disktag];
Q
qkqpttgf 已提交
102 103
        $diskconfig = array_filter($diskconfig, 'array_value_isnot_null');
        ksort($diskconfig);
Q
qkqpttgf 已提交
104 105
        $envs[$disktag] = $diskconfig;
    }
Q
qkqpttgf 已提交
106 107 108 109 110 111 112 113 114
    if ($operatedisk) {
        $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');
    ksort($envs);
    //echo '<pre>'. json_encode($envs, JSON_PRETTY_PRINT).'</pre>';
115 116
    $prestr = '<?php $configs = \'' . PHP_EOL;
    $aftstr = PHP_EOL . '\';';
Q
qkqpttgf 已提交
117 118 119
    $response = file_put_contents('config.php', $prestr . json_encode($envs, JSON_PRETTY_PRINT) . $aftstr);
    if ($response>0) return json_encode( [ 'response' => 'success' ] );
    return json_encode( [ 'message' => 'Failed to write config.', 'code' => 'failed' ] );
Q
qkqpttgf 已提交
120 121 122 123 124
}

function install()
{
    global $constStr;
Q
qkqpttgf 已提交
125
    if ($_GET['install2']) {
Q
qkqpttgf 已提交
126 127
        if ($_POST['admin']!='') {
            $tmp['admin'] = $_POST['admin'];
Q
qkqpttgf 已提交
128
            //$tmp['language'] = $_COOKIE['language'];
Q
qkqpttgf 已提交
129
            $tmp['timezone'] = $_COOKIE['timezone'];
Q
qkqpttgf 已提交
130
            $response = setConfigResponse( setConfig($tmp) );
131 132
            if (api_error($response)) {
                $html = api_error_msg($response);
Q
qkqpttgf 已提交
133 134 135
                $title = 'Error';
                return message($html, $title, 201);
            } else {
Q
qkqpttgf 已提交
136 137 138 139 140 141 142 143
                return output('Jump
            <script>
                var expd = new Date();
                expd.setTime(expd.getTime()+(2*60*60*1000));
                var expires = "expires="+expd.toGMTString();
                document.cookie=\'language=; path=/; \'+expires;
            </script>
            <meta http-equiv="refresh" content="3;URL=' . path_format($_SERVER['base_path'] . '/') . '">', 302);
Q
qkqpttgf 已提交
144
            }
Q
qkqpttgf 已提交
145 146
        }
    }
Q
qkqpttgf 已提交
147
    if ($_GET['install1']) {
Q
qkqpttgf 已提交
148
        if (!ConfigWriteable()) {
Q
qkqpttgf 已提交
149
            $html .= getconstStr('MakesuerWriteable');
Q
qkqpttgf 已提交
150 151 152
            $title = 'Error';
            return message($html, $title, 201);
        }
Q
qkqpttgf 已提交
153
        /*if (!RewriteEngineOn()) {
Q
qkqpttgf 已提交
154
            $html .= getconstStr('MakesuerRewriteOn');
Q
qkqpttgf 已提交
155 156
            $title = 'Error';
            return message($html, $title, 201);
Q
qkqpttgf 已提交
157 158 159 160 161 162 163 164 165
        }*/
        $html .= '<button id="checkrewritebtn" onclick="checkrewrite();">'.getconstStr('MakesuerRewriteOn').'</button>
<div id="formdiv" style="display: none">
    <form action="?install2" method="post" onsubmit="return notnull(this);">
        <input name="admin" type="password" placeholder="' . getconstStr('EnvironmentsDescription')['admin'] . '" size="' . strlen(getconstStr('EnvironmentsDescription')['admin']) . '"><br>
        <input id="submitbtn" type="submit" value="'.getconstStr('Submit').'" disabled>
    </form>
</div>
    <script>
Q
qkqpttgf 已提交
166 167 168 169 170 171
        var nowtime= new Date();
        var timezone = 0-nowtime.getTimezoneOffset()/60;
        var expd = new Date();
        expd.setTime(expd.getTime()+(2*60*60*1000));
        var expires = "expires="+expd.toGMTString();
        document.cookie="timezone="+timezone+"; path=/; "+expires;
Q
qkqpttgf 已提交
172 173 174 175 176 177 178 179 180 181 182
        function notnull(t)
        {
            if (t.admin.value==\'\') {
                alert(\''.getconstStr('SetAdminPassword').'\');
                return false;
            }
            return true;
        }
        function checkrewrite()
        {
            url=location.protocol + "//" + location.host;
Q
qkqpttgf 已提交
183
            //if (location.port!="") url += ":" + location.port;
Q
qkqpttgf 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
            url += location.pathname;
            if (url.substr(-1)!="/") url += "/";
            url += "config.php";
            //alert(url);
            var xhr4 = new XMLHttpRequest();
            xhr4.open("GET", url);
            xhr4.setRequestHeader("x-requested-with","XMLHttpRequest");
            xhr4.send(null);
            xhr4.onload = function(e){
                console.log(xhr4.responseText+","+xhr4.status);
                if (xhr4.status==201) {
                    document.getElementById("checkrewritebtn").style.display = "none";
                    document.getElementById("submitbtn").disabled = false;
                    document.getElementById("formdiv").style.display = "";
                } else {
199
                    alert("Url: " + url + "\nExpect http code 201, but received " + xhr4.status);
Q
qkqpttgf 已提交
200 201
                }
            }
Q
qkqpttgf 已提交
202
        }
Q
qkqpttgf 已提交
203 204 205 206 207
    </script>';
        $title = getconstStr('SetAdminPassword');
        return message($html, $title, 201);
    }
    if ($_GET['install0']) {
Q
qkqpttgf 已提交
208
        $html .= '
Q
qkqpttgf 已提交
209
    <form action="?install1" method="post">
Q
qkqpttgf 已提交
210 211 212 213 214
language:<br>';
        foreach ($constStr['languages'] as $key1 => $value1) {
            $html .= '
        <label><input type="radio" name="language" value="'.$key1.'" '.($key1==$constStr['language']?'checked':'').' onclick="changelanguage(\''.$key1.'\')">'.$value1.'</label><br>';
        }
Q
qkqpttgf 已提交
215
        $html .= '
Q
qkqpttgf 已提交
216 217 218 219 220
        <input type="submit" value="'.getconstStr('Submit').'">
    </form>
    <script>
        function changelanguage(str)
        {
Q
qkqpttgf 已提交
221 222 223 224
            var expd = new Date();
            expd.setTime(expd.getTime()+(2*60*60*1000));
            var expires = "expires="+expd.toGMTString();
            document.cookie=\'language=\'+str+\'; path=/; \'+expires;
Q
qkqpttgf 已提交
225 226 227 228 229 230
            location.href = location.href;
        }
    </script>';
        $title = getconstStr('SelectLanguage');
        return message($html, $title, 201);
    }
Q
qkqpttgf 已提交
231
    $html .= '<a href="?install0">'.getconstStr('ClickInstall').'</a>, '.getconstStr('LogintoBind');
Q
qkqpttgf 已提交
232 233 234 235 236 237 238
    $title = 'Error';
    return message($html, $title, 201);
}

function ConfigWriteable()
{
    $t = md5( md5(time()).rand(1000,9999) );
239
    $r = setConfig([ 'tmp' => $t ]);
Q
qkqpttgf 已提交
240 241 242
    $tmp = getConfig('tmp');
    setConfig([ 'tmp' => '' ]);
    if ($tmp == $t) return true;
243
    if ($r) return true;
Q
qkqpttgf 已提交
244 245 246 247 248 249
    return false;
}

function RewriteEngineOn()
{
    $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
Q
qkqpttgf 已提交
250
    $tmpurl = $http_type . $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'];
251
    $tmpurl .= path_format($_SERVER['base_path'] . '/config.php');
Q
qkqpttgf 已提交
252
    $tmp = curl_request($tmpurl);
253
    if ($tmp['stat']==200) return false;
Q
qkqpttgf 已提交
254 255 256 257
    if ($tmp['stat']==201) return true; //when install return 201, after installed return 404 or 200;
    return false;
}

258
function api_error($response)
Q
qkqpttgf 已提交
259
{
Q
qkqpttgf 已提交
260
    return isset($response['message']);
261 262 263 264
}

function api_error_msg($response)
{
Q
qkqpttgf 已提交
265 266
    return $response['code'] . '<br>
' . $response['message'] . '<br>
Q
qkqpttgf 已提交
267
<button onclick="location.href = location.href;">'.getconstStr('Refresh').'</button>';
268 269
}

Q
qkqpttgf 已提交
270
function setConfigResponse($response)
271
{
Q
qkqpttgf 已提交
272
    return json_decode($response, true);
273 274
}

Q
qkqpttgf 已提交
275
function OnekeyUpate($auth = 'qkqpttgf', $project = 'OneManager-php', $branch = 'master')
276
{
Q
qkqpttgf 已提交
277 278
    $slash = '/';
    if (strpos(__DIR__, ':')) $slash = '\\';
Q
qkqpttgf 已提交
279
    // __DIR__ is xxx/platform
Q
qkqpttgf 已提交
280
    $projectPath = splitlast(__DIR__, $slash)[0];
Q
qkqpttgf 已提交
281 282

    // 从github下载对应tar.gz,并解压
Q
qkqpttgf 已提交
283
    $url = 'https://github.com/' . $auth . '/' . $project . '/tarball/' . urlencode($branch) . '/';
Q
qkqpttgf 已提交
284
    $tarfile = $projectPath . $slash .'github.tar.gz';
Q
qkqpttgf 已提交
285 286 287 288 289 290 291 292
    $githubfile = file_get_contents($url);
    if (!$githubfile) return 0;
    file_put_contents($tarfile, $githubfile);
    if (splitfirst(PHP_VERSION, '.')[0] == '7') {
        $phar = new PharData($tarfile); // need php7
        $phar->extractTo($projectPath, null, true);//路径 要解压的文件 是否覆盖
    } else {
        ob_start();
Q
qkqpttgf 已提交
293
        passthru('tar -xzvf ' . $tarfile, $stat);
Q
qkqpttgf 已提交
294 295 296 297 298 299
        ob_get_clean();
    }
    unlink($tarfile);

    $outPath = '';
    $tmp = scandir($projectPath);
Q
qkqpttgf 已提交
300
    $name = $auth . '-' . $project;
Q
qkqpttgf 已提交
301 302
    foreach ($tmp as $f) {
        if ( substr($f, 0, strlen($name)) == $name) {
Q
qkqpttgf 已提交
303
            $outPath = $projectPath . $slash . $f;
Q
qkqpttgf 已提交
304 305 306 307 308 309 310
            break;
        }
    }
    //error_log($outPath);
    if ($outPath=='') return 0;

    //unlink($outPath.'/config.php');
Q
qkqpttgf 已提交
311 312 313 314 315 316 317
    $response = rename($projectPath . $slash . 'config.php', $outPath . $slash . 'config.php');
    if (!$response) {
        $tmp1['code'] = "Move Failed";
        $tmp1['message'] = "Can not move " . $projectPath . $slash . 'config.php' . " to " . $outPath . $slash . 'config.php';
        return json_encode($tmp1);
    }
    return moveFolder($outPath, $projectPath, $slash);
Q
qkqpttgf 已提交
318 319
}

Q
qkqpttgf 已提交
320
function moveFolder($from, $to, $slash)
Q
qkqpttgf 已提交
321
{
Q
qkqpttgf 已提交
322 323
    if (substr($from, -1)==$slash) $from = substr($from, 0, -1);
    if (substr($to, -1)==$slash) $to = substr($to, 0, -1);
Q
qkqpttgf 已提交
324 325 326 327
    if (!file_exists($to)) mkdir($to, 0777);
    $handler=opendir($from);
    while($filename=readdir($handler)) {
        if($filename != '.' && $filename != '..'){
Q
qkqpttgf 已提交
328 329
            $fromfile = $from . $slash . $filename;
            $tofile = $to . $slash . $filename;
Q
qkqpttgf 已提交
330
            if(is_dir($fromfile)){// 如果读取的某个对象是文件夹,则递归
Q
qkqpttgf 已提交
331
                $response = moveFolder($fromfile, $tofile, $slash);
Q
qkqpttgf 已提交
332
                if (api_error(setConfigResponse($response))) return $response;
Q
qkqpttgf 已提交
333 334
            }else{
                //if (file_exists($tofile)) unlink($tofile);
Q
qkqpttgf 已提交
335 336 337 338 339 340
                $response = rename($fromfile, $tofile);
                if (!$response) {
                    $tmp['code'] = "Move Failed";
                    $tmp['message'] = "Can not move " . $fromfile . " to " . $tofile;
                    return json_encode($tmp);
                }
Q
qkqpttgf 已提交
341 342 343 344 345 346
                if (file_exists($fromfile)) unlink($fromfile);
            }
        }
    }
    closedir($handler);
    rmdir($from);
Q
qkqpttgf 已提交
347
    return json_encode( [ 'response' => 'success' ] );
Q
qkqpttgf 已提交
348
}