<?php
-/////////////////////////////////////////////////
-// PukiWiki - Yet another WikiWikiWeb clone.
+// PukiWiki - Yet another WikiWikiWeb clone
+// $Id: attach.inc.php,v 1.80 2005/12/18 15:27:43 henoheno Exp $
+// Copyright (C)
+// 2003-2005 PukiWiki Developers Team
+// 2002-2003 PANDA <panda@arino.jp> http://home.arino.jp/
+// 2002 Y.MASUI <masui@hisec.co.jp> http://masui.net/pukiwiki/
+// 2001-2002 Originally written by yu-ji
+// License: GPL v2 or (at your option) any later version
//
-// $Id: attach.inc.php,v 1.16 2003/02/26 12:04:39 panda Exp $
-//
-
-/*
- ¥×¥é¥°¥¤¥ó attach
-
- changed by Y.MASUI <masui@hisec.co.jp> http://masui.net/pukiwiki/
- modified by PANDA <panda@arino.jp> http://home.arino.jp/
-*/
+// File attach plugin
-// upload dir(must set end of /)
-if (!defined('UPLOAD_DIR'))
-{
- define('UPLOAD_DIR','./attach/');
-}
+// NOTE (PHP > 4.2.3):
+// This feature is disabled at newer version of PHP.
+// Set this at php.ini if you want.
+// Max file size for upload on PHP (PHP default: 2MB)
+ini_set('upload_max_filesize', '2M');
-// max file size for upload on PHP(PHP default 2MB)
-ini_set('upload_max_filesize','2M');
-
-// max file size for upload on script of PukiWiki(default 1MB)
-define('MAX_FILESIZE',1000000);
+// Max file size for upload on script of PukiWikiX_FILESIZE
+define('PLUGIN_ATTACH_MAX_FILESIZE', (1024 * 1024)); // default: 1MB
// ´ÉÍý¼Ô¤À¤±¤¬ÅºÉÕ¥Õ¥¡¥¤¥ë¤ò¥¢¥Ã¥×¥í¡¼¥É¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë
-define('ATTACH_UPLOAD_ADMIN_ONLY',FALSE); // FALSE or TRUE
+define('PLUGIN_ATTACH_UPLOAD_ADMIN_ONLY', TRUE); // FALSE or TRUE
+
// ´ÉÍý¼Ô¤À¤±¤¬ÅºÉÕ¥Õ¥¡¥¤¥ë¤òºï½ü¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë
-define('ATTACH_DELETE_ADMIN_ONLY',FALSE); // FALSE or TRUE
+define('PLUGIN_ATTACH_DELETE_ADMIN_ONLY', TRUE); // FALSE or TRUE
+
+// ´ÉÍý¼Ô¤¬ÅºÉÕ¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë¤È¤¤Ï¡¢¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºî¤é¤Ê¤¤
+// PLUGIN_ATTACH_DELETE_ADMIN_ONLY=TRUE¤Î¤È¤Í¸ú
+define('PLUGIN_ATTACH_DELETE_ADMIN_NOBACKUP', TRUE); // FALSE or TRUE
// ¥¢¥Ã¥×¥í¡¼¥É/ºï½ü»þ¤Ë¥Ñ¥¹¥ï¡¼¥É¤òÍ׵᤹¤ë(ADMIN_ONLY¤¬Í¥Àè)
-define('ATTACH_PASSWORD_REQUIRE',FALSE); // FALSE or TRUE
+define('PLUGIN_ATTACH_PASSWORD_REQUIRE', FALSE); // FALSE or TRUE
-// file icon image
-if (!defined('FILE_ICON'))
-{
- define('FILE_ICON','<img src="./image/file.png" width="20" height="20" alt="file" style="border-width:0px" />');
-}
+// ¥Õ¥¡¥¤¥ë¤Î¥¢¥¯¥»¥¹¸¢
+define('PLUGIN_ATTACH_FILE_MODE', 0644);
+//define('PLUGIN_ATTACH_FILE_MODE', 0604); // for XREA.COM
-//-------- init
-function plugin_attach_init()
-{
- $messages = array(
- '_attach_messages'=>array(
- 'msg_uploaded' => '$1 ¤Ë¥¢¥Ã¥×¥í¡¼¥É¤·¤Þ¤·¤¿',
- 'msg_deleted' => '$1 ¤«¤é¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤·¤¿',
- 'msg_freezed' => 'źÉÕ¥Õ¥¡¥¤¥ë¤òÅà·ë¤·¤Þ¤·¤¿¡£',
- 'msg_unfreezed'=> 'źÉÕ¥Õ¥¡¥¤¥ë¤òÅà·ë²ò½ü¤·¤Þ¤·¤¿¡£',
- 'msg_upload' => '$1 ¤Ø¤ÎźÉÕ',
- 'msg_info' => 'źÉÕ¥Õ¥¡¥¤¥ë¤Î¾ðÊó',
- 'msg_confirm' => '<p>%s ¤òºï½ü¤·¤Þ¤¹¡£</p>',
- 'msg_list' => 'źÉÕ¥Õ¥¡¥¤¥ë°ìÍ÷',
- 'msg_listpage' => '$1 ¤ÎźÉÕ¥Õ¥¡¥¤¥ë°ìÍ÷',
- 'msg_listall' => 'Á´¥Ú¡¼¥¸¤ÎźÉÕ¥Õ¥¡¥¤¥ë°ìÍ÷',
- 'msg_file' => 'źÉÕ¥Õ¥¡¥¤¥ë',
- 'msg_maxsize' => '¥¢¥Ã¥×¥í¡¼¥É²ÄǽºÇÂç¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤Ï %s ¤Ç¤¹¡£',
- 'msg_count' => ' <span class="small">%s·ï</span>',
- 'msg_password' => '¥Ñ¥¹¥ï¡¼¥É',
- 'msg_adminpass'=> '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É',
- 'msg_delete' => '¤³¤Î¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤¹¡£',
- 'msg_freeze' => '¤³¤Î¥Õ¥¡¥¤¥ë¤òÅà·ë¤·¤Þ¤¹¡£',
- 'msg_unfreeze' => '¤³¤Î¥Õ¥¡¥¤¥ë¤òÅà·ë²ò½ü¤·¤Þ¤¹¡£',
- 'msg_isfreeze' => '¤³¤Î¥Õ¥¡¥¤¥ë¤ÏÅà·ë¤µ¤ì¤Æ¤¤¤Þ¤¹¡£',
- 'msg_require' => '(´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹)',
- 'msg_filesize' => '¥µ¥¤¥º',
- 'msg_date' => 'ÅÐÏ¿Æü»þ',
- 'msg_dlcount' => '¥¢¥¯¥»¥¹¿ô',
- 'err_noparm' => '$1 ¤Ø¤Ï¥¢¥Ã¥×¥í¡¼¥É¡¦ºï½ü¤Ï¤Ç¤¤Þ¤»¤ó',
- 'err_exceed' => '$1 ¤Ø¤Î¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤¬Â礤¹¤®¤Þ¤¹',
- 'err_exists' => '$1 ¤ËƱ¤¸¥Õ¥¡¥¤¥ë̾¤¬Â¸ºß¤·¤Þ¤¹',
- 'err_notfound' => '$1 ¤Ë¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¸«¤Ä¤«¤ê¤Þ¤»¤ó',
- 'err_noexist' => 'źÉÕ¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó¡£',
- 'err_password' => '¥Ñ¥¹¥ï¡¼¥É¤¬°ìÃפ·¤Þ¤»¤ó¡£',
- 'err_adminpass'=> '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É¤¬°ìÃפ·¤Þ¤»¤ó¡£',
- 'btn_upload' => '¥¢¥Ã¥×¥í¡¼¥É',
- 'btn_info' => '¾ÜºÙ',
- 'btn_submit' => '¼Â¹Ô'
- )
- );
- set_plugin_messages($messages);
-}
+// File icon image
+define('PLUGIN_ATTACH_FILE_ICON', '<img src="' . IMAGE_DIR . 'file.png"' .
+ ' width="20" height="20" alt="file"' .
+ ' style="border-width:0px" />');
+
+// mime-type¤òµ½Ò¤·¤¿¥Ú¡¼¥¸
+define('PLUGIN_ATTACH_CONFIG_PAGE_MIME', 'plugin/attach/mime-type');
//-------- convert
function plugin_attach_convert()
{
global $vars;
-
- if (!ini_get('file_uploads'))
- {
- return 'file_uploads disabled';
- }
-
+
+ $page = isset($vars['page']) ? $vars['page'] : '';
+
$nolist = $noform = FALSE;
-
- if (func_num_args() > 0)
- {
- foreach (func_get_args() as $arg)
- {
+ if (func_num_args() > 0) {
+ foreach (func_get_args() as $arg) {
$arg = strtolower($arg);
$nolist |= ($arg == 'nolist');
$noform |= ($arg == 'noform');
}
}
+
$ret = '';
- if (!$nolist)
- {
- $obj = &new AttachPages($vars['page']);
- $ret .= $obj->to_string($vars['page'],TRUE);
+ if (! $nolist) {
+ $obj = & new AttachPages($page);
+ $ret .= $obj->toString($page, TRUE);
}
- if (!$noform)
- {
- $ret .= attach_form($vars['page']);
+ if (! $noform) {
+ $ret .= attach_form($page);
}
-
+
return $ret;
}
//-------- action
function plugin_attach_action()
{
- global $vars,$HTTP_POST_FILES;
-
- if (array_key_exists('openfile',$vars))
- {
- $vars['pcmd'] = 'open';
+ global $vars, $_attach_messages;
+
+ // Backward compatible
+ if (isset($vars['openfile'])) {
$vars['file'] = $vars['openfile'];
+ $vars['pcmd'] = 'open';
}
- if (array_key_exists('delfile',$vars))
- {
- $vars['pcmd'] = 'delete';
+ if (isset($vars['delfile'])) {
$vars['file'] = $vars['delfile'];
+ $vars['pcmd'] = 'delete';
}
- if (array_key_exists('attach_file',$HTTP_POST_FILES) and
- is_uploaded_file($HTTP_POST_FILES['attach_file']['tmp_name']))
- {
- return attach_upload();
- }
-
- $age = array_key_exists('age',$vars) ? $vars['age'] : 0;
- $pcmd = array_key_exists('pcmd',$vars) ? $vars['pcmd'] : '';
-
- switch ($pcmd)
- {
- case 'info': return attach_info();
- case 'delete': return attach_delete();
- case 'open': return attach_open($vars['refer'],$vars['file'],$age);
- case 'list': return attach_list();
- case 'freeze': return attach_freeze(TRUE);
- case 'unfreeze':return attach_freeze(FALSE);
- case 'upload': return attach_showform();
+
+ $pcmd = isset($vars['pcmd']) ? $vars['pcmd'] : '';
+ $refer = isset($vars['refer']) ? $vars['refer'] : '';
+ $pass = isset($vars['pass']) ? $vars['pass'] : NULL;
+ $page = isset($vars['page']) ? $vars['page'] : '';
+
+ if ($refer != '' && is_pagename($refer)) {
+ if(in_array($pcmd, array('info', 'open', 'list'))) {
+ check_readable($refer);
+ } else {
+ check_editable($refer);
+ }
}
- if ($vars['page'] == '' or !is_page($vars['page']))
- {
- return attach_list();
+
+ // Dispatch
+ if (isset($_FILES['attach_file'])) {
+ // Upload
+ return attach_upload($_FILES['attach_file'], $refer, $pass);
+ } else {
+ switch ($pcmd) {
+ case 'delete': /*FALLTHROUGH*/
+ case 'freeze':
+ case 'unfreeze':
+ if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
+ }
+ switch ($pcmd) {
+ case 'info' : return attach_info();
+ case 'delete' : return attach_delete();
+ case 'open' : return attach_open();
+ case 'list' : return attach_list();
+ case 'freeze' : return attach_freeze(TRUE);
+ case 'unfreeze' : return attach_freeze(FALSE);
+ case 'upload' : return attach_showform();
+ }
+ if ($page == '' || ! is_page($page)) {
+ return attach_list();
+ } else {
+ return attach_showform();
+ }
}
-
- return attach_showform();
}
+
//-------- call from skin
function attach_filelist()
{
- global $vars,$_attach_messages;
-
- plugin_attach_init();
-
- $obj = &new AttachPages($vars['page'],0);
+ global $vars, $_attach_messages;
- if (!array_key_exists($vars['page'],$obj->pages))
- {
+ $page = isset($vars['page']) ? $vars['page'] : '';
+
+ $obj = & new AttachPages($page, 0);
+
+ if (! isset($obj->pages[$page])) {
return '';
+ } else {
+ return $_attach_messages['msg_file'] . ': ' .
+ $obj->toString($page, TRUE) . "\n";
}
- return $_attach_messages['msg_file'].': '.$obj->to_string($vars['page'],TRUE)."\n";
}
+
//-------- ¼ÂÂÎ
-//¥Õ¥¡¥¤¥ë¥¢¥Ã¥×¥í¡¼¥É
-function attach_upload()
+// ¥Õ¥¡¥¤¥ë¥¢¥Ã¥×¥í¡¼¥É
+// $pass = NULL : ¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤
+// $pass = TRUE : ¥¢¥Ã¥×¥í¡¼¥Éµö²Ä
+function attach_upload($file, $page, $pass = NULL)
{
- global $vars,$adminpass,$HTTP_POST_FILES;
- global $_attach_messages;
-
- if ($HTTP_POST_FILES['attach_file']['size'] > MAX_FILESIZE)
- {
- return array('msg'=>$_attach_messages['err_exceed']);
- }
- if (is_freeze($vars['refer']) || !is_editable($vars['refer']))
- {
- return array('msg'=>$_attach_messages['err_noparm']);
- }
- if (ATTACH_UPLOAD_ADMIN_ONLY and md5($vars['pass']) != $adminpass)
- {
- return array('msg'=>$_attach_messages['err_adminpass']);
+ global $_attach_messages, $notify, $notify_subject;
+
+ if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
+
+ // Check query-string
+ $query = 'plugin=attach&pcmd=info&refer=' . rawurlencode($page) .
+ '&file=' . rawurlencode($file['name']);
+
+ if (PKWK_QUERY_STRING_MAX && strlen($query) > PKWK_QUERY_STRING_MAX) {
+ pkwk_common_headers();
+ echo('Query string (page name and/or file name) too long');
+ exit;
+ } else if (! is_page($page)) {
+ die_message('No such page');
+ } else if ($file['tmp_name'] == '' || ! is_uploaded_file($file['tmp_name'])) {
+ return array('result'=>FALSE);
+ } else if ($file['size'] > PLUGIN_ATTACH_MAX_FILESIZE) {
+ return array(
+ 'result'=>FALSE,
+ 'msg'=>$_attach_messages['err_exceed']);
+ } else if (! is_pagename($page) || ($pass !== TRUE && ! is_editable($page))) {
+ return array(
+ 'result'=>FALSE,'
+ msg'=>$_attach_messages['err_noparm']);
+ } else if (PLUGIN_ATTACH_UPLOAD_ADMIN_ONLY && $pass !== TRUE &&
+ ($pass === NULL || ! pkwk_login($pass))) {
+ return array(
+ 'result'=>FALSE,
+ 'msg'=>$_attach_messages['err_adminpass']);
}
-
- $obj = &new AttachFile($vars['refer'],$HTTP_POST_FILES['attach_file']['name']);
-
+
+ $obj = & new AttachFile($page, $file['name']);
if ($obj->exist)
- {
- return array('msg'=>$_attach_messages['err_exists']);
- }
- move_uploaded_file($HTTP_POST_FILES['attach_file']['tmp_name'],$obj->filename);
-
- if (is_page($vars['refer']))
- {
- touch(get_filename($vars['refer']));
- }
-
+ return array('result'=>FALSE,
+ 'msg'=>$_attach_messages['err_exists']);
+
+ if (move_uploaded_file($file['tmp_name'], $obj->filename))
+ chmod($obj->filename, PLUGIN_ATTACH_FILE_MODE);
+
+ if (is_page($page))
+ touch(get_filename($page));
+
$obj->getstatus();
- $obj->status['pass'] = array_key_exists('pass',$vars) ? md5($vars['pass']) : '';
+ $obj->status['pass'] = ($pass !== TRUE && $pass !== NULL) ? md5($pass) : '';
$obj->putstatus();
- return array('msg'=>$_attach_messages['msg_uploaded']);
-}
-//¾ÜºÙ¥Õ¥©¡¼¥à¤òɽ¼¨
-function attach_info($err='')
-{
- global $script,$vars;
- global $_attach_messages;
-
- $retval = array();
+ if ($notify) {
+ $footer['ACTION'] = 'File attached';
+ $footer['FILENAME'] = & $file['name'];
+ $footer['FILESIZE'] = & $file['size'];
+ $footer['PAGE'] = & $page;
- $obj = &new AttachFile($vars['refer'],$vars['file'],$vars['age']);
- $obj->getstatus();
-
- $s_file = htmlspecialchars($vars['file']);
- $s_refer = htmlspecialchars($vars['refer']);
- $r_refer = rawurlencode($vars['refer']);
+ $footer['URI'] = get_script_uri() .
+ //'?' . rawurlencode($page);
- $retval['msg'] = sprintf($_attach_messages['msg_info'],$s_file);
- $retval['body'] = ($err == '') ? '' : '<p>'.$_attach_messages[$err].'</p>';
+ // MD5 may heavy
+ '?plugin=attach' .
+ '&refer=' . rawurlencode($page) .
+ '&file=' . rawurlencode($file['name']) .
+ '&pcmd=info';
- $retval['body'] .= <<<EOD
- <span class="small">
- [<a href="$script?plugin=attach&pcmd=list&refer=$r_refer">{$_attach_messages['msg_list']}</a>]
- [<a href="$script?plugin=attach&pcmd=list">{$_attach_messages['msg_listall']}</a>]
- </span><br />
-EOD;
-
- if ($obj->status['freeze'])
- {
- $msg_freezed = '<dd>'.$_attach_messages['msg_isfreeze'].'</dd>';
- $msg_delete = '';
- $msg_freeze = '<input type="hidden" name="pcmd" value="unfreeze" />'.$_attach_messages['msg_unfreeze'];
- }
- else
- {
- $msg_freezed = '';
- $msg_delete = '<input type="radio" name="pcmd" value="delete" />'.$_attach_messages['msg_delete'];
- if (ATTACH_DELETE_ADMIN_ONLY)
- {
- $msg_delete .= $_attach_messages['msg_require'];
- }
- $msg_delete .= '<br />';
- $msg_freeze = '<input type="radio" name="pcmd" value="freeze" />'.$_attach_messages['msg_freeze'];
- }
- $info = $obj->to_string(TRUE,FALSE);
- $type = attach_mime_content_type(UPLOAD_DIR.$obj->file);
- $age = array_key_exists('age',$vars) and is_numeric($vars['age']) ? $vars['age'] : 0;
- $retval['body'] .= <<< EOD
-<dl>
- <dt>$info</dt>
- <dd>{$_attach_messages['msg_filesize']}:{$obj->size_str} ({$obj->size} bytes)</dd>
- <dd>Content-type:$type</dd>
- <dd>{$_attach_messages['msg_date']}:{$obj->time_str}</dd>
- <dd>{$_attach_messages['msg_dlcount']}:{$obj->status['count'][$age]}</dd>
- $msg_freezed
-</dl>
-EOD;
- if ($obj->age)
- {
- return $retval;
+ $footer['USER_AGENT'] = TRUE;
+ $footer['REMOTE_ADDR'] = TRUE;
+
+ pkwk_mail_notify($notify_subject, "\n", $footer) or
+ die('pkwk_mail_notify(): Failed');
}
- $retval['body'] .= <<< EOD
-<hr>
-<form action="$script" method="post">
- <div>
- <input type="hidden" name="plugin" value="attach" />
- <input type="hidden" name="refer" value="$s_refer" />
- <input type="hidden" name="file" value="$s_file" />
- $msg_delete
- $msg_freeze{$_attach_messages['msg_require']}<br />
- {$_attach_messages['msg_password']}: <input type="password" name="pass" size="8" />
- <input type="submit" value="{$_attach_messages['btn_submit']}" />
- </div>
-</form>
-EOD;
-
- return $retval;
+
+ return array(
+ 'result'=>TRUE,
+ 'msg'=>$_attach_messages['msg_uploaded']);
}
-//ºï½ü
+
+// ¾ÜºÙ¥Õ¥©¡¼¥à¤òɽ¼¨
+function attach_info($err = '')
+{
+ global $vars, $_attach_messages;
+
+ foreach (array('refer', 'file', 'age') as $var)
+ ${$var} = isset($vars[$var]) ? $vars[$var] : '';
+
+ $obj = & new AttachFile($refer, $file, $age);
+ return $obj->getstatus() ?
+ $obj->info($err) :
+ array('msg'=>$_attach_messages['err_notfound']);
+}
+
+// ºï½ü
function attach_delete()
{
- global $vars,$adminpass;
- global $_attach_messages;
-
- if (is_freeze($vars['refer']) or !is_editable($vars['refer']))
- {
- return array('msg' => $_attach_messages['err_noparm']);
- }
-
- $obj = &new AttachFile($vars['refer'],$vars['file']);
-
- if (!$obj->exist)
- {
- return array('msg' => $_attach_messages['err_notfound']);
- }
-
- $obj->getstatus();
-
- if ($obj->status['freeze'])
- {
- return attach_info('msg_isfreeze');
- }
-
- if (md5($vars['pass']) != $adminpass)
- {
- if (ATTACH_DELETE_ADMIN_ONLY)
- {
- return attach_info('err_adminpass');
- }
- else if (ATTACH_PASSWORD_REQUIRE and md5($vars['pass']) != $obj->status['pass'])
- {
- return attach_info('err_password');
- }
- }
- //¥Ð¥Ã¥¯¥¢¥Ã¥×
- do
- {
- $age = ++$obj->status['age'];
- }
- while (file_exists($obj->basename.'.'.$age));
-
- rename($obj->basename,$obj->basename.'.'.$age);
- $obj->status['count'][$age] = $obj->status['count'][0];
- $obj->status['count'][0] = 0;
- $obj->putstatus();
-
- if (is_page($vars['refer']))
- {
- touch(get_filename($vars['refer']));
- }
-
- return array('msg' => $_attach_messages['msg_deleted']);
+ global $vars, $_attach_messages;
+
+ foreach (array('refer', 'file', 'age', 'pass') as $var)
+ ${$var} = isset($vars[$var]) ? $vars[$var] : '';
+
+ if (is_freeze($refer) || ! is_editable($refer))
+ return array('msg'=>$_attach_messages['err_noparm']);
+
+ $obj = & new AttachFile($refer, $file, $age);
+ if (! $obj->getstatus())
+ return array('msg'=>$_attach_messages['err_notfound']);
+
+ return $obj->delete($pass);
}
-//Åà·ë
+
+// Åà·ë
function attach_freeze($freeze)
{
- global $vars,$adminpass;
- global $_attach_messages;
-
- if (is_freeze($vars['refer']) or !is_editable($vars['refer']))
- {
- return array('msg' => $_attach_messages['err_noparm']);
- }
-
- $obj = &new AttachFile($vars['refer'],$vars['file']);
-
- if (!$obj->exist)
- {
- return array('msg' => $_attach_messages['err_notfound']);
+ global $vars, $_attach_messages;
+
+ foreach (array('refer', 'file', 'age', 'pass') as $var) {
+ ${$var} = isset($vars[$var]) ? $vars[$var] : '';
}
- if (md5($vars['pass']) != $adminpass)
- {
- return attach_info('err_adminpass');
+
+ if (is_freeze($refer) || ! is_editable($refer)) {
+ return array('msg'=>$_attach_messages['err_noparm']);
+ } else {
+ $obj = & new AttachFile($refer, $file, $age);
+ return $obj->getstatus() ?
+ $obj->freeze($freeze, $pass) :
+ array('msg'=>$_attach_messages['err_notfound']);
}
-
- $obj->getstatus();
- $obj->status['freeze'] = $freeze;
- $obj->putstatus();
-
- return array('msg' => $_attach_messages[$freeze ? 'msg_freezed' : 'msg_unfreezed']);
}
-//¥À¥¦¥ó¥í¡¼¥É
-function attach_open($page,$file,$age=0)
+
+// ¥À¥¦¥ó¥í¡¼¥É
+function attach_open()
{
- global $_attach_messages;
-
- $obj = &new AttachFile($page,$file,$age);
-
- if (!$obj->exist)
- {
- return array('msg' => $_attach_messages['err_notfound']);
- }
-
- $obj->getstatus();
- $obj->status['count'][$age]++;
- $obj->putstatus();
-
- $type = attach_mime_content_type($obj->file);
- $name = htmlspecialchars($obj->file);
-
- // for japanese (???)
- if (function_exists('mb_convert_encoding'))
- {
- $name = mb_convert_encoding($name,'SJIS','auto');
+ global $vars, $_attach_messages;
+
+ foreach (array('refer', 'file', 'age') as $var) {
+ ${$var} = isset($vars[$var]) ? $vars[$var] : '';
}
-
- header('Content-Disposition: inline; filename="'.$name.'"');
- header('Content-Length: '.$obj->size);
- header('Content-Type: '.$type);
-
- @readfile($obj->filename);
- exit;
+
+ $obj = & new AttachFile($refer, $file, $age);
+ return $obj->getstatus() ?
+ $obj->open() :
+ array('msg'=>$_attach_messages['err_notfound']);
}
-//°ìÍ÷¼èÆÀ
+
+// °ìÍ÷¼èÆÀ
function attach_list()
{
- global $vars;
- global $_attach_messages;
-
- $refer = array_key_exists('refer',$vars) ? $vars['refer'] : '';
-
- $obj = &new AttachPages($refer);
-
- $msg = $_attach_messages[$refer == '' ? 'msg_listall' : 'msg_listpage'];
- $body = ($refer == '' or array_key_exists($refer,$obj->pages)) ?
- $obj->to_string($refer,FALSE) :
+ global $vars, $_attach_messages;
+
+ $refer = isset($vars['refer']) ? $vars['refer'] : '';
+
+ $obj = & new AttachPages($refer);
+
+ $msg = $_attach_messages[($refer == '') ? 'msg_listall' : 'msg_listpage'];
+ $body = ($refer == '' || isset($obj->pages[$refer])) ?
+ $obj->toString($refer, FALSE) :
$_attach_messages['err_noexist'];
- return array('msg'=>$msg,'body'=>$body);
+
+ return array('msg'=>$msg, 'body'=>$body);
}
-//¥¢¥Ã¥×¥í¡¼¥É¥Õ¥©¡¼¥à¤òɽ¼¨
+
+// ¥¢¥Ã¥×¥í¡¼¥É¥Õ¥©¡¼¥à¤òɽ¼¨ (action»þ)
function attach_showform()
{
- global $vars;
- global $_attach_messages;
-
- $vars['refer'] = $vars['page'];
- $body = ini_get('file_uploads') ? attach_form($vars['page']) : 'file_uploads disabled.';
-
- return array('msg'=>$_attach_messages['msg_upload'],'body'=>$body);
+ global $vars, $_attach_messages;
+
+ $page = isset($vars['page']) ? $vars['page'] : '';
+ $vars['refer'] = $page;
+ $body = attach_form($page);
+
+ return array('msg'=>$_attach_messages['msg_upload'], 'body'=>$body);
}
//-------- ¥µ¡¼¥Ó¥¹
-//mime-type¤Î·èÄê
+// mime-type¤Î·èÄê
function attach_mime_content_type($filename)
{
- $type = 'application/octet-stream'; //default
- $config = ':config/plugin/attach/mime-type';
-
- $size = getimagesize($filename);
- if (is_array($size))
- {
- switch ($size[2])
- {
- case 1:
- return 'image/gif';
- case 2:
- return 'image/jpeg';
- case 3:
- return 'image/png';
- case 4:
- return 'application/x-shockwave-flash';
+ $type = 'application/octet-stream'; // default
+
+ if (! file_exists($filename)) return $type;
+
+ $size = @getimagesize($filename);
+ if (is_array($size)) {
+ switch ($size[2]) {
+ case 1: return 'image/gif';
+ case 2: return 'image/jpeg';
+ case 3: return 'image/png';
+ case 4: return 'application/x-shockwave-flash';
}
}
-
- if (!is_page($config))
- {
- return $type;
- }
-
- if (!preg_match('/_([0-9A-Z]+)$/',$filename,$matches))
- {
+
+ $matches = array();
+ if (! preg_match('/_((?:[0-9A-F]{2})+)(?:\.\d+)?$/', $filename, $matches))
return $type;
- }
+
$filename = decode($matches[1]);
-
- foreach (get_source($config) as $line)
- {
- if (!preg_match('/\|(.+)\|/',$line,$matches))
- {
- continue;
- }
- $cells = explode('|',$matches[1]);
- $_type = trim($cells[0]);
- $exts = preg_split('/\s+|,/',trim($cells[1]),-1,PREG_SPLIT_NO_EMPTY);
-
- foreach ($exts as $ext)
- {
- if (preg_match("/\.$ext$/i",$filename))
- {
- return $_type;
- }
+
+ // mime-type°ìÍ÷ɽ¤ò¼èÆÀ
+ $config = new Config(PLUGIN_ATTACH_CONFIG_PAGE_MIME);
+ $table = $config->read() ? $config->get('mime-type') : array();
+ unset($config); // ¥á¥â¥êÀáÌó
+
+ foreach ($table as $row) {
+ $_type = trim($row[0]);
+ $exts = preg_split('/\s+|,/', trim($row[1]), -1, PREG_SPLIT_NO_EMPTY);
+ foreach ($exts as $ext) {
+ if (preg_match("/\.$ext$/i", $filename)) return $_type;
}
}
-
+
return $type;
}
-//¥¢¥Ã¥×¥í¡¼¥É¥Õ¥©¡¼¥à
+
+// ¥¢¥Ã¥×¥í¡¼¥É¥Õ¥©¡¼¥à¤Î½ÐÎÏ
function attach_form($page)
{
- global $script,$vars;
- global $_attach_messages;
-
+ global $script, $vars, $_attach_messages;
+
$r_page = rawurlencode($page);
$s_page = htmlspecialchars($page);
$navi = <<<EOD
</span><br />
EOD;
- if (!(bool)ini_get('file_uploads'))
- {
- return $navi;
- }
-
- $maxsize = MAX_FILESIZE;
- $msg_maxsize = sprintf($_attach_messages['msg_maxsize'],number_format($maxsize/1000)."KB");
+ if (! ini_get('file_uploads')) return '#attach(): file_uploads disabled<br />' . $navi;
+ if (! is_page($page)) return '#attach(): No such page<br />' . $navi;
+
+ $maxsize = PLUGIN_ATTACH_MAX_FILESIZE;
+ $msg_maxsize = sprintf($_attach_messages['msg_maxsize'], number_format($maxsize/1024) . 'KB');
$pass = '';
- if (ATTACH_PASSWORD_REQUIRE or ATTACH_UPLOAD_ADMIN_ONLY)
- {
- $title = $_attach_messages[ATTACH_UPLOAD_ADMIN_ONLY ? 'msg_adminpass' : 'msg_password'];
- $pass = '<br />'.$title.': <input type="password" name="pass" size="8" />';
+ if (PLUGIN_ATTACH_PASSWORD_REQUIRE || PLUGIN_ATTACH_UPLOAD_ADMIN_ONLY) {
+ $title = $_attach_messages[PLUGIN_ATTACH_UPLOAD_ADMIN_ONLY ? 'msg_adminpass' : 'msg_password'];
+ $pass = '<br />' . $title . ': <input type="password" name="pass" size="8" />';
}
return <<<EOD
<form enctype="multipart/form-data" action="$script" method="post">
<div>
<input type="hidden" name="plugin" value="attach" />
- <input type="hidden" name="pcmd" value="post" />
- <input type="hidden" name="refer" value="$s_page" />
+ <input type="hidden" name="pcmd" value="post" />
+ <input type="hidden" name="refer" value="$s_page" />
<input type="hidden" name="max_file_size" value="$maxsize" />
$navi
<span class="small">
$msg_maxsize
</span><br />
- {$_attach_messages['msg_file']}: <input type="file" name="attach_file" />
+ <label for="_p_attach_file">{$_attach_messages['msg_file']}:</label> <input type="file" name="attach_file" id="_p_attach_file" />
$pass
<input type="submit" value="{$_attach_messages['btn_upload']}" />
</div>
</form>
EOD;
}
+
//-------- ¥¯¥é¥¹
-//¥Õ¥¡¥¤¥ë
+// ¥Õ¥¡¥¤¥ë
class AttachFile
{
- var $page,$file,$age,$basename,$filename,$logname;
- var $time,$size,$time_str,$size_str;
- var $status = array('count'=>array(0),'age'=>'','pass'=>'','freeze'=>FALSE);
-
- function AttachFile($page,$file,$age=0)
+ var $page, $file, $age, $basename, $filename, $logname;
+ var $time = 0;
+ var $size = 0;
+ var $time_str = '';
+ var $size_str = '';
+ var $status = array('count'=>array(0), 'age'=>'', 'pass'=>'', 'freeze'=>FALSE);
+
+ function AttachFile($page, $file, $age = 0)
{
$this->page = $page;
- $this->file = $file;
- $this->age = $age;
-
- $this->basename = UPLOAD_DIR.encode($page).'_'.encode($file);
- $this->filename = $this->basename . ($age ? '.'.$age : '');
- $this->logname = $this->basename.'.log';
- $this->exist = file_exists($this->filename);
+ $this->file = preg_replace('#^.*/#','',$file);
+ $this->age = is_numeric($age) ? $age : 0;
+
+ $this->basename = UPLOAD_DIR . encode($page) . '_' . encode($this->file);
+ $this->filename = $this->basename . ($age ? '.' . $age : '');
+ $this->logname = $this->basename . '.log';
+ $this->exist = file_exists($this->filename);
+ $this->time = $this->exist ? filemtime($this->filename) - LOCALZONE : 0;
+ $this->md5hash = $this->exist ? md5_file($this->filename) : '';
}
+
// ¥Õ¥¡¥¤¥ë¾ðÊó¼èÆÀ
function getstatus()
{
+ if (! $this->exist) return FALSE;
+
// ¥í¥°¥Õ¥¡¥¤¥ë¼èÆÀ
- if (file_exists($this->logname))
- {
+ if (file_exists($this->logname)) {
$data = file($this->logname);
- foreach ($this->status as $key=>$value)
- {
+ foreach ($this->status as $key=>$value) {
$this->status[$key] = chop(array_shift($data));
}
- $this->status['count'] = explode(',',$this->status['count']);
+ $this->status['count'] = explode(',', $this->status['count']);
}
- $this->time = filemtime($this->filename) - LOCALZONE;
- $this->time_str = get_date('Y/m/d H:i:s',$this->time);
- $this->size = filesize($this->filename);
- $this->size_str = sprintf('%01.1f',round($this->size)/1000,1).'KB';
- }
- //¥¹¥Æ¡¼¥¿¥¹Êݸ
+ $this->time_str = get_date('Y/m/d H:i:s', $this->time);
+ $this->size = filesize($this->filename);
+ $this->size_str = sprintf('%01.1f', round($this->size/1024, 1)) . 'KB';
+ $this->type = attach_mime_content_type($this->filename);
+
+ return TRUE;
+ }
+
+ // ¥¹¥Æ¡¼¥¿¥¹Êݸ
function putstatus()
{
- $this->status['count'] = join(',',$this->status['count']);
- $fp = fopen($this->logname,'wb')
- or die_message('cannot write '.$this->logname);
- foreach ($this->status as $key=>$value)
- {
- fwrite($fp,$value."\n");
+ $this->status['count'] = join(',', $this->status['count']);
+ $fp = fopen($this->logname, 'wb') or
+ die_message('cannot write ' . $this->logname);
+ set_file_buffer($fp, 0);
+ flock($fp, LOCK_EX);
+ rewind($fp);
+ foreach ($this->status as $key=>$value) {
+ fwrite($fp, $value . "\n");
}
+ flock($fp, LOCK_UN);
fclose($fp);
}
- function datecomp($a,$b)
- {
- return ($a->filetime == $b->filetime) ? 0 : (($a->filetime > $b->filetime) ? -1 : 1);
+
+ // ÆüÉÕ¤ÎÈæ³Ó´Ø¿ô
+ function datecomp($a, $b) {
+ return ($a->time == $b->time) ? 0 : (($a->time > $b->time) ? -1 : 1);
}
- function to_string($showicon,$showinfo)
+
+ function toString($showicon, $showinfo)
{
- global $script,$date_format,$time_format,$weeklabels;
- global $_attach_messages;
-
+ global $script, $_attach_messages;
+
$this->getstatus();
- $param = '&file='.rawurlencode($this->file).'&refer='.rawurlencode($this->page).
- ($this->age ? '&age='.$this->age : '');
- $title = $this->time_str.' '.$this->size_str;
- $label = ($showicon ? FILE_ICON : '').htmlspecialchars($this->file);
- if ($this->age)
- {
- $label .= ' (backup No.'.$this->age.')';
+ $param = '&file=' . rawurlencode($this->file) . '&refer=' . rawurlencode($this->page) .
+ ($this->age ? '&age=' . $this->age : '');
+ $title = $this->time_str . ' ' . $this->size_str;
+ $label = ($showicon ? PLUGIN_ATTACH_FILE_ICON : '') . htmlspecialchars($this->file);
+ if ($this->age) {
+ $label .= ' (backup No.' . $this->age . ')';
}
$info = $count = '';
- if ($showinfo)
- {
- $_title = str_replace('$1',rawurlencode($this->file),$_attach_messages['msg_info']);
- $info = "\n<span class=\"small\">[<a href=\"$script?plugin=attach&pcmd=info$param\" title=\"$_title\">{$_attach_messages['btn_info']}</a>]</span>";
- $count = ($showicon and !empty($this->status['count'][$this->age])) ?
- sprintf($_attach_messages['msg_count'],$this->status['count'][$this->age]) : '';
+ if ($showinfo) {
+ $_title = str_replace('$1', rawurlencode($this->file), $_attach_messages['msg_info']);
+ $info = "\n<span class=\"small\">[<a href=\"$script?plugin=attach&pcmd=info$param\" title=\"$_title\">{$_attach_messages['btn_info']}</a>]</span>\n";
+ $count = ($showicon && ! empty($this->status['count'][$this->age])) ?
+ sprintf($_attach_messages['msg_count'], $this->status['count'][$this->age]) : '';
}
return "<a href=\"$script?plugin=attach&pcmd=open$param\" title=\"$title\">$label</a>$count$info";
}
+
+ // ¾ðÊóɽ¼¨
+ function info($err)
+ {
+ global $script, $_attach_messages;
+
+ $r_page = rawurlencode($this->page);
+ $s_page = htmlspecialchars($this->page);
+ $s_file = htmlspecialchars($this->file);
+ $s_err = ($err == '') ? '' : '<p style="font-weight:bold">' . $_attach_messages[$err] . '</p>';
+
+ if ($this->age) {
+ $msg_freezed = '';
+ $msg_delete = '<input type="radio" name="pcmd" id="_p_attach_delete" value="delete" />' .
+ '<label for="_p_attach_delete">' . $_attach_messages['msg_delete'] .
+ $_attach_messages['msg_require'] . '</label><br />';
+ $msg_freeze = '';
+ } else {
+ if ($this->status['freeze']) {
+ $msg_freezed = "<dd>{$_attach_messages['msg_isfreeze']}</dd>";
+ $msg_delete = '';
+ $msg_freeze = '<input type="radio" name="pcmd" id="_p_attach_unfreeze" value="unfreeze" />' .
+ '<label for="_p_attach_unfreeze">' . $_attach_messages['msg_unfreeze'] .
+ $_attach_messages['msg_require'] . '</label><br />';
+ } else {
+ $msg_freezed = '';
+ $msg_delete = '<input type="radio" name="pcmd" id="_p_attach_delete" value="delete" />' .
+ '<label for="_p_attach_delete">' . $_attach_messages['msg_delete'];
+ if (PLUGIN_ATTACH_DELETE_ADMIN_ONLY || $this->age)
+ $msg_delete .= $_attach_messages['msg_require'];
+ $msg_delete .= '</label><br />';
+ $msg_freeze = '<input type="radio" name="pcmd" id="_p_attach_freeze" value="freeze" />' .
+ '<label for="_p_attach_freeze">' . $_attach_messages['msg_freeze'] .
+ $_attach_messages['msg_require'] . '</label><br />';
+ }
+ }
+ $info = $this->toString(TRUE, FALSE);
+
+ $retval = array('msg'=>sprintf($_attach_messages['msg_info'], htmlspecialchars($this->file)));
+ $retval['body'] = <<< EOD
+<p class="small">
+ [<a href="$script?plugin=attach&pcmd=list&refer=$r_page">{$_attach_messages['msg_list']}</a>]
+ [<a href="$script?plugin=attach&pcmd=list">{$_attach_messages['msg_listall']}</a>]
+</p>
+<dl>
+ <dt>$info</dt>
+ <dd>{$_attach_messages['msg_page']}:$s_page</dd>
+ <dd>{$_attach_messages['msg_filename']}:{$this->filename}</dd>
+ <dd>{$_attach_messages['msg_md5hash']}:{$this->md5hash}</dd>
+ <dd>{$_attach_messages['msg_filesize']}:{$this->size_str} ({$this->size} bytes)</dd>
+ <dd>Content-type:{$this->type}</dd>
+ <dd>{$_attach_messages['msg_date']}:{$this->time_str}</dd>
+ <dd>{$_attach_messages['msg_dlcount']}:{$this->status['count'][$this->age]}</dd>
+ $msg_freezed
+</dl>
+<hr />
+$s_err
+<form action="$script" method="post">
+ <div>
+ <input type="hidden" name="plugin" value="attach" />
+ <input type="hidden" name="refer" value="$s_page" />
+ <input type="hidden" name="file" value="$s_file" />
+ <input type="hidden" name="age" value="{$this->age}" />
+ $msg_delete
+ $msg_freeze
+ <label for="_p_attach_password">{$_attach_messages['msg_password']}:</label>
+ <input type="password" name="pass" id="_p_attach_password" size="8" />
+ <input type="submit" value="{$_attach_messages['btn_submit']}" />
+ </div>
+</form>
+EOD;
+ return $retval;
+ }
+
+ function delete($pass)
+ {
+ global $_attach_messages, $notify, $notify_subject;
+
+ if ($this->status['freeze']) return attach_info('msg_isfreeze');
+
+ if (! pkwk_login($pass)) {
+ if (PLUGIN_ATTACH_DELETE_ADMIN_ONLY || $this->age) {
+ return attach_info('err_adminpass');
+ } else if (PLUGIN_ATTACH_PASSWORD_REQUIRE &&
+ md5($pass) != $this->status['pass']) {
+ return attach_info('err_password');
+ }
+ }
+
+ // ¥Ð¥Ã¥¯¥¢¥Ã¥×
+ if ($this->age ||
+ (PLUGIN_ATTACH_DELETE_ADMIN_ONLY && PLUGIN_ATTACH_DELETE_ADMIN_NOBACKUP)) {
+ @unlink($this->filename);
+ } else {
+ do {
+ $age = ++$this->status['age'];
+ } while (file_exists($this->basename . '.' . $age));
+
+ if (! rename($this->basename,$this->basename . '.' . $age)) {
+ // ºï½ü¼ºÇÔ why?
+ return array('msg'=>$_attach_messages['err_delete']);
+ }
+
+ $this->status['count'][$age] = $this->status['count'][0];
+ $this->status['count'][0] = 0;
+ $this->putstatus();
+ }
+
+ if (is_page($this->page))
+ touch(get_filename($this->page));
+
+ if ($notify) {
+ $footer['ACTION'] = 'File deleted';
+ $footer['FILENAME'] = & $this->file;
+ $footer['PAGE'] = & $this->page;
+ $footer['URI'] = get_script_uri() .
+ '?' . rawurlencode($this->page);
+ $footer['USER_AGENT'] = TRUE;
+ $footer['REMOTE_ADDR'] = TRUE;
+ pkwk_mail_notify($notify_subject, "\n", $footer) or
+ die('pkwk_mail_notify(): Failed');
+ }
+
+ return array('msg'=>$_attach_messages['msg_deleted']);
+ }
+
+ function freeze($freeze, $pass)
+ {
+ global $_attach_messages;
+
+ if (! pkwk_login($pass)) return attach_info('err_adminpass');
+
+ $this->getstatus();
+ $this->status['freeze'] = $freeze;
+ $this->putstatus();
+
+ return array('msg'=>$_attach_messages[$freeze ? 'msg_freezed' : 'msg_unfreezed']);
+ }
+
+ function open()
+ {
+ $this->getstatus();
+ $this->status['count'][$this->age]++;
+ $this->putstatus();
+ $filename = $this->file;
+
+ // Care for Japanese-character-included file name
+ if (LANG == 'ja') {
+ switch(UA_NAME . '/' . UA_PROFILE){
+ case 'Opera/default':
+ // Care for using _auto-encode-detecting_ function
+ $filename = mb_convert_encoding($filename, 'UTF-8', 'auto');
+ break;
+ case 'MSIE/default':
+ $filename = mb_convert_encoding($filename, 'SJIS', 'auto');
+ break;
+ }
+ }
+ $filename = htmlspecialchars($filename);
+
+ ini_set('default_charset', '');
+ mb_http_output('pass');
+
+ pkwk_common_headers();
+ header('Content-Disposition: inline; filename="' . $filename . '"');
+ header('Content-Length: ' . $this->size);
+ header('Content-Type: ' . $this->type);
+
+ @readfile($this->filename);
+ exit;
+ }
}
// ¥Õ¥¡¥¤¥ë¥³¥ó¥Æ¥Ê
{
var $page;
var $files = array();
-
+
function AttachFiles($page)
{
$this->page = $page;
}
- function add($file,$age)
+
+ function add($file, $age)
{
- $this->files[$file][$age] = &new AttachFile($this->page,$file,$age);
+ $this->files[$file][$age] = & new AttachFile($this->page, $file, $age);
}
+
// ¥Õ¥¡¥¤¥ë°ìÍ÷¤ò¼èÆÀ
- function to_string($flat)
+ function toString($flat)
{
- if ($flat)
- {
+ global $_title_cannotread;
+
+ if (! check_readable($this->page, FALSE, FALSE)) {
+ return str_replace('$1', make_pagelink($this->page), $_title_cannotread);
+ } else if ($flat) {
return $this->to_flat();
- }
+ }
+
$ret = '';
$files = array_keys($this->files);
sort($files);
- foreach ($files as $file)
- {
+
+ foreach ($files as $file) {
$_files = array();
- foreach (array_keys($this->files[$file]) as $age)
- {
- $_files[$age] = $this->files[$file][$age]->to_string(FALSE,TRUE);
+ foreach (array_keys($this->files[$file]) as $age) {
+ $_files[$age] = $this->files[$file][$age]->toString(FALSE, TRUE);
}
- if (!array_key_exists(0,$_files))
- {
+ if (! isset($_files[0])) {
$_files[0] = htmlspecialchars($file);
}
ksort($_files);
$_file = $_files[0];
unset($_files[0]);
$ret .= " <li>$_file\n";
- if (count($_files))
- {
- $ret .= "<ul>\n<li>".join("</li>\n<li>",$_files)."</li>\n</ul>\n";
+ if (count($_files)) {
+ $ret .= "<ul>\n<li>" . join("</li>\n<li>", $_files) . "</li>\n</ul>\n";
}
$ret .= " </li>\n";
}
- return make_pagelink($this->page)."\n<ul>\n$ret</ul>\n";
+ return make_pagelink($this->page) . "\n<ul>\n$ret</ul>\n";
}
+
// ¥Õ¥¡¥¤¥ë°ìÍ÷¤ò¼èÆÀ(inline)
function to_flat()
{
$ret = '';
$files = array();
- foreach (array_keys($this->files) as $file)
- {
- if (array_key_exists(0,$this->files[$file]))
- {
- $files[$file] = &$this->files[$file][0];
+ foreach (array_keys($this->files) as $file) {
+ if (isset($this->files[$file][0])) {
+ $files[$file] = & $this->files[$file][0];
}
}
- uasort($files,array('AttachFile','datecomp'));
- foreach (array_keys($files) as $file)
- {
- $ret .= $files[$file]->to_string(TRUE,TRUE).' ';
+ uasort($files, array('AttachFile', 'datecomp'));
+ foreach (array_keys($files) as $file) {
+ $ret .= $files[$file]->toString(TRUE, TRUE) . ' ';
}
-
+
return $ret;
}
}
+
// ¥Ú¡¼¥¸¥³¥ó¥Æ¥Ê
class AttachPages
{
var $pages = array();
-
- function AttachPages($page='',$age=NULL)
+
+ function AttachPages($page = '', $age = NULL)
{
- $dir = opendir(UPLOAD_DIR)
- or die('directory '.UPLOAD_DIR.' is not exist or not readable.');
-
- $page_pattern = ($page == '') ? '[0-9A-F]+' : preg_quote(encode($page),'/');
+ $dir = opendir(UPLOAD_DIR) or
+ die('directory ' . UPLOAD_DIR . ' is not exist or not readable.');
+
+ $page_pattern = ($page == '') ? '(?:[0-9A-F]{2})+' : preg_quote(encode($page), '/');
$age_pattern = ($age === NULL) ?
'(?:\.([0-9]+))?' : ($age ? "\.($age)" : '');
- $pattern = "/^({$page_pattern})_([0-9A-F]+){$age_pattern}$/";
-
- while ($file = readdir($dir))
- {
- if (!preg_match($pattern,$file,$matches))
- {
+ $pattern = "/^({$page_pattern})_((?:[0-9A-F]{2})+){$age_pattern}$/";
+
+ $matches = array();
+ while ($file = readdir($dir)) {
+ if (! preg_match($pattern, $file, $matches))
continue;
- }
+
$_page = decode($matches[1]);
$_file = decode($matches[2]);
- $_age = array_key_exists(3,$matches) ? $matches[3] : 0;
- if (!array_key_exists($_page,$this->pages))
- {
- $this->pages[$_page] = &new AttachFiles($_page);
+ $_age = isset($matches[3]) ? $matches[3] : 0;
+ if (! isset($this->pages[$_page])) {
+ $this->pages[$_page] = & new AttachFiles($_page);
}
- $this->pages[$_page]->add($_file,$_age);
+ $this->pages[$_page]->add($_file, $_age);
}
closedir($dir);
}
- function to_string($page='',$flat=FALSE)
+
+ function toString($page = '', $flat = FALSE)
{
- if ($page != '')
- {
- if (!array_key_exists($page,$this->pages))
- {
+ if ($page != '') {
+ if (! isset($this->pages[$page])) {
return '';
+ } else {
+ return $this->pages[$page]->toString($flat);
}
- return $this->pages[$page]->to_string($flat);
}
$ret = '';
+
$pages = array_keys($this->pages);
sort($pages);
- foreach ($pages as $page)
- {
- $ret .= '<li>'.$this->pages[$page]->to_string($flat)."</li>\n";
+
+ foreach ($pages as $page) {
+ if (check_non_list($page)) continue;
+ $ret .= '<li>' . $this->pages[$page]->toString($flat) . '</li>' . "\n";
}
- return "\n<ul>\n".$ret."</ul>\n";
-
+ return "\n" . '<ul>' . "\n" . $ret . '</ul>' . "\n";
}
-}
+}
?>