NiconicoPHP'); define('COPYRIGHT_IMG_S', 'NiconicoPHP'); define('COPYRIGHT_IMG_B', 'NiconicoPHP'); $_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'] = ''; $arg['HT_HomeUrl'] = cfg('sReturnUrl'); $arg['HT_Copyright'] = COPYRIGHT_TXT; $arg['HT_CopyrightImgS'] = COPYRIGHT_IMG_S; $arg['HT_CopyrightImgB'] = COPYRIGHT_IMG_B; $arg['HT_PageTitle'] = cfg('sPageTitle'); $arg['HT_AdmLoginUrl'] = cfg('scriptFileUrl').AUTH_sid().'q_auth=login'; $type = cfg('sSkinType'); if (6 == $type || 7 == $type) { $arg['HT_TopUrl'] = cfg('scriptFileUrl'); } else { $arg['HT_TopUrl'] = cfg('scriptFileUrl').cfg('defQ'); } return $arg; } // HTMLテンプレートargデータ作成(管理データ) function makeArgAdm($arg) { $arg['HT_AdmScriptDirUrl'] = cfg('scriptDirUrl'); $q = cfg('scriptFileUrl').AUTH_sid(); $arg['HT_AdmLogoutUrl'] = $q.'q_auth=logout'; $arg['HT_AdmCfgDspUrl'] = $q.'q_auth=login&q_cmd=cfgdsp'; $arg['HT_AdmHelpUrl'] = $q.'q_auth=login&q_cmd=help'; $arg['HT_AdmCfgRegUrl'] = $q.'q_auth=login&q_cmd=cfgreg'; $arg['HT_AdmTUpdateUrl'] = $q.'q_auth=login&q_cmd=tupdate'; $arg['HT_AdmTCreateUrl'] = $q.'q_auth=login&q_cmd=tcreate'; $arg['HT_AdmTCleanUrl'] = $q.'q_auth=login&q_cmd=tclean'; $arg['HT_AdmCurFullUrl'] = cfg('scriptFileUrl').'?'. htmlspecialchars(@$_SERVER['QUERY_STRING']); return $arg; } // HTMLテンプレートargデータ作成(ブラウズデータ) function makeArgBody($arg, $qDir, $qFile) //, $menuFile) { // 現在選択されているディレクトリを初期化 $hereDir = false; // ディレクトリ指定==サムネイル一覧データ作成 if (false !== $qDir) { $add = makeArgThumb($qDir); $arg = array_merge($arg, (array) $add); $hereDir = $qDir; } // ファイル指定==画像単表示データ作成 if (false !== $qFile) { $add = makeArgImg($qFile); $arg = array_merge($arg, (array) $add); $hereDir = dirname($qFile); } // ディレクトリエントリ取得 $dirent = getDirent(); // 不要なサムネイルあれば削除 if (cfg('cThumbCacheMethod') && @$dirent[cfg('cImgDir')]) { cleanThumb($dirent[cfg('cImgDir')], DAT_DIR.'/'.cfg('cThumbCacheDir')); } else { cleanThumb(false, DAT_DIR.'/'.cfg('cThumbCacheDir')); } // フォルダメニューデータ作成 $parentArg = false; $add = makeArgMenu(cfg('sSkinType'), $dirent, $hereDir, readMenuhier(), $parentArg); $arg = array_merge($arg, (array) $add); return $arg; } // HTMLテンプレートargデータ作成(画像単表示データ) function makeArgImg($fpath) { $dpath = dirname($fpath); // $arg['HT_ImgSrc'] = cfg('scriptDirUrl').'/'.$fpath; $arg['HT_ImgSrc'] = cfg('scriptDirUrl').'/'.trimDotSla($fpath); /*20060105*/ $arg['HT_ImgPath'] = $fpath; $arg['HT_ImgReturnUrl'] = cfg('scriptFileUrl'). cfg('defQ').codecQ('d2n', $dpath); $arg['HT_ImgMaxSize'] = imgMaxSize($fpath); // ディレクトリ直下のファイルリスト取得 $files = getFiles($dpath); // 逆ソートが必要な場合 /* if (cfg('sThumbOrderRev')) { $files = array_reverse($files); } */ /*sortsort*/ if (cfg('sThumbOrderRev')) { @rsort($files); } else { @sort($files); } $no = array_search($fpath, $files); // 前の画像へのリンク作成 if (isset($files[$no - 1])) { $arg['HT_ImgPrevUrl'] = cfg('scriptFileUrl'). cfg('defQ').codecQ('f2n', $files[$no - 1]); } // 次の画像へのリンク作成 if (isset($files[$no + 1])) { $arg['HT_ImgNextUrl'] = cfg('scriptFileUrl'). cfg('defQ').codecQ('f2n', $files[$no + 1]); } clearstatcache(); // for filemtime if (false === ($logrec = readLog($dpath, $fpath))) { $arg['HT_ImgTitle'] = basename($fpath); $arg['HT_ImgDate'] = date(cfg('sImgFileDateFormat'), filemtime($fpath)); } else { $arg['HT_ImgTitleTextarea'] = $logrec['title']; $arg['HT_ImgTitle'] = chkLogStr(1, $logrec['title'], basename($fpath)); $arg['HT_ImgDateTextarea'] = $logrec['ftime']; $arg['HT_ImgDate'] = chkLogStr(1, $logrec['ftime'], date(cfg('sImgFileDateFormat'), filemtime($fpath))); $arg['HT_ImgCommentTextarea'] = str_replace("
", "\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'] = ''; $arg['HT_skinList'] = join("
\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'] = ''; $path = ADM_SKIN_DIR.'/'.ADM_SKIN_AUTH_HTML; $ht = new HtmlTemplate; $ht->t_include($path, $arg); break; // これからログイン認証をする case 'auth': // 認証開始状態を保持 $_SESSION['s_start'] = true; // 認証処理(管理パスワードと確認キーの認証) if (true !== ($msg = AUTH_valid())) { // 最初にアクセスしたとき、 // または、認証NGなら認証画面を表示 $arg['HT_login'] = true; if (cfg('GDenable')) { $arg['HT_captcha'] = true; } if ($msg) { $arg['HT_errmsg'] = $msg; } $arg['HT_scriptUrl'] = cfg('scriptFileUrl'); $arg['HT_PageTitle'] = 'ログイン認証'; $arg['HT_CopyrightImgS'] = ''; $arg['HT_BaseUrl'] = ''; $path = ADM_SKIN_DIR.'/'.ADM_SKIN_AUTH_HTML; $ht = new HtmlTemplate; $ht->t_include($path, $arg); } else { // 認証OK echo ''; } break; } exit; } // URLに付加するセッションIDを取得 function AUTH_sid() { if (defined("SID") && "" != SID) { $query = '?'.htmlspecialchars(SID).'&'; } else { $query = '?'; } return $query; } // 認証処理(管理パスワードと確認キーの認証) function AUTH_valid() { // 認証ボタンが押されていない場合 if (!isset($_POST['p_submit'])) { return false; } // 管理パスワードが送られていなら場合 if (!isset($_POST['p_pass'])) { return false; } // 確認キーが送られていなら場合 if (cfg('GDenable') && !isset($_POST['p_captcha'])) { return false; } // 管理パスワードの文字列チェック if (!@$_POST['p_pass']) { return '管理パスワードが入力されていません。'; } if (true !== validPwd($_POST['p_pass'])) { return '正しくありません。もう一度入力して下さい。'; } // 確認キーの文字列チェック if (cfg('GDenable')) { if (!@$_POST['p_captcha']) { return '確認キーが入力されていません。'; } if (true !== validChars($_POST['p_captcha'])) { return '正しくありません。もう一度入力して下さい。'; } if (4 < strlen($_POST['p_captcha'])) { return '正しくありません。もう一度入力して下さい。'; } } // 管理パスワードを取得 $admpass = @file(ADMIN_PASS_FILE); if (false === $admpass) { @unlink(ADMIN_PASS_FILE); @umask(0000); mkAdminPass(); exit; } $admpass = trim($admpass[3]); $inputpass = md5($_POST['p_pass']); // 管理パスワードが間違えている場合 if ($admpass != $inputpass) { return '正しくありません。もう一度入力して下さい。'; } if (cfg('GDenable')) { // クッキーOFFの場合 if (!isset($_SESSION['s_captcha'])) { if (!@file_exists(CAPTCHA_FILE)) { // 致命的なのでスクリプト終了 errExit('認証に失敗しました。または、'. '認証に必要な作業ファイルが見つかりません。'); } // ファイルの内容を読み込む $captcha = @file(CAPTCHA_FILE); if (false === $captcha) { // 致命的なのでスクリプト終了 errExit('認証に失敗しました。または、'. '認証に必要な作業ファイルが見つかりません。'); } $captcha = rtrim($captcha[2]); // ファイルは用済みなので速攻で削除 @unlink(CAPTCHA_FILE); // 確認キーが間違えている場合 if ($_POST['p_captcha'] != $captcha) { return '正しくありません。もう一度入力して下さい。'; } } // クッキーONの場合 else { // 確認キーが間違えている場合 if ($_POST['p_captcha'] != $_SESSION['s_captcha']) { return '正しくありません。もう一度入力して下さい。'; } } } $_SESSION['s_login'] = time() + AUTH_LIFE_TIME; return true; } // 簡易captcha // 確認キーの文字列生成と文字列を画像に表示する。 // captchaについては以下URLを参照。 // http://ja.wikipedia.org/wiki/Captcha function AUTH_captcha() { // 確認キーの長さ // あまり長いと入力面倒なのでとりあえず4桁にしとく $capLen = 4; // 確認キーに使用する文字列 // フォントが小さいの認識しづらい文字は抜いた $ch = 'ABCDEFGHJKLMNPQRSTUVWXYZ'; // 乱数発生の準備 list($usec, $sec) = explode(' ', microtime()); mt_srand((float) $sec + ((float) $usec * 100000)); // 乱数発生させて確認キーの文字列を作成 $chLen = strlen($ch) - 1; for ($captcha = '', $i = 0; $i < $capLen; $i++) { $captcha .= substr($ch, mt_rand(0, $chLen), 1); // 読みやすいように空白入れる $captcha .= ' '; } // mcrypt使える環境なら$captchaを暗号化してもいい // 確認キーを画像で表示(jpegだとにじむのでpngで) $im = imagecreate(75, 18); imagecolorallocate($im, 0, 0, 0); $col = imagecolorallocate($im, 255, 255, 255); // 組み込みフォントの最大サイズは5 imagestring($im, 5, 5, 1, $captcha, $col); header('Content-type: image/png'); imagepng($im); imagedestroy($im); // さっき挿入した空白を削除 $captcha = str_replace(' ', '' ,$captcha); // 確認キーをセッション変数に保存 $_SESSION['s_captcha'] = $captcha; // クッキーOFFの場合は(しょうがないので)ファイル保存 if (!isset($_SESSION['s_start'])) { if (false === ($fp = @fopen(CAPTCHA_FILE, 'w'))) { errExit('認証に必要な作業ファイルを作成できませんでした。'); } $captcha = ''; if (false === @fwrite($fp, $captcha)) { errExit('認証に必要な作業ファイルを作成できませんでした。'); } @fclose($fp); } } // エラー終了 function errExit($msg) { ?>

エラー

戻る

\n"); ?>

管理パスワードの生成に成功しました。

以下をよく読んで手続きを行ない、 ページ下部の「OK」リンクをクリックして下さい。

必須
管理パスワードを「」ファイルに 保存しました(内容は暗号化されています)。 このファイルを「」に移動し、 パーミッションを読み取り専用に変更して下さい (例:604や644や600等)。
※FTPクライアントでファイルの移動が出来ない場合は、 一度このファイルをダウンロードし、 サーバ上の「」を削除した後に、 「」にアップロードして下さい。 パーミッションの設定を忘れずに。

任意
また、もし可能であればですが、 このファイルのより一層のセキュリティを確保するために、 .htaccessを利用してこのファイルのhttpからの読み出しを 一切禁止にすると良いと思います(必須ではない)。

任意
また、もし可能であればですが、 このファイルのより一層のセキュリティを確保するために、 このファイルをDocumentRootディレクトリの外側に 移動すると良いとおもいます(必須ではない)。 この場合、pipipiga.php の ADMIN_PASS_FILE の設定の 「」の部分を 移動先のパス名に変更して下さい。

任意
管理パスワードを再生成する場合は、 「」ファイルを削除して下さい。


」を「」に 移動しましたか? 移動したのなら以下のOKをクリックして下さい。

[ OK ]

初期設定

管理パスワードを生成します。
任意の管理パスワードを入力してOKを押して下さい。

※パスワードの文字数は「半角で16文字以内」です。
※パスワードで使用可能な文字は「半角の英数字」と、
  次の半角記号です → ()+,-./;=@[]^_{}~
※他人に想定されづらいパスワードを入力して下さい。