PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/plugin/paint.inc.php

https://github.com/miya5n/pukiwiki
PHP | 269 lines | 202 code | 37 blank | 30 comment | 27 complexity | 1204aed49655e8267a51d5580e66f7f8 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. // PukiWiki - Yet another WikiWikiWeb clone
  3. //
  4. // $Id: paint.inc.php,v 1.20 2011/01/25 15:01:01 henoheno Exp $
  5. //
  6. // Paint plugin
  7. /*
  8. * Usage
  9. * #paint(width,height)
  10. * パラメータ
  11. * キャンバスの幅と高さ
  12. */
  13. // 挿入する位置 1:欄の前 0:欄の後
  14. define('PAINT_INSERT_INS',0);
  15. // デフォルトの描画領域の幅と高さ
  16. define('PAINT_DEFAULT_WIDTH',80);
  17. define('PAINT_DEFAULT_HEIGHT',60);
  18. // 描画領域の幅と高さの制限値
  19. define('PAINT_MAX_WIDTH',320);
  20. define('PAINT_MAX_HEIGHT',240);
  21. // アプレット領域の幅と高さ 50x50未満で別ウインドウが開く
  22. define('PAINT_APPLET_WIDTH',800);
  23. define('PAINT_APPLET_HEIGHT',300);
  24. //コメントの挿入フォーマット
  25. define('PAINT_NAME_FORMAT','[[$name]]');
  26. define('PAINT_MSG_FORMAT','$msg');
  27. define('PAINT_NOW_FORMAT','&new{$now};');
  28. //メッセージがある場合
  29. define('PAINT_FORMAT',"\x08MSG\x08 -- \x08NAME\x08 \x08NOW\x08");
  30. //メッセージがない場合
  31. define('PAINT_FORMAT_NOMSG',"\x08NAME\x08 \x08NOW\x08");
  32. function plugin_paint_action()
  33. {
  34. global $script, $vars, $pkwk_dtd, $_paint_messages;
  35. if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
  36. //戻り値を初期化
  37. $retval['msg'] = $_paint_messages['msg_title'];
  38. $retval['body'] = '';
  39. if (array_key_exists('attach_file',$_FILES)
  40. and array_key_exists('refer',$vars))
  41. {
  42. $file = $_FILES['attach_file'];
  43. //BBSPaiter.jarは、shift-jisで内容を送ってくる。面倒なのでページ名はエンコードしてから送信させるようにした。
  44. $vars['page'] = $vars['refer'] = decode($vars['refer']);
  45. $filename = $vars['filename'];
  46. $filename = mb_convert_encoding($filename,SOURCE_ENCODING,'auto');
  47. //ファイル名置換
  48. $attachname = preg_replace('/^[^\.]+/',$filename,$file['name']);
  49. //すでに存在した場合、 ファイル名に'_0','_1',...を付けて回避(姑息)
  50. $count = '_0';
  51. while (file_exists(UPLOAD_DIR.encode($vars['refer']).'_'.encode($attachname)))
  52. {
  53. $attachname = preg_replace('/^[^\.]+/',$filename.$count++,$file['name']);
  54. }
  55. $file['name'] = $attachname;
  56. if (!exist_plugin('attach') or !function_exists('attach_upload'))
  57. {
  58. return array('msg'=>'attach.inc.php not found or not correct version.');
  59. }
  60. $retval = attach_upload($file,$vars['refer'],TRUE);
  61. if ($retval['result'] == TRUE)
  62. {
  63. $retval = paint_insert_ref($file['name']);
  64. }
  65. }
  66. else
  67. {
  68. $message = '';
  69. $r_refer = $s_refer = '';
  70. if (array_key_exists('refer',$vars))
  71. {
  72. $r_refer = rawurlencode($vars['refer']);
  73. $s_refer = htmlsc($vars['refer']);
  74. }
  75. $link = "<p><a href=\"$script?$r_refer\">$s_refer</a></p>";;
  76. $w = PAINT_APPLET_WIDTH;
  77. $h = PAINT_APPLET_HEIGHT;
  78. //ウインドウモード :)
  79. if ($w < 50 and $h < 50)
  80. {
  81. $w = $h = 0;
  82. $retval['msg'] = '';
  83. $vars['page'] = $vars['refer'];
  84. $vars['cmd'] = 'read';
  85. $retval['body'] = convert_html(get_source($vars['refer']));
  86. $link = '';
  87. }
  88. //XSS脆弱性問題 - 外部から来た変数をエスケープ
  89. $width = empty($vars['width']) ? PAINT_DEFAULT_WIDTH : $vars['width'];
  90. $height = empty($vars['height']) ? PAINT_DEFAULT_HEIGHT : $vars['height'];
  91. $f_w = (is_numeric($width) and $width > 0) ? $width : PAINT_DEFAULT_WIDTH;
  92. $f_h = (is_numeric($height) and $height > 0) ? $height : PAINT_DEFAULT_HEIGHT;
  93. $f_refer = array_key_exists('refer',$vars) ? encode($vars['refer']) : ''; // BBSPainter.jarがshift-jisに変換するのを回避
  94. $f_digest = array_key_exists('digest',$vars) ? htmlsc($vars['digest']) : '';
  95. $f_no = (array_key_exists('paint_no',$vars) and is_numeric($vars['paint_no'])) ?
  96. $vars['paint_no'] + 0 : 0;
  97. if ($f_w > PAINT_MAX_WIDTH)
  98. {
  99. $f_w = PAINT_MAX_WIDTH;
  100. }
  101. if ($f_h > PAINT_MAX_HEIGHT)
  102. {
  103. $f_h = PAINT_MAX_HEIGHT;
  104. }
  105. $retval['body'] .= <<<EOD
  106. <div>
  107. $link
  108. $message
  109. <applet codebase="." archive="BBSPainter.jar" code="Main.class" width="$w" height="$h">
  110. <param name="size" value="$f_w,$f_h" />
  111. <param name="action" value="$script" />
  112. <param name="image" value="attach_file" />
  113. <param name="form1" value="filename={$_paint_messages['field_filename']}=!" />
  114. <param name="form2" value="yourname={$_paint_messages['field_name']}" />
  115. <param name="comment" value="msg={$_paint_messages['field_comment']}" />
  116. <param name="param1" value="plugin=paint" />
  117. <param name="param2" value="refer=$f_refer" />
  118. <param name="param3" value="digest=$f_digest" />
  119. <param name="param4" value="max_file_size=1000000" />
  120. <param name="param5" value="paint_no=$f_no" />
  121. <param name="enctype" value="multipart/form-data" />
  122. <param name="return.URL" value="$script?$r_refer" />
  123. </applet>
  124. </div>
  125. EOD;
  126. // XHTML 1.0 Transitional
  127. if (! isset($pkwk_dtd) || $pkwk_dtd == PKWK_DTD_XHTML_1_1)
  128. $pkwk_dtd = PKWK_DTD_XHTML_1_0_TRANSITIONAL;
  129. }
  130. return $retval;
  131. }
  132. function plugin_paint_convert()
  133. {
  134. global $script,$vars,$digest;
  135. global $_paint_messages;
  136. static $numbers = array();
  137. if (PKWK_READONLY) return ''; // Show nothing
  138. if (!array_key_exists($vars['page'],$numbers))
  139. {
  140. $numbers[$vars['page']] = 0;
  141. }
  142. $paint_no = $numbers[$vars['page']]++;
  143. //戻り値
  144. $ret = '';
  145. //文字列を取得
  146. $width = $height = 0;
  147. $args = func_get_args();
  148. if (count($args) >= 2)
  149. {
  150. $width = array_shift($args);
  151. $height = array_shift($args);
  152. }
  153. if (!is_numeric($width) or $width <= 0)
  154. {
  155. $width = PAINT_DEFAULT_WIDTH;
  156. }
  157. if (!is_numeric($height) or $height <= 0)
  158. {
  159. $height = PAINT_DEFAULT_HEIGHT;
  160. }
  161. //XSS脆弱性問題 - 外部から来た変数をエスケープ
  162. $f_page = htmlsc($vars['page']);
  163. $max = sprintf($_paint_messages['msg_max'],PAINT_MAX_WIDTH,PAINT_MAX_HEIGHT);
  164. $ret = <<<EOD
  165. <form action="$script" method="post">
  166. <div>
  167. <input type="hidden" name="paint_no" value="$paint_no" />
  168. <input type="hidden" name="digest" value="$digest" />
  169. <input type="hidden" name="plugin" value="paint" />
  170. <input type="hidden" name="refer" value="$f_page" />
  171. <input type="text" name="width" size="3" value="$width" />
  172. x
  173. <input type="text" name="height" size="3" value="$height" />
  174. $max
  175. <input type="submit" value="{$_paint_messages['btn_submit']}" />
  176. </div>
  177. </form>
  178. EOD;
  179. return $ret;
  180. }
  181. function paint_insert_ref($filename)
  182. {
  183. global $script,$vars,$now,$do_backup;
  184. global $_paint_messages,$_no_name;
  185. $ret['msg'] = $_paint_messages['msg_title'];
  186. $msg = mb_convert_encoding(rtrim($vars['msg']),SOURCE_ENCODING,'auto');
  187. $name = mb_convert_encoding($vars['yourname'],SOURCE_ENCODING,'auto');
  188. $msg = str_replace('$msg',$msg,PAINT_MSG_FORMAT);
  189. $name = ($name == '') ? $_no_name : $vars['yourname'];
  190. $name = ($name == '') ? '' : str_replace('$name',$name,PAINT_NAME_FORMAT);
  191. $now = str_replace('$now',$now,PAINT_NOW_FORMAT);
  192. $msg = trim($msg);
  193. $msg = ($msg == '') ?
  194. PAINT_FORMAT_NOMSG :
  195. str_replace("\x08MSG\x08", $msg, PAINT_FORMAT);
  196. $msg = str_replace("\x08NAME\x08",$name, $msg);
  197. $msg = str_replace("\x08NOW\x08",$now, $msg);
  198. //ブロックに食われないように、#clearの直前に\nを2個書いておく
  199. $msg = "#ref($filename,wrap,around)\n" . trim($msg) . "\n\n" .
  200. "#clear\n";
  201. $postdata_old = get_source($vars['refer']);
  202. $postdata = '';
  203. $paint_no = 0; //'#paint'の出現回数
  204. foreach ($postdata_old as $line)
  205. {
  206. if (!PAINT_INSERT_INS)
  207. {
  208. $postdata .= $line;
  209. }
  210. if (preg_match('/^#paint/i',$line))
  211. {
  212. if ($paint_no == $vars['paint_no'])
  213. {
  214. $postdata .= $msg;
  215. }
  216. $paint_no++;
  217. }
  218. if (PAINT_INSERT_INS)
  219. {
  220. $postdata .= $line;
  221. }
  222. }
  223. // 更新の衝突を検出
  224. if (md5(join('',$postdata_old)) !== $vars['digest'])
  225. {
  226. $ret['msg'] = $_paint_messages['msg_title_collided'];
  227. $ret['body'] = $_paint_messages['msg_collided'];
  228. }
  229. page_write($vars['refer'],$postdata);
  230. return $ret;
  231. }
  232. ?>