このリポジトリは2023-09-09にアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュ、イシューの作成、プルリクエストはできません。
hozonsite.php/www/index.php

194 行
8.1 KiB
PHP

<?php
include('../src/langchange.php');
include('../lang/'.$lang.'.php');
include('../config.php');
$err = '';
$exists = [];
$url = '';
function geturl (): string {
$p = str_replace('https://', '', $_POST['hozonsite']);
$p = str_replace('http://', '', $p);
$ex = explode('/', parse_url($_POST['hozonsite'])['path']);
$ex = $ex[array_key_last($ex)];
if (null !== parse_url($_POST['hozonsite'])['query']) $ex .= '@'.parse_url($_POST['hozonsite'])['query'];
if ($ex == '') $ex = 'index.html';
$basename = isset(parse_url($_POST['hozonsite'])['path']) ? $ex : 'index.html';
unset($ex);
$ex = explode('/', $p);
$ex[array_key_last($ex)] = str_replace('?', '@', $ex[array_key_last($ex)]);
$ex[array_key_last($ex)] = parse_url($ex[array_key_last($ex)])['path'];
if ($ex[array_key_last($ex)] == $basename) {
unset($ex[array_key_last($ex)]);
$p = implode('/', $ex);
}
unset($ex);
$basename .= (!str_ends_with($basename, '.html') && !str_ends_with($basename, '.htm') && !str_ends_with($basename, '.xhtml') ? '.html' : '');
return $p.'/'.$basename;
}
function archiving (string $url): array {
system("cd ".$url." && wget -N -p -x -E -r -l 1 --user-agent=\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36\" --no-remove-listing --no-check-certificate --restrict-file-names=windows --max-redirect=3 --default-page=index.html --reject js,json,mp4,mov,mkv,mp3,ogg,ogv ".$_POST['hozonsite']);
if (count(array_diff(scandir($url), array('..', '.'))) == 0) {
return ['code' => 0, 'err' => LOC_ERROR_HOZON_NI_SIPPAI];
}
return ['code' => 1, 'url' => $url.'/'.geturl()];
}
function striptags (string $text): string {
$text = preg_replace('/\<script[\s\S]+?\<\/script\>/', '', $text);
$text = preg_replace('/\<noscript[\s\S]+?\<\/noscript\>/', '', $text);
$text = preg_replace('/\.css\?/', '.css@', $text);
//$text = preg_replace('/'.parse_url($_POST['hozonsite'])['scheme'].'\:\/\/(.*)'.parse_url($_POST['hozonsite'])['host'].'/', '', $text);
$text = preg_replace('/visibility: hidden/', '', $text);
$text = preg_replace('/\<div class\=\"blocker-error\"\>[\s\S]+?\<\/div\>/', '', $text);
$text = preg_replace('/\<div class\=\"blocker\"\>[\s\S]+?\<\/div\>/', '', $text);
$text = preg_replace('/(https\:\/\/)(.*)\//', '/', $text);
$allowed = [
'!doctype',
'a', 'abbr', 'acronym', 'address', 'applet', 'area', 'article', 'aside', /*'audio',*/
'b', 'base', 'basefont', 'bb', 'bdo', 'big', 'blockquote', 'body', 'br', 'button',
'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command',
'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt',
'em', 'embed', 'eventsource',
'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'frame', 'frameset',
'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', /*'html',*/
'i', /*'iframe',*/ 'img', 'input', 'ins', 'isindex', 'kbd', 'keygen',
'label', 'legend', 'li', 'link',
'map', 'mark', 'menu', 'meta', 'meter',
'nav', 'noframes', 'noscript',
'object', 'ol', 'optgroup', 'option', 'output',
'p', 'param', 'pre', 'progress',
'q',
'rp', 'rt', 'ruby',
's', 'samp', /*'script',*/ 'section', 'select', 'small', 'source', 'span', 'strike', 'strong', 'style', 'sub', 'sup',
'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'tt',
'u', 'ul',
'var', /*'video',*/
'wbr'
];
return strip_tags($text, $allowed);
}
function sanitize_archive ($path) {
$file = file_get_contents(urldecode($path)); // ファイルの開く
$file = striptags($file); // 危険なタグの削除
// ヘッダーの追加
$file = "<!DOCTYPE html><html><head><meta charset=\"utf-8\" /></head><body><div style=\"background-color: #320202 !important; display: block !important; border: 4px #ff3b3b groove !important; color: #ea8181 !important; padding: 10px !important; z-index: 999999 !important; position: fixed !important; left: 0 !important; top: 0 !important; font-size: 14px !important; font-family: unset !important; width: 100% !important;\">".SITE_NAME_JA."でアーカイブしました。Archived with ".SITE_NAME_EN.".<br /><a style=\"color: #ffeb3b !important;\" href=\"/\">トップページへ To toppage</a></div><div style=\"padding-top: 74px !important;\">".$file.'</div></body></html>';
// 保存
file_put_contents(urldecode($path), $file);
}
if (count($_POST) > 0) {
// HTTPかHTTPSじゃない場合
if (!str_starts_with($_POST['hozonsite'], 'https://') && !str_starts_with($_POST['hozonsite'], 'http://')) {
$err = LOC_ERROR_URL_HTTP_HTTPS;
}
else {
$url = geturl();
$fullurl = 'archive/'.time();
$exists = glob('archive/*/'.$url);
if ($exists) {
$tmp = [];
foreach ($exists as $k => $v) {
$tmp[$k] = explode('/', $v)[1];
}
$exists = $tmp;
unset($tmp);
}
if (count($exists) == 0 || (count($exists) > 0 && isset($_POST['agree']))) {
if (!mkdir('./'.$fullurl, 0755, true)) die(LOC_ERROR_KYOKA); // ダイレクトリーを作成出来なければ、死ね
$url = archiving('./'.$fullurl); // ウエブページのダウンロード
if ($url['code'] == 0) {
$err = $url['err'];
}
else {
$url = $url['url'];
sanitize_archive($url); // 危険なタグの削除
header('Location: '.$url); // 移転
die();
}
}
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
<meta name="title" content="<?= $lang == 'en' ? SITE_NAME_EN : SITE_NAME_JA ?>" />
<meta name="description" content="<?= $lang == 'en' ? SITE_DESC_EN : SITE_DESC_JA?>" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title><?= $lang == 'en' ? SITE_NAME_EN : SITE_NAME_JA ?></title>
<link rel="stylesheet" type="text/css" href="/style.css" />
</head>
<body>
<?php if ($err != '') { ?><div class="error"><?= $err; ?></div> <?php } ?>
<h1><img class="headerimg" src="/logo.jpg" alt="<?= LOC_LOGO; ?>" /></h1>
<div class="body">
<p>
<a href="/"><?= LOC_TOP; ?></a> |
<?= LOC_BETA_BAN1; ?><a href="https://gitler.moe/TechnicalSuwako/hozon.site/issues"><?= LOC_BETA_BAN2; ?></a>
</p>
<form method="post" action="/">
<div class="switchlang">
<input class="langchange" type="submit" name="langchange" value="<?= $lang == 'en' ? '日本語に更新' : 'Change to English'; ?>" />
</div>
</form>
<hr />
<div class="central">
<?php
if (count($_POST) > 0 && count($exists) > 0) {
?>
<h3><?= $url; ?></h3>
<?= LOC_SUDENI_HOZONSARETA_PAGE; ?><br />
<?php
foreach ($exists as $e) {
echo '<a href="/archive/'.$e.'/'.$url.'">'.date('Y年m月d日 H:i:s', $e).'</a>';
echo "<br />";
}
?>
<p><?= LOC_HONTONI_TETUDUKI; ?></p>
<form action="/" method="post">
<input type="hidden" name="hozonsite" value="<?= $_POST['hozonsite']; ?>" />
<input type="hidden" name="agree" value="1" />
<div class="submit">
<input type="submit" name="submit" value="<?= LOC_HAI_HOZONSITEKUDASAI; ?>" />
</div>
</form>
<?php
}
else {
?>
<?= LOC_DONO_PAGE_HOZON; ?>
<form action="/" method="post">
<input type="text" name="hozonsite" value="" />
<div class="submit">
<input type="submit" name="submit" value="<?= LOC_HOZON; ?>" />
</div>
</form>
<?php
}
?>
</div>
</div>
<div class="footer">
<a href="https://gitler.moe/TechnicalSuwako/hozon.site"><img src="/git.png" alt="<?= LOC_SOURCE_CODE; ?>" /></a> | <a href="https://076.moe"><?= LOC_076_AIB; ?></a>
</div>
</body>
</html>