NiconicoPHP');
define('COPYRIGHT_IMG_S', '');
define('COPYRIGHT_IMG_B', '');
$_login = init();
$_cfg['login'] = $_login;
// 管理パスワードの生成
if (!file_exists(ADMIN_PASS_FILE)) {
@umask(0000);
mkAdminPass();
exit;
}
// メイン処理
if (cfg('g_selSkin') && @$_GET['q_skinsel']) {
selSkin(); // スキン選択を表示(for Debug or Admin)
} elseif (isset($_GET['q_thumb'])) {
thumbMain(); // サムネイル生成
} elseif ($_login) {
adminMain(); // 管理モード
} else {
userMain(); // ユーザーブラウズ
}
exit;
// 初期設定
function init()
{
global $_cfg;
$skinQ = false;
// HTMLテンプレートライブラリ読み込み
if (!@include_once(HTMLTEMP_INC_PHP)) {
errExit(HTMLTEMP_INC_PHP.' 読み込み失敗');
}
// このサーバでGDライブラリを利用できるかチェック
if (!extension_loaded('gd')) {
if (file_exists(THUMB_WARNING_TXT)) {
$msg = @join('', @file(THUMB_WARNING_TXT));
errExit($msg);
}
$_cfg['GDenable'] = false;
} else {
$_cfg['GDenable'] = true;
}
if (!CAPTCHA_ENABLE) {
$_cfg['GDenable'] = false;
}
// 認証が必要な場合は認証画面を表示
$login = AUTH_login();
if ($login) {
$_cfg['g_selSkin'] = true;
}
// datディレクトリの存在と書き込みをチェック
$path = DAT_DIR.'/'.'good.txt';
if (!newFile($path, "a")) {
errExit_dirErr(DAT_DIR);
}
@unlink($path);
// スクリプト初期設定を読み込み
if (!($buf = CFG_parse(CONFIG_INI_DAT, true))) {
errExit_iniErr(CONFIG_INI_DAT);
} else {
$_cfg = array_merge($_cfg, $buf);
}
$buf = array();
// サムネイル保存ディレクトリの存在と書き込みをチェック
if ($_cfg['cThumbCacheMethod']) {
$path = DAT_DIR.'/'.$_cfg['cThumbCacheDir'].'/'.'good.txt';
if (!newFile($path, "a")) {
errExit_dirErr(DAT_DIR.'/'.cfg('cThumbCacheDir'));
}
@unlink($path);
}
// 管理モードの場合はスキン変更
if ($login) {
$_cfg['cUserSkinDir'] = SKIN_DIR.'/'.$_cfg['cSkinDir'];
$_cfg['cSkinDir'] = ADM_SKIN_DIR;
if (@$_GET['q_skin'] && validPath('dpath',
$_GET['q_skin'], SKIN_DIR)) {
$_cfg['cSkinDir'] = $_GET['q_skin'];
$skinQ = rawurlencode($_GET['q_skin']);
}
} else {
if (@$_GET['q_skin'] && cfg('g_selSkin') &&
validPath('dpath', $_GET['q_skin'], SKIN_DIR)) {
$_cfg['cSkinDir'] = $_GET['q_skin'];
$skinQ = rawurlencode($_GET['q_skin']);
} else {
$_cfg['cSkinDir'] = SKIN_DIR.'/'.$_cfg['cSkinDir'];
}
}
// スキン初期設定を読み込み
$path = $_cfg['cSkinDir'].'/'.SKIN_INI_DAT;
if (!($buf = CFG_parse($path, true))) {
errExit_skinErr($path);
} else {
$_cfg = array_merge($_cfg, $buf);
}
$buf = array();
if ($login) {
// ユーザースキン初期設定を読み込み
$path = $_cfg['cUserSkinDir'].'/'.SKIN_INI_DAT;
if (!($buf = CFG_parse($path, true))) {
errExit_skinErr($path);
}
// 以下の設定値は、ユーザースキンの設定値を上書き
$_cfg['sReturnUrl'] = $buf['sReturnUrl'];
$_cfg['sThumbSizeMethod'] = $buf['sThumbSizeMethod'];
$_cfg['sThumbSizeW'] = $buf['sThumbSizeW'];
$_cfg['sThumbSizeH'] = $buf['sThumbSizeH'];
// sThumbWrap
$_cfg['sMenuOrderRev'] = $buf['sMenuOrderRev'];
$_cfg['sThumbOrderRev'] = $buf['sThumbOrderRev'];
// sMenuIndentChars
// sImgSizeMaxW
// sImgSizeMaxH
// sDispFileCount
$_cfg['sThumbColorOpt'] = $buf['sThumbColorOpt'];
$_cfg['sThumbColorPct'] = $buf['sThumbColorPct'];
$_cfg['sThumbSepiaPct'] = $buf['sThumbSepiaPct'];
$_cfg['sThumbSepiaRGB'] = $buf['sThumbSepiaRGB'];
// sThumbTitleLenMax
$_cfg['sImgFileDateFormat'] = $buf['sImgFileDateFormat'];
$_cfg['sNewMarkSuffix'] = $buf['sNewMarkSuffix'];
// sSkinAuthorMsgFile
$buf = array();
}
// クエリの設定
if ($login) {
$_cfg['defQ'] = AUTH_sid().'q_auth=login&';
} elseif (isset($_GET['q_frame'])) {
$_cfg['defQ'] = '?q_frame=yes&';
} else {
$_cfg['defQ'] = '?';
}
if (cfg('g_selSkin') && $skinQ) {
$_cfg['defQ'] .= 'q_skin='.$skinQ.'&';
}
return $login;
}
// サムネイル生成のメイン処理
function thumbMain()
{
if (!validPath('fpath', $_GET['q_thumb'], cfg('cImgDir'))) {
GD_dispImgFile(THUMB_ERR_IMG);
return;
}
if (false !== ($tpath = existsThumb($_GET['q_thumb']))) {
// q_thumbで直接で呼び出された場合の対処
GD_dispImgFile($tpath);
} else {
$tpath = trimDotSlaAny($_GET['q_thumb']);
$tpath = str_replace('/', '_', $tpath);
$tpath = DAT_DIR.'/'.cfg('cThumbCacheDir').'/'.$tpath;
GD_makeThumb($_GET['q_thumb'], $tpath);
}
}
// 管理モードのメイン処理
function adminMain()
{
$arg = array();
// 画像情報を変更した場合
if (isset($_POST['p_imgChange'])) {
if (get_magic_quotes_gpc()) {
$imgTitle = stripslashes($_POST['p_imgTitle']);
$imgDate = stripslashes($_POST['p_imgDate']);
$imgComment = stripslashes($_POST['p_imgComment']);
} else {
$imgTitle = $_POST['p_imgTitle'];
$imgDate = $_POST['p_imgDate'];
$imgComment = $_POST['p_imgComment'];
}
$imgComment = str_replace("\r\n", "\n", $imgComment);
$imgComment = str_replace("\r", "\n", $imgComment);
$imgComment = str_replace("\n", "
", $imgComment);
$logrec['flag'] = 'OK';
$logrec['dpath'] = dirname($_POST['p_imgChange']);
$logrec['fname'] = basename($_POST['p_imgChange']);
$logrec['title'] = trim($imgTitle);
$logrec['ftime'] = trim($imgDate);
$logrec['comment'] = $imgComment;
$logrec['time'] = time();
writeLog($logrec);
}
// フォルダ情報を変更した場合
if (isset($_POST['p_dirChange'])) {
if (get_magic_quotes_gpc()) {
$folderTitle = stripslashes($_POST['p_dirTitle']);
$folderComment = stripslashes($_POST['p_dirComment']);
} else {
$folderTitle = $_POST['p_dirTitle'];
$folderComment = $_POST['p_dirComment'];
}
$folderComment = str_replace("\r\n", "\n", $folderComment);
$folderComment = str_replace("\r", "\n", $folderComment);
$folderComment = str_replace("\n", "
", $folderComment);
$logrec['flag'] = 'OK';
$logrec['dpath'] = $_POST['p_dirChange'];
$logrec['fname'] = '';
$logrec['title'] = trim($folderTitle);
$logrec['ftime'] = '';
$logrec['comment'] = $folderComment;
$logrec['time'] = time();
writeLog($logrec);
}
// 管理コマンド判定
$cmd = @$_GET['q_cmd'];
switch ($cmd) {
// サムネイルの更新
case 'tupdate':
// サムネイルの再生成
case 'tcreate':
$create = ('tcreate' == $cmd) ? true : false;
$path = cfg('cSkinDir').'/'.ADM_SKIN_THUMB_HTML;
$arg = makeArgCom($arg);
$arg = makeArgAdm($arg);
if ('tupdate' == $cmd) {
$arg['HT_AdmTFuncName'] = 'サムネイルの更新';
} else {
$arg['HT_AdmTFuncName'] = 'サムネイルの再生成';
}
$arg['HT_AdmTFuncImgs'] = updateThumbs($create);
$ht = new HtmlTemplate;
$ht->t_include($path, $arg);
break;
// サムネイルの削除
case 'tclean';
cleanThumb(false, DAT_DIR.'/'.cfg('cThumbCacheDir'));
echo '';
break;
// 初期設定の書き込み
case 'cfgreg':
CFG_regist();
$name = isset($_POST['p_jumpName']) ?
$_POST['p_jumpName'] : '';
echo '';
break;
// 初期設定の表示
case 'cfgdsp':
$path = cfg('cSkinDir').'/'.ADM_SKIN_CONFIG_HTML;
$arg = CFG_makeArg($arg);
$arg = makeArgCom($arg);
$arg = makeArgAdm($arg);
$ht = new HtmlTemplate;
$ht->t_include($path, $arg);
break;
// ヘルプの表示
case 'help':
$path = cfg('cSkinDir').'/'.ADM_SKIN_HELP_HTML;
$arg = makeArgCom($arg);
$arg = makeArgAdm($arg);
$ht = new HtmlTemplate;
$ht->t_include($path, $arg);
break;
// スキン一覧表示
case 'skinsel':
selSkin();
break;
// 通常(管理モードでのブラウズ)
default:
list($qDir, $qFile) = getPathFromQ();
$path = getHtempPath($qDir, $qFile);
if (false === $qDir && false !== $qFile) {
$qDir = dirname($qFile);
}
$arg = makeArgBody($arg, $qDir, $qFile);
$arg = makeArgCom($arg);
$arg = makeArgAdm($arg);
$ht = new HtmlTemplate;
$ht->t_include($path, $arg);
break;
}
}
// ユーザーブラウズのメイン処理
function userMain()
{
$arg = array();
$type = cfg('sSkinType');
// フレームモードの最初の呼び出しの場合
if (6 == $type && !isset($_GET['q_frame'])) {
$arg = makeArgCom($arg);
$arg['HT_FrameMenuUrl'] = cfg('scriptFileUrl').'?q_frame=yes';
$path = cfg('cSkinDir').'/'.cfg('s6_Index');
$ht = new HtmlTemplate;
$ht->t_include($path, $arg);
}
// フレームモードの最初の呼び出しの場合
else if (7 == $type && !isset($_GET['q_frame'])) {
$path = cfg('cSkinDir').'/'.cfg('s7_Index');
echo '';
}
// 通常
else {
list($qDir, $qFile) = getPathFromQ();
$path = getHtempPath($qDir, $qFile);
if (false === $qDir && false !== $qFile) {
$qDir = dirname($qFile);
}
$arg = makeArgBody($arg, $qDir, $qFile);
$arg = makeArgCom($arg);
$ht = new HtmlTemplate;
$ht->t_include($path, $arg);
}
}
// 初期設定の取得
function cfg($val)
{
global $_cfg;
return $_cfg[$val];
}
// スクリプトのURL取得
function getUrl()
{
// スキーム (ex. 'http://')
if (isset($_SERVER['HTTPS'])) {
$url = ($_SERVER['HTTPS'] == 'on') ?
'https://' : 'http://';
} elseif (isset($_SERVER['SERVER_PORT'])) {
$url = ($_SERVER['SERVER_PORT'] == '443') ?
'https://' : 'http://';
} else {
$url = 'http://';
}
// ホスト (ex. 'http://www.host.com')
if (@$_SERVER['HTTP_HOST']) {
$url .= $_SERVER['HTTP_HOST'];
} elseif (@$_ENV['HTTP_HOST']) {
$url .= $_ENV['HTTP_HOST'];
} elseif (@$_SERVER['SERVER_NAME']) {
$url .= $_SERVER['SERVER_NAME'];
} elseif (@$_ENV['SERVER_NAME']) {
$url .= $_ENV['SERVER_NAME'];
} else {
errExit('ホスト名の取得失敗');
}
// ポート (ex. 'http://www.host.com:80')
if (!strstr($url, ':') && @$_SERVER['SERVER_PORT']) {
if (80 != $_SERVER['SERVER_PORT'] &&
443 != $_SERVER['SERVER_PORT']) {
$url .= (':'.$_SERVER['SERVER_PORT']);
}
}
// パス (ex. '/scripts/file.php')
$path = '';
if (@$_SERVER['PHP_SELF']) {
$path = $_SERVER['PHP_SELF'];
} elseif (@$_SERVER['SCRIPT_NAME']) {
$path = $_SERVER['SCRIPT_NAME'];
} elseif (@$_SERVER['URL']) {
$path = $_SERVER['URL'];
} elseif (@$_SERVER['REQUEST_URI']) {
$parse = parse_url($url.$_SERVER['REQUEST_URI']);
if (isset($parse['path'])) {
$path = $parse['path'];
}
}
if ('/' != $path[0]) {
errExit('パス名の取得失敗');
}
// URL (ex. 'http://www.host.com:80/scripts/file.php')
$result['fpath'] = $url.$path;
$result['dpath'] = $url.dirname($path);
$result['cpath'] = dirname($path).'/';
return $result;
}
// クエリを取得
function getPathFromQ()
{
$qDir = false;
$qFile = false;
// 相対番号
if (isset($_GET['q_num'])) {
codecQ('set', true);
$foundPeriod = validQ('number', $_GET['q_num']);
if ($foundPeriod) {
$qFile = codecQ('n2f', $_GET['q_num']);
} else {
$qDir = codecQ('n2d', $_GET['q_num']);
}
}
// 相対パス
else {
if (isset($_GET['q_dir']) &&
validQ('dpath', $_GET['q_dir'])) {
codecQ('set', false);
$qDir = $_GET['q_dir'];
}
if (isset($_GET['q_file']) &&
validQ('fpath', $_GET['q_file'])) {
codecQ('set', false);
$qFile = $_GET['q_file'];
}
}
if (cfg('cQueryIsPath')) {
codecQ('set', false);
} else {
codecQ('set', true);
}
return array($qDir, $qFile);
}
// HTMLテンプレートファイルのパス取得
function getHtempPath($qDir, $qFile)
{
if (false !== $qDir && false !== $qFile) {
errExit('getHtempPath パラメータ不正');
}
$type = cfg('sSkinType');
if (0 > $type || 7 < $type) {
errExit('getHtempPath パラメータ不正');
}
// ディレクトリ指定
if (false !== $qDir && false === $qFile) {
switch ($type) {
case 0: $path = cfg('s0_Menu_Thumb_Img'); break;
case 1: errExit('getHtempPath パラメータ不正'); break;
case 2: $path = cfg('s2_Thumb_Img'); break;
case 3: $path = cfg('s3_Menu_Thumb'); break;
case 4: errExit('getHtempPath パラメータ不正'); break;
case 5: $path = cfg('s5_Thumb'); break;
case 6: $path = cfg('s6_Thumb'); break;
case 7: $path = cfg('s7_Thumb'); break;
}
}
// ファイル指定
elseif (false === $qDir && false !== $qFile) {
switch ($type) {
case 0: $path = cfg('s0_Menu_Thumb_Img'); break;
case 1: $path = cfg('s1_ThumbInMenu_Img'); break;
case 2: $path = cfg('s2_Thumb_Img'); break;
case 3: $path = cfg('s3_Img'); break;
case 4: $path = cfg('s4_Img'); break;
case 5: $path = cfg('s5_Img'); break;
case 6: $path = cfg('s6_Img'); break;
case 7: $path = cfg('s7_Img'); break;
}
}
// 通常(クエリで指定なし)の場合
else {
switch ($type) {
case 0: $path = cfg('s0_Menu_Thumb_Img'); break;
case 1: $path = cfg('s1_ThumbInMenu_Img'); break;
case 2: $path = cfg('s2_Menu'); break;
case 3: $path = cfg('s3_Menu_Thumb'); break;
case 4: $path = cfg('s4_ThumbInMenu'); break;
case 5: $path = cfg('s5_Menu'); break;
case 6: $path = cfg('s6_Menu'); break;
case 7: $path = cfg('s7_Menu'); break;
}
}
return cfg('cSkinDir').'/'.$path;
}
// HTMLテンプレートargデータ作成(共通データ)
function makeArgCom($arg)
{
$arg['HT_BaseUrl'] = '
", "\n", $logrec['comment']);
$arg['HT_ImgComment'] = $logrec['comment'];
}
return $arg;
}
// HTMLテンプレートargデータ作成(サムネイル一覧データ)
function makeArgThumb($dpath)
{
if (false === ($logrec = readLog($dpath, ''))) {
$arg['HT_FolderTitle'] = basename($dpath);
$arg['HT_AdmFolderTitle'] = '';
} else {
$arg['HT_FolderTitle'] =
chkLogStr(0, $logrec['title'], basename($dpath));
$arg['HT_AdmFolderTitle'] =
chkLogStr(0, $logrec['title'], '');
}
$arg['HT_FolderCommentTextarea'] =
str_replace("
", "\n", $logrec['comment']);
$arg['HT_FolderComment'] = $logrec['comment'];
$arg['HT_FolderPath'] = $dpath;
// ディレクトリ直下のファイルリスト取得
$files = getFiles($dpath);
if (empty($files)) {
$arg['HT_ThumbRow'][]['Col'][]['dummy'] = 1;
$arg['HT_ThumbRowSkip'] = 1;
return $arg;
}
// 逆ソートが必要な場合
/*
if (cfg('sThumbOrderRev')) {
$files = array_reverse($files);
}
*/
/*sortsort*/
if (cfg('sThumbOrderRev')) {
@rsort($files);
} else {
@sort($files);
}
// サムネイル列挙ループ
$cnt = count($files);
$thumbWrap = cfg('sThumbWrap');
for ($i = 0; $i < $cnt;) {
if ('' == $thumbWrap || !is_numeric($thumbWrap)) {
$thumbWrap = 0;
}
$col = false;
$wrap = $i + $thumbWrap;
for (; (!$wrap || $i < $wrap) && $i < $cnt; $i++) {
// サムネイル生成
$thumbSize = '';
if (cfg('cThumbCacheMethod')) {
if (false === ($thumb = existsThumb($files[$i]))) {
$thumb = cfg('scriptFileName').cfg('defQ').
'q_thumb='.rawurlencode($files[$i]);
}
} else {
$thumb = false;
if (cfg('cMyThumbPrefix')) {
// 自作サムネイルがある場合はそちらを表示
$thumb = dirname($files[$i]).'/'.
cfg('cMyThumbPrefix').basename($files[$i]);
if (!file_exists($thumb)) {
$thumb = false;
} else {
$thumb = trimDotSla($thumb);
}
}
if (!$thumb) {
$thumb = trimDotSla($files[$i]);
switch (cfg('sThumbSizeMethod')) {
case 0:
$thumbSize = 'width="'.cfg('sThumbSizeW').
'" height="'.cfg('sThumbSizeH').'"';
break;
case 1:
$thumbSize = 'width="'.cfg('sThumbSizeW').'"';
break;
case 2:
$thumbSize = '" height="'.cfg('sThumbSizeW').'"';
break;
default:
$thumbSize = 'width="'.cfg('sThumbSizeW').
'" height="'.cfg('sThumbSizeW').'"';
break;
}
}
}
// newマーク付加対象か?
$itsNew = isItNew($files[$i]);
clearstatcache(); // for filemtime()
if (false === ($logrec = readLog($dpath, $files[$i]))) {
$col['Col'][] = array(
'ImgUrl' => cfg('scriptFileUrl').
cfg('defQ').codecQ('f2n', $files[$i]),
'ImgTitle' => strTrim(basename($files[$i]),
cfg('sThumbTitleLenMax')),
'ImgDate' => date(cfg('sImgFileDateFormat'),
filemtime($files[$i])),
'ImgComment' => '',
'NewMark' => $itsNew,
'ThumbSrc' => cfg('scriptDirUrl').'/'.$thumb,
'ThumbSize' => $thumbSize);
} else {
$title = chkLogStr(1, $logrec['title'],
strTrim(basename($files[$i]),
cfg('sThumbTitleLenMax')));
$ftime = chkLogStr(1, $logrec['ftime'],
date(cfg('sImgFileDateFormat'),
filemtime($files[$i])));
$col['Col'][] = array(
'ImgUrl' => cfg('scriptFileUrl').
cfg('defQ').codecQ('f2n', $files[$i]),
'ImgTitle' => $title,
'ImgDate' => $ftime,
'ImgComment' => $logrec['comment'],
'NewMark' => $itsNew,
'ThumbSrc' => cfg('scriptDirUrl').'/'.$thumb,
'ThumbSize' => $thumbSize);
}
}
$arg['HT_ThumbRow'][] = $col;
}
return $arg;
}
// HTMLテンプレートargデータ作成(フォルダメニューデータ)
function makeArgMenu($type, $dirent, $selDir, $menuHier, &$parentArg)
{
static $depth = 0;
// インデント文字列作成
$ws = str_repeat(cfg('sMenuIndentChars'), $depth);
$arg = false;
$depth++;
// 画像ディレクトリのルートの場合
if (isset($dirent[cfg('cImgDir')])) {
$dirent = $dirent[cfg('cImgDir')];
$foundFile = 0;
foreach ($dirent as $val) {
if (!is_array($val)) {
$foundFile++;
if (!cfg('sDispFileCount')) {
break;
}
}
}
foreach ($dirent as $val) {
if (is_array($val)) {
continue;
}
if (false === ($logrec = readLog(cfg('cImgDir'), ''))) {
$dtitle = basename(cfg('cImgDir'));
} else {
$dtitle = chkLogStr(0, $logrec['title'],
basename(cfg('cImgDir')));
}
if (1 == $type || 4 == $type) {
$thumbs = makeArgThumb(cfg('cImgDir'));
} else {
$thumbs = array();
}
$arg['HT_Menu'][] = array(
'FolderUrl' => cfg('scriptFileUrl').
cfg('defQ').codecQ('d2n', cfg('cImgDir')),
'FolderTitle' => $dtitle,
'FileCount' => cfg('sDispFileCount') ? $foundFile : '',
'Indent' => $ws,
((cfg('cImgDir') == $selDir) ? 'HereMark' : 'none') => 1,
'Thumbs' => $thumbs,
);
break;
}
}
foreach ($dirent as $idx => $val) {
if (!is_array($val)) {
continue;
}
if (false === ($logrec = readLog($idx, ''))) {
$dtitle = basename($idx);
} else {
$dtitle = chkLogStr(0, $logrec['title'], basename($idx));
}
$foundFile = 0;
foreach ($val as $i => $j) {
if (!is_array($j)) {
$foundFile++;
if (!cfg('sDispFileCount')) {
break;
}
}
}
if (1 == $type || 4 == $type) {
$thumbs = makeArgThumb($idx);
if (isset($thumbs['HT_ThumbRowSkip'])) {
continue;
}
} else {
$thumbs = array();
}
// 階層で列挙
if ($depth <= $menuHier) {
$hier = (1 == $depth) ? 'HT_Menu' : 'M'.$depth;
if ($foundFile || cfg('login')) {
$arg[$hier][] = array(
'FolderUrl' => cfg('scriptFileUrl').
cfg('defQ').codecQ('d2n', $idx),
'FolderTitle' => $dtitle,
'FileCount' =>
cfg('sDispFileCount') ? $foundFile : '',
'Indent' => $ws,
(($idx == $selDir) ? 'HereMark' : 'none') => 1,
'Thumbs' => $thumbs);
} else {
$arg[$hier][] = array(
'FolderTitle' => $dtitle,
'Indent' => $ws,
'Thumbs' => $thumbs);
}
if (!(1 == $type || 4 == $type)) {
$arg[$hier][] = makeArgMenu(
$type, $val, $selDir, $menuHier, $arg[$hier]);
}
}
// ベタで列挙
else {
if ($foundFile || cfg('login')) {
$parentArg[] = array(
'FolderUrl' => cfg('scriptFileUrl').
cfg('defQ').codecQ('d2n', $idx),
'FolderTitle' => $dtitle,
'FileCount' =>
cfg('sDispFileCount') ? $foundFile : '',
'Indent' => $ws,
(($idx == $selDir) ? 'HereMark' : 'none') => 1);
} else {
$parentArg[] = array(
'FolderTitle' => $dtitle,
'Indent' => $ws);
}
if (!(1 == $type || 4 == $type)) {
makeArgMenu($type, $val, $selDir, $menuHier, $parentArg);
}
}
}
$depth--;
return $arg;
}
// 指定パスはnewマーク付加対象か?
function isItNew($path)
{
$suffix = cfg('sNewMarkSuffix');
$parts = pathinfo($path);
$pos = strrpos($parts["basename"], '.');
$name = substr($parts["basename"], 0, $pos);
if ($pos = strpos($name, $suffix)) {
if (strlen($name) == ($pos + strlen($suffix))) {
return true;
}
}
return false;
}
// 文字列の切り詰め
function strTrim($str, $len)
{
$term = "..";
if (strlen($str) > $len && $len > 2) {
$str = substr($str, 0, $len - 2).$term;
}
return $str;
}
// ディレクトリエントリ取得
function getDirent()
{
static $first = true;
static $direntCache = array();
// 初回の呼び出しの場合は実処理
if ($first) {
$first = false;
$result = getDirent_r(cfg('cImgDir'));
if ($result) {
$direntCache[cfg('cImgDir')] = $result;
}
}
return $direntCache;
}
// ディレクトリエントリ取得(再帰)
function getDirent_r($bpath)
{
$entcnt = 0;
if (false === ($handle = @opendir($bpath))) {
errExit($bpath.' ディレクトリオープン失敗');
}
$dirent = false;
while (false !== ($ent = @readdir($handle))) {
if ('.' == $ent || '..' == $ent) {
continue;
}
$path = $bpath.'/'.$ent;
if (is_dir($path)) {
if (false !== ($de = getDirent_r($path))) {
// キー=ディレクトリパス、値=サブディレクトリ配列
$dirent[$path] = $de;
$entcnt++;
}
} else {
if (!eregi(IMG_EXT, $ent)) {
continue;
}
if (isMyThumb($bpath, $ent)) {
continue;
}
// キー=ファイル名、値=ファイルパス
$dirent[$ent] = $path;
$entcnt++;
}
}
@closedir($handle);
if (!$entcnt) {
$dirent = false;
}
/*
if (false != $dirent) {
if (cfg('sMenuOrderRev')) {
@uasort($dirent, 'strcmp');
}
}
*/
/*sortsort*/
if (false != $dirent) {
if (cfg('sMenuOrderRev')) {
@krsort($dirent);
} else {
@ksort($dirent);
}
}
return $dirent;
}
// ディレクトリエントリの表示(デバッグ時のみ使用)
function dmpDirent($dirent)
{
static $depth = 0;
if ($depth) {
$ws = str_repeat(cfg('sMenuIndentChars'), $depth);
} else {
$ws = '';
}
$depth++;
foreach ($dirent as $idx => $val) {
if (is_array($val)) {
$foundFile = false;
foreach ($val as $i => $j) {
if (!is_array($j)) {
$foundFile = true;
break;
}
}
if ($foundFile) {
echo $ws."+ ".$idx." (".$val.")
\n";
} else {
echo $ws."= ".$idx." (".$val.")
\n";
}
dmpDirent($val);
} else {
echo $ws."- ".$idx." (".$val.")
\n";
}
}
$depth--;
return true;
}
// 指定されたパスが自作サムネイルかチェック
function isMyThumb($dpath, $fpath)
{
if (!cfg('cMyThumbPrefix')) {
return false;
}
// prefixが先頭に無い場合
if ((int) 0 !== strpos($fpath, cfg('cMyThumbPrefix'))) {
return false;
}
// prefixだけの場合
$str = substr($fpath, strlen(cfg('cMyThumbPrefix')));
if (false === $str) {
return false;
}
// prefixを除去した名前と同名のファイルが、
// 同じ場所に存在しない場合
if (!is_file($dpath.'/'.$str)) {
return false;
}
return true;
}
// 直下のファイル取得
function getFiles($dpath)
{
static $dpathCache = false;
static $filesCache = false;
if ($filesCache && $dpathCache == $dpath) {
return $filesCache;
}
$dpathCache = $dpath;
$dirent = getDirent();
$filesCache = getFiles_r($dirent, $dpath);
return $filesCache;
}
// 直下のファイル取得(再帰)
function getFiles_r($dirent, $dpath)
{
$files = false;
foreach ($dirent as $idx => $val) {
if (!is_array($val)) {
continue;
}
if ($dpath != $idx) {
$files = getFiles_r($val, $dpath);
if (false !== $files) {
break;
}
continue;
}
foreach ($val as $fpath) {
if (is_array($fpath)) {
continue;
}
$files[] = $fpath;
}
break;
}
return $files;
}
// 全サムネイルのパス取得
function getThumbs($dirent, $thumbDir)
{
$files = array();
foreach ($dirent as $idx => $val) {
if (is_array($val)) {
$files = array_merge($files, getThumbs($val, $thumbDir));
} else {
$tpath = trimDotSlaAny($val).THUMB_EXT;
$tpath = str_replace('/', '_', $tpath);
$files[] = DAT_DIR.'/'.cfg('cThumbCacheDir').'/'.$tpath;
}
}
return $files;
}
// 不要サムネイルの削除
function cleanThumb($dirent, $thumbDir)
{
// 全削除の場合
if (false === $dirent) {
rmFiles(DAT_DIR.'/'.cfg('cThumbCacheDir'));
return;
}
$files = getThumbs($dirent, $thumbDir);
if (false === ($handle = @opendir($thumbDir))) {
errExit($thumbDir.' ディレクトリオープン失敗');
}
while (false !== ($ent = @readdir($handle))) {
if ('.' == $ent || '..' == $ent) {
continue;
}
$path = $thumbDir.'/'.$ent;
if (!is_dir($path) && (!is_array($files) ||
!is_int(array_search($path, $files)))) {
@unlink($path);
}
}
@closedir($handle);
}
// 画像表示サイズmaxを取得
function imgMaxSize($fpath)
{
$info = @getimagesize($fpath);
if (false === $info) {
return '';
}
$w = $info[0];
$h = $info[1];
$resize = '';
while ((cfg('sImgSizeMaxW') && cfg('sImgSizeMaxW') < $w) ||
(cfg('sImgSizeMaxH') && cfg('sImgSizeMaxH') < $h)) {
if (cfg('sImgSizeMaxW') && cfg('sImgSizeMaxW') < $w) {
$h = (int) ($h * cfg('sImgSizeMaxW') / $w);
$w = (int) cfg('sImgSizeMaxW');
}
elseif (cfg('sImgSizeMaxH') && cfg('sImgSizeMaxH') < $h) {
$w = (int) ($w * cfg('sImgSizeMaxH') / $h);
$h = (int) cfg('sImgSizeMaxH');
}
$resize = " width=\"{$w}\" height=\"{$h}\" ";
}
return $resize;
}
// ログ書き込み
function writeLog($wrec)
{
$logfile = DAT_DIR.'/'.cfg('cLogFile');
$wrec['dpath'] = trimDotSlaAny($wrec['dpath']);
if ($dataset = @file($logfile)) {
$cnt = count($dataset);
for ($i = 0; $i < $cnt; $i++) {
@list($logrec['flag'],
$logrec['dpath'],
$logrec['fname'],
$logrec['title'],
$logrec['ftime'],
$logrec['comment'],
$logrec['time']) = @explode('<>', $dataset[$i]);
$e = 'format error.';
if (!isset($logrec['flag'])) $logrec['flag'] = $e;
if (!isset($logrec['dpath'])) $logrec['dpath'] = $e;
if (!isset($logrec['fname'])) $logrec['fname'] = $e;
if (!isset($logrec['title'])) $logrec['title'] = $e;
if (!isset($logrec['ftime'])) $logrec['ftime'] = $e;
if (!isset($logrec['comment'])) $logrec['comment'] = $e;
if (!isset($logrec['time'])) $logrec['time'] = 0;
if ('OK' != $logrec['flag']) {
continue;
}
if ($wrec['dpath'] == $logrec['dpath'] &&
$wrec['fname'] == $logrec['fname']) {
break;
}
}
if ($i < $cnt) {
$regno = $i;
} else {
$regno = $cnt;
}
} else {
$regno = 0;
}
$dataset[$regno] = join('<>', $wrec)."<>\r\n";
// 存在しないファイル(またはディレクトリ)への記録があれば削除
$datasetNew = false;
$cnt = count($dataset);
$daysAgo = time() - (60 * 60 * 24 * 7); // 7日前
for ($i = 0; $i < $cnt; $i++) {
@list($logrec['flag'],
$logrec['dpath'],
$logrec['fname'],
$logrec['title'],
$logrec['ftime'],
$logrec['comment'],
$logrec['time']) = @explode('<>', $dataset[$i]);
if ('OK' != $logrec['flag']) {
continue;
}
if ('/' == $logrec['dpath']) {
$path = cfg('cImgDir');
} else {
$path = cfg('cImgDir').'/'.$logrec['dpath'];
}
if ($logrec['fname']) {
$path .= '/'.$logrec['fname'];
}
if (!@$logrec['time'] ||
'' == $logrec['time'] || 0 == $logrec['time']) {
$logrec['time'] = 0;
}
// パスが存在していれば or エントリが7日前より新しければ
if (file_exists($path) || $logrec['time'] > $daysAgo) {
$datasetNew[] = $dataset[$i];
}
}
$dataset = array();
if (!file_exists($logfile)) {
errExit_logErr($logfile);
}
if (!lockDir($logfile)) {
errExit_lockErr($logfile);
}
if (false === ($fp = @fopen($logfile, "w"))) {
unlockDir();
errExit_logErr($logfile);
}
if (false === @fwrite($fp, join('', $datasetNew))) {
unlockDir();
@fclose($fp);
errExit_logErr($logfile);
}
@fclose($fp);
unlockDir();
return true;
}
// ログ読み込み
function readLog($dpath, $fpath)
{
static $dataset = false;
if (false === $dataset) {
if (false === ($dataset = @file(DAT_DIR.'/'.cfg('cLogFile')))) {
return false;
}
}
$dpath = trimDotSlaAny($dpath);
$fname = basename($fpath);
foreach ($dataset as $record) {
@list($logrec['flag'],
$logrec['dpath'],
$logrec['fname'],
$logrec['title'],
$logrec['ftime'],
$logrec['comment'],
$logrec['time']) = @explode('<>', $record);
$e = 'format error.';
if (!isset($logrec['flag'])) $logrec['flag'] = $e;
if (!isset($logrec['dpath'])) $logrec['dpath'] = $e;
if (!isset($logrec['fname'])) $logrec['fname'] = $e;
if (!isset($logrec['title'])) $logrec['title'] = $e;
if (!isset($logrec['ftime'])) $logrec['ftime'] = $e;
if (!isset($logrec['comment'])) $logrec['comment'] = $e;
if (!isset($logrec['time'])) $logrec['time'] = 0;
if ('OK' != $logrec['flag']) {
continue;
}
if ($dpath == $logrec['dpath'] && $fname == $logrec['fname']) {
return $logrec;
}
}
return false;
}
// ディレクトリ直下のファイル削除
function rmFiles($dpath)
{
if (false === ($handle = @opendir($dpath))) {
errExit($dpath.' ディレクトリオープン失敗');
}
while (false !== ($ent = @readdir($handle))) {
if ('.' == $ent || '..' == $ent) {
continue;
}
$path = $dpath.'/'.$ent;
if (!is_dir($path)) {
@unlink($path);
}
}
@closedir($handle);
return true;
}
// HTMLテンプレートファイルからメニュー階層変数読み込み
function readMenuhier()
{
switch (cfg('sSkinType')) {
case 0: $path = cfg('s0_Menu_Thumb_Img'); break;
case 1: return 1;
case 2: $path = cfg('s2_Menu'); break;
case 3: $path = cfg('s3_Menu_Thumb'); break;
case 4: return 1;
case 5: $path = cfg('s5_Menu'); break;
case 6: $path = cfg('s6_Menu'); break;
case 7: $path = cfg('s7_Menu'); break;
}
// 毎回読むのもなんだかな..まあ確実性が保障されるからいいか
if (function_exists('file_get_contents')) {
$buf = @file_get_contents(cfg('cSkinDir').'/'.$path);
} else {
$buf = @file(cfg('cSkinDir').'/'.$path);
if (false !== $buf) {
$buf = @join('', $buf);
}
}
if (false === $buf) {
return 1;
}
if (preg_match_all(
"/{commnet *HT_MenuHierCount *= *([0-9]+) *}/",
$buf, $matches)) {
return $matches[1][0];
}
return 1; // エラーの場合は1固定
}
// 有効なクエリかチェック
function validQ($what, $query)
{
if ('number' != $what) {
return validPath($what, $query, cfg('cImgDir'));
}
$period = 0;
for ($i = 0, $cnt = strlen($query); $i < $cnt; $i++) {
$c = ord($query[$i]);
if (46 == $c) {
$period++;
}
if (46 != $c && (48 > $c || 57 < $c) || 1 < $period) {
errExit('URLクエリ不正');
}
}
return $period;
}
// クエリ<->パスの変換
function codecQ($what, $query)
{
static $modeIsNum = true;
$result = true;
switch ($what) {
case 'set':
$modeIsNum = $query;
return true;
case 'd2n':
if ($modeIsNum) {
$fpath = false;
$cnt = 0;
$result = codecQ_r(0, false, $query, $fpath, $cnt);
$query = 'q_num='.$query;
} else {
$query = 'q_dir='.rawurlencode($query);
}
break;
case 'n2d':
$fpath = false;
$cnt = 0;
$result = codecQ_r(1, false, $query, $fpath, $cnt);
break;
case 'f2n':
if ($modeIsNum) {
$dpath = dirname($query);
$cnt = 0;
$result = codecQ_r(0, false, $dpath, $query, $cnt);
$query = 'q_num='.$dpath.'.'.$query;
} else {
$query = 'q_file='.rawurlencode($query);
}
break;
case 'n2f':
list($dpath, $query) = explode('.', $query);
$cnt = 0;
$result = codecQ_r(1, false, $dpath, $query, $cnt);
break;
default:
errExit('パラメータ不正');
}
if (false === $result) {
errExit('URLクエリ不正');
}
return $query;
}
// クエリ<->パスの変換
function codecQ_r($what, $dirent, &$qDir, &$qFile, &$dirCnt)
{
// $what=0 : path to number
// $what=1 : number to path
if (false === $dirent) {
$dirent = getDirent();
}
foreach ($dirent as $idx => $val) {
if (!is_array($val)) {
continue;
}
if (($what ? $dirCnt : $idx) != $qDir) {
$dirCnt++;
if (codecQ_r($what, $val, $qDir, $qFile, $dirCnt)) {
return true;
}
continue;
}
$qDir = ($what ? $idx : $dirCnt);
if (false === $qFile) {
return true;
}
$fileCnt = 0;
foreach ($val as $fpath) {
if (($what ? $fileCnt : $fpath) == $qFile) {
$qFile = ($what ? $fpath : $fileCnt);
return true;
}
$fileCnt++;
}
break;
}
return false;
}
// ファイルロック
function lockDir()
{
if (!LOCK_ENABLE) {
return true;
}
$path = LOCK_DIR;
if (file_exists($path)) {
clearstatcache(); // for stat()
$st = stat($path);
if ($st[9] < (time() - 30)) {
unlockDir();
}
}
$retry = 5;
// セーフモードのときは環境によっては
// mkdir失敗する可能性がある。
// そのような環境ではLOCK_ENABLE=falseで対処
while (!@mkdir($path)) {
if (--$retry <= 0) {
return false;
}
sleep(1);
}
return true; // Ready(ロック中でない)
}
// ファイルアンロック
function unlockDir()
{
if (!LOCK_ENABLE) {
return;
}
// セーフモードのときは環境によっては
// mkdir失敗する可能性がある。
// そのような環境ではLOCK_ENABLE=falseで対処
@rmdir(LOCK_DIR);
}
// 有効なパスか検査
function validPath($what, $path, $bpath)
{
$msg = false;
$info =
"\n\n--備考--\n".
"\n".
"(1)\n".
"次の半角記号は使用できません。 \" # % ' * : < > ? \\ |\n".
"また、日本語を使用している場合もエラーとなることがあります。\n".
"日本語は使用できません(使用しないで下さい)。\n".
"\n".
"(2)\n".
"管理者が新しいファイルをアップロードしたあとに、\n".
"ブラウザに古いURLが表示された状態でリロードすると、\n".
"稀に不整合が発生することがあります。\n".
"この場合は再度トップページから読み込みを行って下さい。";
while (1) {
if ('' == $path) {
$msg = 'パスが空です。';
break;
}
if (true !== ($chr = validChars($path))) {
$msg = '使用禁止文字「'.$chr.'」を含んでいます。';
break;
}
if ('/' == $path[0]) {
$msg = '絶対パスが指定されています。';
break;
}
if (strstr($path, "\\")) {
$msg = '「半角¥のコード」を含んでいます。';
break;
}
if ('/' == $path[strlen($path) - 1]) {
$msg = '最後が「/」です。';
break;
}
if (strstr($path, '..')) {
$msg = '「..」を含んでいます。';
break;
}
if (strstr($path, '//')) {
$msg = '「//」を含んでいます。';
break;
}
// 以上は簡易チェック、以下は念入りなチェック
$curpath = realpath('.');
if (false === ($path = realpath($path))) {
$msg = 'パスが存在しません。';
break;
}
$curpath .= '/'.trimDotSla($bpath);
$curpath = str_replace("\\", "/" ,$curpath);
$path = str_replace("\\", "/" ,$path);
if ((int) 0 !== strpos($path, $curpath)) {
$msg = '画像ディレクトリ配下のパスではありません。';
break;
}
if ('dpath' == $what) {
if (!is_dir($path)) {
$msg = 'ディレクトリが存在しません。';
break;
}
}
else {
if (!is_file($path)) {
$msg = 'ファイルが存在しません。';
break;
}
if (!eregi(IMG_EXT, $path)) {
$msg = 'ファイルの拡張子が不適切です。';
break;
}
}
break;
}
if (false !== $msg) {
// 詳細エラー表示はセキュリティ的に望ましくない
// errExit($msg);
errExit('URLクエリ不正');
}
return true;
}
// 有効な文字か?
function validChars($str)
{
for ($i = 0, $cnt = strlen($str); $i < $cnt; $i++) {
$c = ord($str[$i]);
if (32 > $c || 126 < $c) {
return false;
}
switch ($c) {
case 34: // "
case 35: // #
case 37: // %
case 39: // '
case 42: // *
case 58: // :
case 60: // <
case 62: // >
case 63: // ?
case 92: // ¥
case 124: // |
return $str[$i];
}
}
return true;
}
// 有効な文字か?
function validPwd($str)
{
for ($i = 0, $cnt = strlen($str); $i < $cnt; $i++) {
$c = ord($str[$i]);
if (32 > $c || 126 < $c) {
return false;
}
switch ($c) {
case 32: // SP
case 33: // !
case 34: // "
case 35: // #
case 36: // $
case 37: // %
case 38: // &
case 39: // '
case 42: // *
case 58: // :
case 60: // <
case 62: // >
case 63: // ?
case 92: // ¥
case 96: // `
case 124: // |
return $str[$i];
}
}
// 半角英数字と「()+,-./;=@[]^_{}~」がtrue
if (16 < strlen($str)) {
return false;
}
return true;
}
// サムネイルのキャッシュが存在しているかチェック
function existsThumb($ipath)
{
// 自作サムネイルが存在する場合
if (cfg('cMyThumbPrefix')) {
$tpath = dirname($ipath).'/'.
cfg('cMyThumbPrefix').basename($ipath);
if (file_exists($tpath)) {
return trimDotSla($tpath);
}
}
// サムネイルのファイルのパスを作成
$tpath = trimDotSlaAny($ipath).THUMB_EXT;
$tpath = str_replace('/', '_', $tpath);
$tpath = trimDotSla(DAT_DIR).'/'.cfg('cThumbCacheDir').'/'.$tpath;
// サムネイルのキャッシュが有効の場合
if (1 == cfg('cThumbCacheMethod') && file_exists($tpath)) {
clearstatcache(); // for filemtime()
if (filemtime($ipath) < filemtime($tpath)) {
return $tpath;
}
}
return false;
}
// ログファイルの文字列を検査
function chkLogStr($flag, $str, $param)
{
if ($str) {
if ($flag && '#' == $str[0] &&
isset($str[1]) && '#' == $str[1]) {
return '';
} else {
return $str;
}
} else {
return $param;
}
}
// 先頭の「./」を取り除く
function trimDotSla($path)
{
if (false === ($n = strpos($path, '/'))) {
return '/';
}
if (($n + 1) == strlen($path)) {
return '/';
}
return substr($path, $n + 1);
}
// 先頭の「./***/」を取り除く
function trimDotSlaAny($path)
{
return trimDotSla(trimDotSla($path));
}
// サムネイルの更新($createがtrueなら再生成)
function updateThumbs($create)
{
if (1 != cfg('cThumbCacheMethod')) {
$buf[] = ''.
'情報
管理モードの「初期設定」→'.
'「サムネイルの表示モード」が
'.
'「1.必要に応じて縮小画像を生成して表示」以外に'.
'設定されているため、
'.
'「サムネイルの再生成」または「サムネイルの更新」を'.
'行う必要はありません。';
} else {
$dirent = getDirent();
$buf = updateThumbs_r($dirent, $create);
}
$buf = join("\n", $buf);
return $buf;
}
// サムネイル画像の更新
function updateThumbs_r($dirent, $create)
{
$buf = array();
foreach ($dirent as $idx => $val) {
if (is_array($val)) {
$buf = array_merge($buf,
updateThumbs_r($val, $create));
continue;
}
if (false !== ($tpath = existsThumb($val))) {
if ($create) {
@unlink($tpath);
} else {
$buf[] = '';
continue;
}
}
$tpath = cfg('scriptFileUrl').'?q_thumb='.
rawurlencode($val);
$buf[] = '';
}
return $buf;
}
// ファイル作成
function newFile($path, $data)
{
$fp = @fopen($path, "w");
if (!$fp) { return false; }
if (!@fwrite($fp, $data)) { return false; }
if (!@fclose($fp)) { return false; }
return true;
}
// iniファイルのパース
// parseIniFile==trueのときは、
// 機能的にはparse_ini_fileと同じ
function CFG_parse($fname, $parseIniFile)
{
$err = 'iniファイルの書式不正 ';
if (false === ($cfg = @file($fname))) {
return false;
}
$cnt = count($cfg);
for ($i = 0; $i < $cnt; $i++) {
$val = trim($cfg[$i]);
if ('' == $val || ';' == $val[0]) {
if (!$parseIniFile) {
$cfg[$i] = array('', $val);
}
continue;
}
$eq = strpos($val, '=');
if (0 == $eq || false === $eq) {
errExit($err.$val);
}
$left = trim(substr($val, 0, $eq));
if ('' == $left) {
errExit($err.$val);
}
$right = trim(substr($val, $eq + 1));
if (2 > ($len = strlen($right))) {
errExit($err.$val);
}
if ('"' != $right[0] || '"' != $right[$len - 1]) {
errExit($err.$val);
}
$right = substr($right, 1, $len - 2);
if (false !== strpos($right, '"')) {
errExit($err.$val);
}
if ($parseIniFile) {
$ini[$left] = $right;
} else {
$cfg[$i] = array($left, $right);
}
}
if ($parseIniFile) {
return $ini;
} else {
return $cfg;
}
}
// スキンをURLで指定(デバッグ用 or 管理用)
function selSkin()
{
if (!cfg('g_selSkin')) {
return;
}
$skins = CFG_scanSkins(SKIN_DIR);
if (!$skins) {
return;
}
$url = cfg('scriptFileUrl').cfg('defQ').'q_skin=';
$buf = array();
foreach ($skins as $idx => $val) {
$idx = rawurlencode($idx);
$buf[] = ''.$val."";
}
$arg = array();
$arg = makeArgCom($arg);
$arg['HT_BaseUrl'] = '
\n", $buf);
$path = ADM_SKIN_DIR.'/'.ADM_SKIN_SELSKIN_HTML;
$ht = new HtmlTemplate;
$ht->t_include($path, $arg);
}
// サムネイル画像生成
function GD_makeThumb($spath, $dpath)
{
// GD情報を取得
$gd = GD_gdinfo();
// GDモジュール存在チェック
if (!$gd['gd']) {
GD_dispImgFile(THUMB_ERR_IMG);
return;
}
// メイン処理
$sim = false;
$dim = false;
if (!GD_createThumb($spath, $dpath, $gd, $sim, $dim)) {
if ($sim) {
@imagedestroy($sim);
}
if ($dim) {
@imagedestroy($dim);
}
GD_dispImgFile(THUMB_ERR_IMG);
}
}
// サムネイル生成処理
function GD_createThumb($spath, $dpath, $gd, &$sim, &$dim)
{
// 元画像のサイズと画像タイプを取得
if (!GD_getSrcImgSize($spath, $sw, $sh, $type, $gd)) {
return false;
}
// サムネイル画像のサイズを適切な値に設定
$dw = $sw;
$dh = $sh;
GD_calDstSize($dw, $dh);
// 元画像を読み込み
if (!($sim = GD_imgCreateFrom($type, $spath, $gd))) {
return false;
}
// サムネイル画像を新規作成
if (!($dim = GD_imgCreate($dw, $dh, $gd))) {
return false;
}
// 元画像からサムネイル画像に縮小コピー
if (!GD_imgCopy($dim, $sim, $dw, $dh, $sw, $sh, $gd)) {
return false;
}
@imagedestroy($sim); // もう不要
// サムネイル画像カラー変更オプションを取得
GD_getColorOpt($opt, $pct, $rgb);
// サムネイル画像の明るさを変更するオプションがONの場合
if (1 == $opt) {
// 画像の明るさを変更する
if (!GD_imgChangeBright($dim, $dw, $dh, $gd, $pct[0])) {
return false;
}
}
// サムネイル画像をモノクロにするオプションがONの場合
elseif (2 == $opt || 3 == $opt) {
// 画像をモノクロにする
if (!GD_imgChangeGrayscale($dim, $dw, $dh, $gd, $pct[0])) {
return false;
}
// モノクロ画像に色を乗せるオプションがONの場合
// (上で作成したモノクロ画像に背景をマージしているだけ。
// この方法が適切かどうかは不明..)
if (3 == $opt) {
// モノクロ画像に色を乗せる(セピア調が可能)
if (!GD_imgChangeBgColor(
$dim, $dw, $dh, $gd, $pct[1], $rgb)) {
return false;
}
}
}
// サムネイル画像を保存して表示する
if (!GD_imgDisplay($dim, $dpath, $gd)) {
return false;
}
@imagedestroy($dim); // もう不要
return true;
}
// 画像サイズ取得
function GD_getSrcImgSize($spath, &$sw, &$sh, &$type, $gd)
{
// 画像サイズとタイプを取得
if (!$gd['getimagesize'] ||
false === ($info = @getimagesize($spath))) {
return false;
}
$sw = (int) $info[0];
$sh = (int) $info[1];
$type = (int) $info[2];
return true;
}
// サムネイル画像サイズ取得
function GD_calDstSize(&$dw, &$dh)
{
// サムネイル画像のサイズを計算
if (0 == cfg('sThumbSizeMethod')) {
$dw = cfg('sThumbSizeW');
$dh = cfg('sThumbSizeH');
} elseif (1 == cfg('sThumbSizeMethod')) {
$dh = (int) ($dh * cfg('sThumbSizeW') / $dw);
$dw = cfg('sThumbSizeW');
} elseif (2 == cfg('sThumbSizeMethod')) {
$dw = (int) ($dw * cfg('sThumbSizeW') / $dh);
$dh = cfg('sThumbSizeW');
} else {
if ($dw >= $dh) {
if (cfg('sThumbSizeW') < $dw) {
$dh = (int) ($dh * cfg('sThumbSizeW') / $dw);
$dw = cfg('sThumbSizeW');
}
} else {
if (cfg('sThumbSizeW') < $dh) {
$dw = (int) ($dw * cfg('sThumbSizeW') / $dh);
$dh = cfg('sThumbSizeW');
}
}
}
}
// 画像読み込み
function GD_imgCreateFrom($type, $spath, $gd)
{
if (1 > $type || 3 < $type) {
return false;
}
$type--;
$functab = array(
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng');
$sim = false;
if ($gd[$functab[$type]]) {
$sim = @$functab[$type]($spath);
}
return $sim;
}
// 新規画像生成
function GD_imgCreate($dw, $dh, $gd, $gray = false)
{
if ($gray) {
$functab = array(
'imagecreate');
} else {
$functab = array(
'imagecreatetruecolor',
'imagecreate');
}
$dim = false;
foreach ($functab as $func) {
if ($gd[$func]) {
$dim = @$func($dw, $dh);
}
if ($dim) {
break;
}
}
return $dim;
}
// 縮小コピー
function GD_imgCopy($dim, $sim, $dw, $dh, $sw, $sh, $gd)
{
$functab = array(
'imagecopyresampled',
'imagecopyresized');
$result = false;
foreach ($functab as $func) {
if ($gd[$func]) {
$result = @$func($dim, $sim,
0, 0, 0, 0, $dw, $dh, $sw, $sh);
}
if ($result) {
break;
}
}
return $result;
}
// サムネイルのカラーオプション取得
function GD_getColorOpt(&$opt, &$pct, &$rgb)
{
$opt = cfg('sThumbColorOpt');
$pct[0] = cfg('sThumbColorPct');
$pct[1] = cfg('sThumbSepiaPct');
for ($i = 0; $i < 2; $i++) {
if (0 > $pct[$i] || 100 < $pct[$i]) {
$opt = 0; // オプション無効
break;
}
}
$rgb = GD_hex2dec(cfg('sThumbSepiaRGB'));
for ($i = 0; $i < 3; $i++) {
if (0 > $rgb[$i] || 255 < $rgb[$i]) {
$opt = 0; // オプション無効
break;
}
}
}
// 16進数→2進数に変換
function GD_hex2dec($str)
{
$str = trim($str);
if ('#' == $str[0]) {
$str = substr($str, 1, strlen($str) - 1);
}
if (6 != strlen($str)) {
// エラー時は白で
$r = 255;
$g = 255;
$b = 255;
} else {
$r = intval(substr($str, 0, 2), 16);
$g = intval(substr($str, 2, 2), 16);
$b = intval(substr($str, 4, 2), 16);
}
return array($r, $g, $b);
}
// 明るさ変更
function GD_imgChangeBright(&$dim, $dw, $dh, $gd, $pct)
{
if (!($mim = GD_imgCreate($dw, $dh, $gd))) {
return false;
}
$result = false;
if ($gd['imagecopymerge']) {
$result = @imagecopymerge($mim, $dim,
0, 0, 0, 0, $dw, $dh, $pct);
}
if (!$result) {
@imagedestroy($mim);
return false;
}
@imagedestroy($dim);
$dim = $mim;
return true;
}
// グレイスケール変更
function GD_imgChangeGrayscale(&$dim, $dw, $dh, $gd, $pct)
{
if (!($mim = GD_imgCreate($dw, $dh, $gd, true))) {
return false;
}
$result = false;
if ($gd['imagecolorallocate']) {
$cnt = 256;
for ($i = 0; $i < $cnt; $i++) {
if (0 > @imagecolorallocate($mim, $i, $i, $i)) {
break;
}
}
$result = ($i == $cnt) ? true : false;
}
if (!$result) {
@imagedestroy($mim);
return false;
}
$result = false;
if ($gd['imagecopymerge']) {
$result = @imagecopymerge($mim, $dim,
0, 0, 0, 0, $dw, $dh, $pct);
}
if (!$result) {
@imagedestroy($mim);
return false;
}
@imagedestroy($dim);
$dim = $mim;
return true;
}
// 背景色マージ(セピア調などにする)
function GD_imgChangeBgColor(&$dim, $dw, $dh, $gd, $pct, $rgb)
{
if (!($mim = GD_imgCreate($dw, $dh, $gd, true))) {
return false;
}
$result = false;
if ($gd['imagecolorallocate']) {
if (0 <= @imagecolorallocate(
$mim, $rgb[0], $rgb[1], $rgb[2])) {
$result = true;
}
}
if (!$result) {
@imagedestroy($mim);
return false;
}
$result = false;
if ($gd['imagecopymerge']) {
$result = @imagecopymerge($mim, $dim,
0, 0, 0, 0, $dw, $dh, $pct);
}
if (!$result) {
@imagedestroy($mim);
return false;
}
@imagedestroy($dim);
$dim = $mim;
return true;
}
// 画像生成と表示
function GD_imgDisplay($dim, $dpath, $gd)
{
$functab = array(
/*20060105*/
array('ext'=> THUMB_EXT,'func'=>'imagejpeg','type'=>'jpeg'),
/*
今回はサムネイル画像の拡張子はjpgで固定。
array('ext'=>'.png','func'=>'imagepng','type'=>'png'),
array('ext'=>'.gif','func'=>'imagegif','type'=>'gif'),
*/
);
$result = false;
foreach ($functab as $func) {
if (!$gd[$func['func']]) {
continue;
}
header('Content-type: image/'.$func['type']);
// キャッシュ保存しない場合
if (2 == cfg('cThumbCacheMethod')) {
if (@$func['func']($dim)) {
$result = true;
break;
}
} else {
// PHP4.4.1(のみ)のバグ対策
if ($gd['4.4.1']) {
newFile($dpath.$func['ext'], "a");
}
if (@$func['func']($dim, $dpath.$func['ext']) &&
@$func['func']($dim)) {
$result = true;
break;
}
if ($gd['4.4.1']) {
// エラー発生している場合は
// さっきnewFileで作成したファイルを削除
@unlink($dpath.$func['ext']);
}
}
}
return $result;
}
// 画像ファイルをブラウザに表示
function GD_dispImgFile($fpath)
{
// 画像ファイルの拡張子から画像形式判別
if (eregi("(\.jpg$|\.jpeg$)", $fpath)) {
$type = 'jpeg';
} elseif (eregi("\.png$", $fpath)) {
$type = 'png';
} elseif (eregi("\.gif$", $fpath)) {
$type = 'gif';
}
// ブラウザへ画像ファイルを出力(表示)
if (function_exists('mb_http_output')) {
mb_http_output('pass');
}
header("Content-type: image/".$type);
header("Content-Disposition: inline; filename=".$fpath);
header("Content-length: ".@filesize($fpath));
@readfile($fpath);
}
// GD情報取得
function GD_gdinfo()
{
static $gd = false;
if ($gd) {
return $gd;
}
if (extension_loaded('gd')) {
$gd['gd'] = true;
} else {
$gd['gd'] = false;
return $gd;
}
$func = array(
'getimagesize',
'imagecolorallocate',
'imagecopymerge',
'imagecopyresampled',
'imagecopyresized',
'imagecreate',
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng',
'imagecreatetruecolor',
'imagedestroy',
'imagejpeg',
'imagepng',
'imagegif');
foreach ($func as $val) {
if (function_exists($val)) {
$gd[$val] = true;
} else {
$gd[$val] = false;
}
}
if (strstr(PHP_VERSION, '4.4.1')) {
$gd['4.4.1'] = true;
} else {
$gd['4.4.1'] = false;
}
return $gd;
}
// 初期設定ファイルの書き換え
function CFG_regist()
{
$skinIniFile = cfg('cUserSkinDir').'/'.SKIN_INI_DAT;
// 初期設定ファイルを読み込み
$cfg = CFG_parse(CONFIG_INI_DAT, false);
if (!$cfg) {
errExit_iniErr(CONFIG_INI_DAT);
}
$skin = CFG_parse($skinIniFile, false);
if (!$skin) {
errExit_skinErr($skinIniFile);
}
$c_result = 0;
$s_result = 0;
// ポストされたデータを全てチェック
foreach ($_POST as $idx => $val) {
if (get_magic_quotes_gpc()) {
$val = stripslashes($val);
}
// この値はちょっと例外
if (strstr($idx, 'sThumbSizeW')) {
$s = $idx[strlen($idx) - 1];
$m = @$_POST['sThumbSizeMethod'];
if ($s != $m) {
continue;
} else {
$idx = 'sThumbSizeW';
}
}
// この値はちょっと例外
if (strstr($idx, 'sThumbColorPct')) {
$s = $idx[strlen($idx) - 1];
$m = @$_POST['sThumbColorOpt'];
if ($s != $m) {
continue;
} else {
$idx = 'sThumbColorPct';
}
}
// 設定の置き換え(上書き)
if (CFG_replace($cfg, $idx, $val)) {
$c_result = 1;
} else {
if (CFG_replace($skin, $idx, $val)) {
$s_result = 1;
}
}
}
// 初期設定ファイルに書き込み
if ($c_result) {
CFG_write(CONFIG_INI_DAT, $cfg);
}
if ($s_result) {
CFG_write($skinIniFile, $skin);
}
}
// 設定の置き換え(上書き)
function CFG_replace(&$cfg, $avar, $aval)
{
static $cnt;
$cnt = count($cfg);
for ($i = 0; $i < $cnt; $i++) {
if ('' != $cfg[$i][0]) {
if ($avar == $cfg[$i][0]) {
$cfg[$i][1] = $aval;
return true;
}
}
}
return false;
}
// 初期設定ファイルに書き込み
function CFG_write($fname, $cfg)
{
foreach ($cfg as $val) {
if ('' == $val[0]) {
$buf[] = $val[1];
} else {
$buf[] = $val[0].' = "'.$val[1].'"';
}
}
if (!lockDir()) {
errExit_lockErr($fname);
}
if (false === ($fp = @fopen($fname, "w"))) {
unlockDir();
errExit_iniErr($fname);
}
if (false === @fwrite($fp, join("\r\n", $buf))) {
@fclose($fp);
unlockDir();
errExit_iniErr($fname);
}
@fclose($fp);
unlockDir();
}
// 初期設定画面データ作成
function CFG_makeArg($arg)
{
$err = 'iniファイルのパラメータ不正 ';
global $_cfg;
$buf = $_cfg;
$buf['cSkinDir'] = cfg('cUserSkinDir');
// スキン初期設定ファイル読み込み
$skinIniFile = $buf['cSkinDir'].'/'.SKIN_INI_DAT;
if (!($add = CFG_parse($skinIniFile, true))) {
errExit_skinErr($skinIniFile);
}
$buf = array_merge($buf, $add);
$add = array();
$ck = 'checked';
$arg['HT_cImgDir'] = $buf['cImgDir'];
$arg['HT_cLogFile'] = $buf['cLogFile'];
$arg['HT_cMyThumbPrefix'] = $buf['cMyThumbPrefix'];
switch ($buf['cQueryIsPath']) {
case 0: $arg['HT_cQueryIsPath_0'] = $ck; break;
case 1: $arg['HT_cQueryIsPath_1'] = $ck; break;
default:
errExit($err.'cQueryIsPath='.$buf['cQueryIsPath']);
}
$skins = CFG_scanSkins(SKIN_DIR);
if ($skins) {
foreach ($skins as $idx => $val) {
if ($buf['cSkinDir'] == $idx) {
$arg['HT_cSkinDir'][] = array(
'Path' => $val, 'Name' => $val, 'Checked' => $ck);
} else {
$arg['HT_cSkinDir'][] = array(
'Path' => $val, 'Name' => $val, 'Checked' => '');
}
}
}
$arg['HT_cThumbCacheDir'] = $buf['cThumbCacheDir'];
switch ($buf['cThumbCacheMethod']) {
case 0: $arg['HT_cThumbCacheMethod_0'] = $ck; break;
case 1: $arg['HT_cThumbCacheMethod_1'] = $ck; break;
case 2: $arg['HT_cThumbCacheMethod_2'] = $ck; break;
default:
errExit($err.'cThumbCacheMethod='.$buf['cThumbCacheMethod']);
}
$arg['HT_s0_Menu_Thumb_Img'] = $buf['s0_Menu_Thumb_Img'];
$arg['HT_s1_ThumbInMenu_Img'] = $buf['s1_ThumbInMenu_Img'];
$arg['HT_s2_Menu'] = $buf['s2_Menu'];
$arg['HT_s2_Thumb_Img'] = $buf['s2_Thumb_Img'];
$arg['HT_s3_Img'] = $buf['s3_Img'];
$arg['HT_s3_Menu_Thumb'] = $buf['s3_Menu_Thumb'];
$arg['HT_s4_Img'] = $buf['s4_Img'];
$arg['HT_s4_ThumbInMenu'] = $buf['s4_ThumbInMenu'];
$arg['HT_s5_Img'] = $buf['s5_Img'];
$arg['HT_s5_Menu'] = $buf['s5_Menu'];
$arg['HT_s5_Thumb'] = $buf['s5_Thumb'];
$arg['HT_s6_Blank'] = $buf['s6_Blank'];
$arg['HT_s6_Img'] = $buf['s6_Img'];
$arg['HT_s6_Index'] = $buf['s6_Index'];
$arg['HT_s6_Menu'] = $buf['s6_Menu'];
$arg['HT_s6_Thumb'] = $buf['s6_Thumb'];
$arg['HT_s7_Blank'] = $buf['s7_Blank'];
$arg['HT_s7_Img'] = $buf['s7_Img'];
$arg['HT_s7_Index'] = $buf['s7_Index'];
$arg['HT_s7_Menu'] = $buf['s7_Menu'];
$arg['HT_s7_Thumb'] = $buf['s7_Thumb'];
switch ($buf['sDispFileCount']) {
case 0: $arg['HT_sDispFileCount_0'] = $ck; break;
case 1: $arg['HT_sDispFileCount_1'] = $ck; break;
default:
errExit($err.'sDispFileCount='.$buf['sDispFileCount']);
}
$arg['HT_sImgFileDateFormat'] = $buf['sImgFileDateFormat'];
$arg['HT_sImgSizeMaxH'] = $buf['sImgSizeMaxH'];
$arg['HT_sImgSizeMaxW'] = $buf['sImgSizeMaxW'];
$arg['HT_sMenuIndentChars'] =
htmlspecialchars($buf['sMenuIndentChars']);
switch ($buf['sMenuOrderRev']) {
case 0: $arg['HT_sMenuOrderRev_0'] = $ck; break;
case 1: $arg['HT_sMenuOrderRev_1'] = $ck; break;
default:
errExit($err.'sMenuOrderRev='.$buf['sMenuOrderRev']);
}
$arg['HT_sNewMarkSuffix'] = $buf['sNewMarkSuffix'];
$arg['HT_sPageTitle'] = $buf['sPageTitle'];
$arg['HT_sReturnUrl'] = $buf['sReturnUrl'];
$arg['HT_sSkinAuthorMsgFile'] = $buf['sSkinAuthorMsgFile'];
if ($arg['HT_sSkinAuthorMsgFile']) {
$msgfile = $buf['cSkinDir'].'/'.$arg['HT_sSkinAuthorMsgFile'];
if (file_exists($msgfile)) {
$arg['HT_AdmSkinAuthorMsgUrl'] =
cfg('scriptDirUrl').'/'.$msgfile;
}
}
switch ($buf['sSkinType']) {
case 0: $arg['HT_sSkinType_0'] = $ck; break;
case 1: $arg['HT_sSkinType_1'] = $ck; break;
case 2: $arg['HT_sSkinType_2'] = $ck; break;
case 3: $arg['HT_sSkinType_3'] = $ck; break;
case 4: $arg['HT_sSkinType_4'] = $ck; break;
case 5: $arg['HT_sSkinType_5'] = $ck; break;
case 6: $arg['HT_sSkinType_6'] = $ck; break;
case 7: $arg['HT_sSkinType_7'] = $ck; break;
default:
errExit($err.'sSkinType='.$buf['sSkinType']);
}
switch ($buf['sThumbColorOpt']) {
case 0: $arg['HT_sThumbColorOpt_0'] = $ck; break;
case 1: $arg['HT_sThumbColorOpt_1'] = $ck; break;
case 2: $arg['HT_sThumbColorOpt_2'] = $ck; break;
case 3: $arg['HT_sThumbColorOpt_3'] = $ck; break;
default:
errExit($err.'sThumbColorOpt='.$buf['sThumbColorOpt']);
}
$arg['HT_sThumbColorPct'] = $buf['sThumbColorPct'];
$arg['HT_sThumbColorPct'] = $buf['sThumbColorPct'];
switch ($buf['sThumbOrderRev']) {
case 0: $arg['HT_sThumbOrderRev_0'] = $ck; break;
case 1: $arg['HT_sThumbOrderRev_1'] = $ck; break;
default:
errExit($err.'sThumbOrderRev='.$buf['sThumbOrderRev']);
}
$arg['HT_sThumbSepiaPct'] = $buf['sThumbSepiaPct'];
$arg['HT_sThumbSepiaRGB'] = $buf['sThumbSepiaRGB'];
$arg['HT_sThumbSizeW'] = $buf['sThumbSizeW'];
$arg['HT_sThumbSizeH'] = $buf['sThumbSizeH'];
switch ($buf['sThumbSizeMethod']) {
case 0: $arg['HT_sThumbSizeMethod_0'] = $ck; break;
case 1: $arg['HT_sThumbSizeMethod_1'] = $ck; break;
case 2: $arg['HT_sThumbSizeMethod_2'] = $ck; break;
case 3: $arg['HT_sThumbSizeMethod_3'] = $ck; break;
default:
errExit($err.'sThumbSizeMethod='.$buf['sThumbSizeMethod']);
}
$arg['HT_sThumbTitleLenMax'] = $buf['sThumbTitleLenMax'];
$arg['HT_sThumbWrap'] = $buf['sThumbWrap'];
return $arg;
}
// 存在するスキン情報を返却
function CFG_scanSkins($dpath)
{
$skins = false;
if (false === ($handle = @opendir($dpath))) {
errExit($dpath.' オープン失敗');
}
while (false !== ($ent = @readdir($handle))) {
if ('.' == $ent || '..' == $ent) {
continue;
}
$path = $dpath.'/'.$ent;
if (!@is_dir($path)) {
continue;
}
if (!@file_exists($path.'/'.SKIN_INI_DAT)) {
continue;
}
$skins[$path] = $ent;
}
@closedir($handle);
return $skins;
}
// ログイン処理
function AUTH_login()
{
// 管理モードではない場合
if (!isset($_GET['q_auth'])) {
return false;
}
// セッションの開始
session_set_cookie_params(0, cfg('cookiePath'));
session_start();
// 確認キーの表示か?
if ('captcha' == $_GET['q_auth']) {
AUTH_captcha();
exit;
}
// 現在の状態を判別
if ('logout' == $_GET['q_auth']) {
// 操作によるログアウト
$result = 'logout';
} else {
if (isset($_SESSION['s_login'])) {
if ($_SESSION['s_login'] > time()) {
$_SESSION['s_login'] = time() + AUTH_LIFE_TIME;
// ログイン中
return true;
} else {
// タイムアウト
$result = 'timeout';
}
} else {
// これからログイン認証をする
$result = 'auth';
}
}
// 現在の状態により処理を分岐
switch ($result) {
// 操作によるログアウト
case 'logout':
// タイムアウト
case 'timeout':
// セッション変数の内容をクリア
$_SESSION = array();
// クッキーの削除
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '',
time() - 42000, cfg('cookiePath'));
}
// セッション変数の破棄
session_destroy();
// 念のためセッションファイルをすぐに削除
$id = htmlspecialchars(session_id());
if (preg_match('/^[0-9a-f]{32}$/', $id)) {
$path = session_save_path().'/sess_'.$id;
if (@is_file($path)) {
@unlink($path);
}
}
if ('logout' == $result) {
$arg['HT_msg'] =
'戻る | '.
'再びログインする';
} else {
$arg['HT_msg'] =
'前回ログイン時の最後の操作から'.
'一定期間が経過しているため、'.
'安全性のために自動的にログアウトしました。'.
'再びログインする必要がある場合は、'.
'再度ログイン認証を行って下さい。
'.
'戻る | '.
'再びログインする';
}
$arg['HT_login'] = false;
$arg['HT_scriptUrl'] = cfg('scriptFileUrl');
$arg['HT_PageTitle'] = 'ログアウトしました';
$arg['HT_CopyrightImgS'] = COPYRIGHT_IMG_S;
$arg['HT_BaseUrl'] = '
エラー
管理パスワードの生成に成功しました。
以下をよく読んで手続きを行ない、 ページ下部の「OK」リンクをクリックして下さい。
必須
管理パスワードを「」ファイルに
保存しました(内容は暗号化されています)。
このファイルを「」に移動し、
パーミッションを読み取り専用に変更して下さい
(例:604や644や600等)。
※FTPクライアントでファイルの移動が出来ない場合は、
一度このファイルをダウンロードし、
サーバ上の「」を削除した後に、
「」にアップロードして下さい。
パーミッションの設定を忘れずに。
任意
また、もし可能であればですが、
このファイルのより一層のセキュリティを確保するために、
.htaccessを利用してこのファイルのhttpからの読み出しを
一切禁止にすると良いと思います(必須ではない)。
任意
また、もし可能であればですが、
このファイルのより一層のセキュリティを確保するために、
このファイルをDocumentRootディレクトリの外側に
移動すると良いとおもいます(必須ではない)。
この場合、pipipiga.php の ADMIN_PASS_FILE の設定の
「」の部分を
移動先のパス名に変更して下さい。
任意
管理パスワードを再生成する場合は、
「」ファイルを削除して下さい。
「」を「」に 移動しましたか? 移動したのなら以下のOKをクリックして下さい。
[ OK ]
管理パスワードを生成します。
任意の管理パスワードを入力してOKを押して下さい。
※パスワードの文字数は「半角で16文字以内」です。
※パスワードで使用可能な文字は「半角の英数字」と、
次の半角記号です → ()+,-./;=@[]^_{}~
※他人に想定されづらいパスワードを入力して下さい。