-<?
-// ¥×¥é¥°¥¤¥ó attach
+<?php
+/////////////////////////////////////////////////
+// PukiWiki - Yet another WikiWikiWeb clone.
+//
+// $Id: attach.inc.php,v 1.60 2004/08/15 00:19:35 henoheno Exp $
+//
-// changed by Y.MASUI <masui@hisec.co.jp> http://masui.net/pukiwiki/
-// $Id: attach.inc.php,v 1.5 2002/07/01 07:08:57 masui Exp $
+/*
+ ¥×¥é¥°¥¤¥ó attach
-// set PHP value to enable file upload
-ini_set("file_uploads","1");
+ changed by Y.MASUI <masui@hisec.co.jp> http://masui.net/pukiwiki/
+ modified by PANDA <panda@arino.jp> http://home.arino.jp/
+*/
-// upload dir(must set end of /)
-define("UPLOAD_DIR","./attach/");
+// 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 PukiWikiX_FILESIZE
+define('MAX_FILESIZE', (1024 * 1024)); // default: 1MB
-// max file size for upload on script of PukiWiki(default 1MB)
-define("MAX_FILESIZE",1000000);
+// ´ÉÍý¼Ô¤À¤±¤¬ÅºÉÕ¥Õ¥¡¥¤¥ë¤ò¥¢¥Ã¥×¥í¡¼¥É¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë
+define('ATTACH_UPLOAD_ADMIN_ONLY', FALSE); // FALSE or TRUE
+
+// ´ÉÍý¼Ô¤À¤±¤¬ÅºÉÕ¥Õ¥¡¥¤¥ë¤òºï½ü¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë
+define('ATTACH_DELETE_ADMIN_ONLY', FALSE); // FALSE or TRUE
+
+// ´ÉÍý¼Ô¤¬ÅºÉÕ¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë¤È¤¤Ï¡¢¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºî¤é¤Ê¤¤
+// ATTACH_DELETE_ADMIN_ONLY=TRUE¤Î¤È¤Í¸ú
+define('ATTACH_DELETE_ADMIN_NOBACKUP', FALSE); // FALSE or TRUE
+
+// ¥¢¥Ã¥×¥í¡¼¥É/ºï½ü»þ¤Ë¥Ñ¥¹¥ï¡¼¥É¤òÍ׵᤹¤ë(ADMIN_ONLY¤¬Í¥Àè)
+define('ATTACH_PASSWORD_REQUIRE', FALSE); // FALSE or TRUE
+
+// ¥Õ¥¡¥¤¥ë¤Î¥¢¥¯¥»¥¹¸¢
+define('ATTACH_FILE_MODE', 0644);
+//define('ATTACH_FILE_MODE', 0604); // for XREA.COM
// file icon image
-define("FILE_ICON","<img src=\"./image/file.gif\" width=\"20\" height=\"20\" alt=\"file\" style=\"border-width:0px\">");
+if (! defined('FILE_ICON')) {
+ define('FILE_ICON', '<img src="' . IMAGE_DIR . 'file.png"' .
+ ' width="20" height="20" alt="file"' .
+ ' style="border-width:0px" />');
+}
+
+// mime-type¤òµ½Ò¤·¤¿¥Ú¡¼¥¸
+define('ATTACH_CONFIG_PAGE_MIME', 'plugin/attach/mime-type');
+//-------- convert
function plugin_attach_convert()
{
- global $script,$vars,$max_size;
- global $_msg_attach_filelist,$_msg_maxsize,$_msg_delete,$_btn_upload,$_btn_delete,$_msg_attachfile;
-
- $ret = "";
- $decoded_pgname = encode($vars["page"]);
-
- $icon = FILE_ICON;
-
- if ($dir = @opendir(UPLOAD_DIR))
- {
- while($file = readdir($dir))
- {
- if($file == ".." || $file == ".") continue;
- if(!preg_match("/^${decoded_pgname}_([^.]+)$/",$file,$match)) continue;
-
- $lastmod = date("Y/m/d H:i:s",filemtime(UPLOAD_DIR.$file));
-
- settype($dfile_size,"double");
- $dfile_size = round(filesize(UPLOAD_DIR.$file)/1000,1);
- if($dfile_size == 0) $dfile_size = 0.1;
- $file_size = sprintf("%01.1f",$dfile_size)."KB";
-
- $filename = decode($match[1]);
- $filename_url = rawurlencode($filename);
- $refername_url = rawurlencode($vars[page]);
-
- $counter = '';
- if(file_exists(UPLOAD_DIR.$file.'.log')) {
- $list = file(UPLOAD_DIR.$file.'.log');
-
- $counter = ' <span class="small>"' . chop($list[0]) . '·ï</span>';
- }
-
- $del = "[<a href=\"$script?plugin=attach&mode=confirm&delfile=${filename_url}&refer=${refername_url}\" title=\"".str_replace('$1',$filename,$_msg_delete)."\">$_btn_delete</a>]";
- $open = "<a href=\"$script?plugin=attach&openfile=${filename_url}&refer=${refername_url}\" title=\"$lastmod $file_size\">$icon$filename</a>$counter\n";
-
- $into = "$open <span class=\"small\">$del</span>";
-
- $attach_files[$lastmod] = $into;
+ global $vars;
+
+ $page = isset($vars['page']) ? $vars['page'] : '';
+
+ $nolist = $noform = FALSE;
+ if (func_num_args() > 0) {
+ foreach (func_get_args() as $arg) {
+ $arg = strtolower($arg);
+ $nolist |= ($arg == 'nolist');
+ $noform |= ($arg == 'noform');
}
- closedir($dir);
- @krsort($attach_files);
- }
-
- $max_size = number_format(MAX_FILESIZE/1000);
- $max_size.= "KB";
-
- $args = func_get_args();
-
- if(is_array($attach_files))
- {
- if($args[0]===FALSE) $ret.= "$_msg_attachfile: ";
- $ret.= join("\n ",$attach_files)."\n";
}
-
- if($args[0]!==FALSE)
- {
- $ret.= "<br />\n";
-
- $ret.= "<form enctype=\"multipart/form-data\" action=\"$script\" method=\"post\">\n";
- $ret.= "<div>\n";
- $ret.= "<input type=\"hidden\" name=\"plugin\" value=\"attach\" />\n";
- $ret.= "<input type=\"hidden\" name=\"refer\" value=\"$vars[page]\">\n";
- $ret.= "<input type=\"hidden\" name=\"max_file_size\" value=\"".MAX_FILESIZE."\" />\n";
- $ret.= "<span class=\"small\">[<a href=\"$script?plugin=attach&pcmd=list\">$_msg_attach_filelist</a>]</span><br />\n";
- $ret.= "<span class=\"small\">".str_replace('$1',$max_size,$_msg_maxsize)."</span><br />\n";
- $ret.= "$_msg_attachfile: <input type=\"file\" name=\"attach_file\" />\n";
- $ret.= "<input type=\"submit\" value=\"$_btn_upload\" /><br />\n";
- $ret.= "</div>\n";
- $ret.= "</form>\n";
- }
-
+
+ $ret = '';
+ if (! $nolist) {
+ $obj = & new AttachPages($page);
+ $ret .= $obj->toString($page, TRUE);
+ }
+ if (! $noform) {
+ $ret .= attach_form($page);
+ }
+
return $ret;
}
+
+//-------- action
function plugin_attach_action()
{
- global $vars,$script,$max_size,$HTTP_POST_FILES;
- global $_title_uploaded,$_title_file_deleted,$_title_notfound,$_msg_noparm,$_msg_already_exists,$_msg_attach_filelist,$_msg_delete,$_msg_exceed,$_btn_delete;
- global $_msg_maxsize,$_btn_upload,$_msg_attachfile,$_title_upload,$_title_confirm_delete,$_msg_confirm_delete;
-
- $postfiles = $HTTP_POST_FILES;
- $icon = FILE_ICON;
-
- $vars["mode"] = rawurldecode($vars["mode"]);
- $vars["openfile"] = rawurldecode($vars["openfile"]);
- $vars["delfile"] = rawurldecode($vars["delfile"]);
- $vars["refer"] = rawurldecode($vars["refer"]);
-
- if(is_uploaded_file($postfiles["attach_file"]["tmp_name"]))
+ global $vars, $_attach_messages;
+
+ // Backward compatible
+ if (isset($vars['openfile'])) {
+ $vars['file'] = $vars['openfile'];
+ $vars['pcmd'] = 'open';
+ }
+ if (isset($vars['delfile'])) {
+ $vars['file'] = $vars['delfile'];
+ $vars['pcmd'] = 'delete';
+ }
+
+ $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);
+ }
+ }
+
+ // Dispatch
+ if (isset($_FILES['attach_file'])) {
+ // Upload
+ return attach_upload($_FILES['attach_file'], $refer, $pass);
+ }
+ 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();
+ }
+}
+
+//-------- call from skin
+function attach_filelist()
+{
+ global $vars, $_attach_messages;
+
+ $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";
+ }
+}
+
+//-------- ¼ÂÂÎ
+// ¥Õ¥¡¥¤¥ë¥¢¥Ã¥×¥í¡¼¥É
+// $pass = NULL : ¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤
+// $pass = TRUE : ¥¢¥Ã¥×¥í¡¼¥Éµö²Ä
+function attach_upload($file, $page, $pass = NULL)
+{
+ global $_attach_messages;
+
+ 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'] > 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 (ATTACH_UPLOAD_ADMIN_ONLY && $pass !== TRUE &&
+ ($pass === NULL || ! pkwk_login($pass))) {
+ return array(
+ 'result'=>FALSE,
+ 'msg'=>$_attach_messages['err_adminpass']);
+ }
+
+ $obj = & new AttachFile($page, $file['name']);
+ if ($obj->exist) {
+ return array('result'=>FALSE,
+ 'msg'=>$_attach_messages['err_exists']);
+ }
+
+ if (move_uploaded_file($file['tmp_name'], $obj->filename)) {
+ chmod($obj->filename, ATTACH_FILE_MODE);
+ }
+
+ if (is_page($page)) {
+ touch(get_filename($page));
+ }
+
+ $obj->getstatus();
+ $obj->status['pass'] = ($pass !== TRUE && $pass !== NULL) ? md5($pass) : '';
+ $obj->putstatus();
+
+ 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, $_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']);
+ } else {
+ $obj = & new AttachFile($refer, $file, $age);
+ return $obj->getstatus() ?
+ $obj->delete($pass) :
+ array('msg'=>$_attach_messages['err_notfound']);
+ }
+}
+
+// Åà·ë
+function attach_freeze($freeze)
+{
+ 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']);
+ } else {
+ $obj = & new AttachFile($refer, $file, $age);
+ return $obj->getstatus() ?
+ $obj->freeze($freeze, $pass) :
+ array('msg'=>$_attach_messages['err_notfound']);
+ }
+}
+
+// ¥À¥¦¥ó¥í¡¼¥É
+function attach_open()
+{
+ 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->open() :
+ array('msg'=>$_attach_messages['err_notfound']);
+}
+
+// °ìÍ÷¼èÆÀ
+function attach_list()
+{
+ 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);
+}
+
+// ¥¢¥Ã¥×¥í¡¼¥É¥Õ¥©¡¼¥à¤òɽ¼¨ (action»þ)
+function attach_showform()
+{
+ 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¤Î·èÄê
+function attach_mime_content_type($filename)
+{
+ $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';
+ }
+ }
+
+ $matches = array();
+ if (! preg_match('/_((?:[0-9A-F]{2})+)(?:\.\d+)?$/', $filename, $matches))
+ return $type;
+
+ $filename = decode($matches[1]);
+
+ // mime-type°ìÍ÷ɽ¤ò¼èÆÀ
+ $config = new Config(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, $_attach_messages;
+
+ $r_page = rawurlencode($page);
+ $s_page = htmlspecialchars($page);
+ $navi = <<<EOD
+ <span 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>]
+ </span><br />
+EOD;
+
+ if (! ini_get('file_uploads')) return '#attach(): file_uploads disabled<br />' . $navi;
+ if (! is_page($page)) return '#attach(): No such page<br />' . $navi;
+
+ $maxsize = MAX_FILESIZE;
+ $msg_maxsize = sprintf($_attach_messages['msg_maxsize'], number_format($maxsize/1024) . 'KB');
+
+ $pass = '';
+ if (ATTACH_PASSWORD_REQUIRE || 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" />';
+ }
+ 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="max_file_size" value="$maxsize" />
+ $navi
+ <span class="small">
+ $msg_maxsize
+ </span><br />
+ {$_attach_messages['msg_file']}: <input type="file" name="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 = 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)
{
- if($postfiles["attach_file"]["size"] > MAX_FILESIZE) return array("msg" => $_msg_exceed);
- if(is_freeze($vars["refer"]) || !is_editable($vars["refer"])) return array("msg" => $_msg_noparm);
-
- $filename = encode($vars["refer"])."_".encode($postfiles["attach_file"]["name"]);
-
- if(file_exists(UPLOAD_DIR.$filename)) return array("msg" => $_msg_already_exists);
-
- move_uploaded_file($postfiles["attach_file"]["tmp_name"],UPLOAD_DIR.$filename);
-
- if(file_exists(DATA_DIR.encode($vars["refer"]).".txt"))
- @touch(DATA_DIR.encode($vars["refer"]).".txt");
-
- return array("msg" => $_title_uploaded);
- }
- else if($vars["delfile"])
+ $this->page = $page;
+ $this->file = basename($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($vars["mode"] == "confirm") {
- $form = "<form action=\"$script\" method=\"post\">\n";
- $form .= "<div>\n";
- $form .= "<input type=\"hidden\" name=\"plugin\" value=\"attach\" />\n";
- $form .= "<input type=\"hidden\" name=\"refer\" value=\"$vars[refer]\" />\n";
- $form .= "<input type=\"hidden\" name=\"delfile\" value=\"$vars[delfile]\" />\n";
- $form .= "<input type=\"submit\" value=\"$_btn_delete\" />\n";
- $form .= "</div>\n";
- $form .= "</form>";
-
- $retvars["body"] = sprintf($_msg_confirm_delete,$vars["delfile"],$form);
- $retvars["msg"] = sprintf($_title_confirm_delete,$vars["delfile"]);
- return $retvars;
+ if (! $this->exist) return FALSE;
+
+ // ¥í¥°¥Õ¥¡¥¤¥ë¼èÆÀ
+ if (file_exists($this->logname)) {
+ $data = file($this->logname);
+ foreach ($this->status as $key=>$value) {
+ $this->status[$key] = chop(array_shift($data));
+ }
+ $this->status['count'] = explode(',', $this->status['count']);
}
- else {
- $filename = encode($vars["refer"])."_".encode($vars["delfile"]);
- if(is_freeze($vars["refer"]) || !is_editable($vars["refer"])) return array("msg" => $_msg_noparm);
-
- if(!file_exists(UPLOAD_DIR.$filename))
- return array("msg" => $_title_notfound);
-
- @unlink(UPLOAD_DIR.$filename);
-
- if(file_exists(DATA_DIR.encode($vars["refer"]).".txt"))
- @touch(DATA_DIR.encode($vars["refer"]).".txt");
-
- return array("msg" => $_title_file_deleted);
+ $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);
+ 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->time == $b->time) ? 0 : (($a->time > $b->time) ? -1 : 1);
}
- else if($vars["openfile"])
+
+ function toString($showicon, $showinfo)
{
- $filename = encode($vars["refer"])."_".encode($vars["openfile"]);
-
- if(!file_exists(UPLOAD_DIR.$filename))
- return array("msg" => $_title_notfound);
-
- download_file(UPLOAD_DIR.$filename,$vars["openfile"]);
+ global $script, $_attach_messages;
- die();
+ $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 . ')';
+ }
+ $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><br />\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";
}
- else if($vars["pcmd"] == "list")
+
+ // ¾ðÊóɽ¼¨
+ function info($err)
{
- if ($dir = @opendir(UPLOAD_DIR))
- {
- $pgname_keep = "";
- $retbody = "";
- $aryret = array();
- $pagenames = array();
- while($file = readdir($dir))
- {
- if($file == ".." || $file == "." || strstr($file,".log")!=FALSE) continue;
-
- settype($dfile_size,"double");
- $dfile_size = round(filesize(UPLOAD_DIR.$file)/1000,1);
- if($dfile_size == 0) $dfile_size = 0.1;
- $file_size = sprintf("%01.1f",$dfile_size)."KB";
-
- preg_match("/^([^_]+)_([^_]+)$/",$file,$match);
-
- $pagename = decode($match[1]);
- $pagename_url = rawurlencode($pagename);
- $filename = decode($match[2]);
- $filename_url = rawurlencode($filename);
- $passage = get_pg_passage($pagename);
-
- $pagename = strip_bracket($pagename);
- $pagenames[$pagename] = "<li><a href=\"$script?${pagename_url}\">$pagename</a>$passage</li>\n";
-
- $lastmod = date("Y/m/d H:i:s",filemtime(UPLOAD_DIR.$file));
-
- $del = "[<a href=\"$script?plugin=attach&mode=confirm&delfile=${filename_url}&refer=${pagename_url}\" title=\"".str_replace('$1',$filename,$_msg_delete)."\">$_btn_delete</a>]";
-
- $open = "<a href=\"$script?plugin=attach&openfile=${filename_url}&refer=${pagename_url}\" title=\"$lastmod $file_size\">$filename</a>";
-
- $aryret[$pagename] .= "<li>$open <span class=\"small\">$del</span></li>\n";
+ 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" value="delete" />' .
+ $_attach_messages['msg_delete'] .
+ $_attach_messages['msg_require'] . '<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" value="unfreeze" />' .
+ $_attach_messages['msg_unfreeze'] .
+ $_attach_messages['msg_require'] . '<br />';
+ } else {
+ $msg_freezed = '';
+ $msg_delete = '<input type="radio" name="pcmd" value="delete" />' .
+ $_attach_messages['msg_delete'];
+ if (ATTACH_DELETE_ADMIN_ONLY || $this->age) {
+ $msg_delete .= $_attach_messages['msg_require'];
+ }
+ $msg_delete .= '<br />';
+ $msg_freeze = '<input type="radio" name="pcmd" value="freeze" />' .
+ $_attach_messages['msg_freeze'] .
+ $_attach_messages['msg_require'] . '<br />';
}
- closedir($dir);
- ksort($aryret);
- $retbody = '';
- foreach($aryret as $pagename => $list) {
- $retbody .= $pagenames[$pagename] . "<ul>\n" . $list . "</ul>\n";
+ }
+ $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
+ {$_attach_messages['msg_password']}: <input type="password" name="pass" size="8" />
+ <input type="submit" value="{$_attach_messages['btn_submit']}" />
+ </div>
+</form>
+EOD;
+ return $retval;
+ }
+
+ function delete($pass)
+ {
+ global $_attach_messages;
+
+ if ($this->status['freeze']) return attach_info('msg_isfreeze');
+
+ if (! pkwk_login($pass)) {
+ if (ATTACH_DELETE_ADMIN_ONLY || $this->age) {
+ return attach_info('err_adminpass');
+ } else if (ATTACH_PASSWORD_REQUIRE &&
+ md5($pass) != $this->status['pass']) {
+ return attach_info('err_password');
}
}
-
- $retvars["msg"] = $_msg_attach_filelist;
- $retvars["body"] = "<ul>\n".$retbody."</ul>\n";
- if($retbody) $retvars["body"] .= "</ul>\n";
-
- return $retvars;
- }
- else if($vars["pcmd"] == "upload" && $vars["page"])
+
+ // ¥Ð¥Ã¥¯¥¢¥Ã¥×
+ if ($this->age ||
+ (ATTACH_DELETE_ADMIN_ONLY && 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));
+ }
+
+ return array('msg'=>$_attach_messages['msg_deleted']);
+ }
+
+ function freeze($freeze, $pass)
{
- $vars["refer"] = $vars["page"];
-
- $max_size = number_format(MAX_FILESIZE/1000);
- $max_size.= "KB";
-
- $ret.= "<form enctype=\"multipart/form-data\" action=\"$script\" method=\"post\">\n";
- $ret.= "<blockquote>\n";
- $ret.= "<input type=\"hidden\" name=\"plugin\" value=\"attach\" />\n";
- $ret.= "<input type=\"hidden\" name=\"refer\" value=\"$vars[page]\" />\n";
- $ret.= "<input type=\"hidden\" name=\"max_file_size\" value=\"".MAX_FILESIZE."\" />\n";
- $ret.= "<span class=\"small\">[<a href=\"$script?plugin=attach&pcmd=list\">$_msg_attach_filelist</a>]</span><br />\n";
- $ret.= "<span class=\"small\">".str_replace('$1',$max_size,$_msg_maxsize)."</span><br />\n";
- $ret.= "$_msg_attachfile: <input type=\"file\" name=\"attach_file\" />\n";
- $ret.= "<input type=\"submit\" value=\"$_btn_upload\" /><br />\n";
- $ret.= "</blockquote>\n";
- $ret.= "</form>\n";
-
- $retvars["msg"] = $_title_upload;
- $retvars["body"] = $ret;
-
- return $retvars;
+ 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();
+
+ // for Japanese (???)
+ $filename = htmlspecialchars(mb_convert_encoding($this->file,'SJIS','auto'));
+
+ ini_set('default_charset', '');
+ mb_http_output('pass');
+
+ header('Content-Disposition: inline; filename="' . $filename . '"');
+ header('Content-Length: ' . $this->size);
+ header('Content-Type: ' . $this->type);
+ @readfile($this->filename);
+ exit;
}
}
-function attach_filelist()
+// ¥Õ¥¡¥¤¥ë¥³¥ó¥Æ¥Ê
+class AttachFiles
{
- return plugin_attach_convert(FALSE);
+ var $page;
+ var $files = array();
+
+ function AttachFiles($page)
+ {
+ $this->page = $page;
+ }
+
+ function add($file, $age)
+ {
+ $this->files[$file][$age] = & new AttachFile($this->page, $file, $age);
+ }
+
+ // ¥Õ¥¡¥¤¥ë°ìÍ÷¤ò¼èÆÀ
+ function toString($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) {
+ $_files = array();
+ foreach (array_keys($this->files[$file]) as $age) {
+ $_files[$age] = $this->files[$file][$age]->toString(FALSE, TRUE);
+ }
+ 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";
+ }
+ $ret .= " </li>\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 (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]->toString(TRUE, TRUE) . ' ';
+ }
+
+ return $ret;
+ }
}
-function download_file($path_file,$filename)
+// ¥Ú¡¼¥¸¥³¥ó¥Æ¥Ê
+class AttachPages
{
- $content_length = filesize($path_file);
-
- $list = array(1);
- if(file_exists($path_file.'.log')) {
- $list = file($path_file.'.log');
- $list[0] = chop($list[0]) + 1;
- }
- $fp = fopen($path_file.'.log','w');
- foreach ($list as $l) {
- fputs($fp,$l);
- }
- fclose($fp);
-
- // for japanese
- if(function_exists("mb_convert_encoding"))
- $filename = mb_convert_encoding($filename,"SJIS","auto");
-
- header("Content-Disposition: inline; filename=\"$filename\"");
- header("Content-Length: ".$content_length);
- header("Content-Type: application/octet-stream");
-
- @readfile($path_file);
-}
+ var $pages = array();
+ 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]{2})+' : preg_quote(encode($page), '/');
+ $age_pattern = ($age === NULL) ?
+ '(?:\.([0-9]+))?' : ($age ? "\.($age)" : '');
+ $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 = isset($matches[3]) ? $matches[3] : 0;
+ if (! isset($this->pages[$_page])) {
+ $this->pages[$_page] = & new AttachFiles($_page);
+ }
+ $this->pages[$_page]->add($_file, $_age);
+ }
+ closedir($dir);
+ }
+
+ function toString($page = '', $flat = FALSE)
+ {
+ global $non_list;
+
+ if ($page != '') {
+ if (! isset($this->pages[$page])) {
+ return '';
+ } else {
+ return $this->pages[$page]->toString($flat);
+ }
+ }
+ $ret = '';
+
+ $pages = array_keys($this->pages);
+ sort($pages);
+
+ foreach ($pages as $page) {
+ if (preg_match("/$non_list/", $page)) continue;
+ $ret .= '<li>' . $this->pages[$page]->toString($flat) . "</li>\n";
+ }
+ return "\n<ul>\n" . $ret . "</ul>\n";
+ }
+}
?>