OSDN Git Service

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