443
by dcoles
Added Forum application along with unmodifed version of phpBB3 "Olympus" 3.0.0 |
1 |
<?php
|
2 |
/**
|
|
3 |
*
|
|
4 |
* @package phpBB3
|
|
5 |
* @version $Id: message_parser.php,v 1.218 2007/11/29 14:09:32 acydburn Exp $
|
|
6 |
* @copyright (c) 2005 phpBB Group
|
|
7 |
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
|
8 |
*
|
|
9 |
*/
|
|
10 |
||
11 |
/**
|
|
12 |
* @ignore
|
|
13 |
*/
|
|
14 |
if (!defined('IN_PHPBB')) |
|
15 |
{
|
|
16 |
exit; |
|
17 |
}
|
|
18 |
||
19 |
if (!class_exists('bbcode')) |
|
20 |
{
|
|
21 |
include($phpbb_root_path . 'includes/bbcode.' . $phpEx); |
|
22 |
}
|
|
23 |
||
24 |
/**
|
|
25 |
* BBCODE FIRSTPASS
|
|
26 |
* BBCODE first pass class (functions for parsing messages for db storage)
|
|
27 |
* @package phpBB3
|
|
28 |
*/
|
|
29 |
class bbcode_firstpass extends bbcode |
|
30 |
{
|
|
31 |
var $message = ''; |
|
32 |
var $warn_msg = array(); |
|
33 |
var $parsed_items = array(); |
|
34 |
||
35 |
/**
|
|
36 |
* Parse BBCode
|
|
37 |
*/
|
|
38 |
function parse_bbcode() |
|
39 |
{
|
|
40 |
if (!$this->bbcodes) |
|
41 |
{
|
|
42 |
$this->bbcode_init(); |
|
43 |
}
|
|
44 |
||
45 |
global $user; |
|
46 |
||
47 |
$this->bbcode_bitfield = ''; |
|
48 |
$bitfield = new bitfield(); |
|
49 |
||
50 |
foreach ($this->bbcodes as $bbcode_name => $bbcode_data) |
|
51 |
{
|
|
52 |
if (isset($bbcode_data['disabled']) && $bbcode_data['disabled']) |
|
53 |
{
|
|
54 |
foreach ($bbcode_data['regexp'] as $regexp => $replacement) |
|
55 |
{
|
|
56 |
if (preg_match($regexp, $this->message)) |
|
57 |
{
|
|
58 |
$this->warn_msg[] = sprintf($user->lang['UNAUTHORISED_BBCODE'] , '[' . $bbcode_name . ']'); |
|
59 |
continue; |
|
60 |
}
|
|
61 |
}
|
|
62 |
}
|
|
63 |
else
|
|
64 |
{
|
|
65 |
foreach ($bbcode_data['regexp'] as $regexp => $replacement) |
|
66 |
{
|
|
67 |
// The pattern gets compiled and cached by the PCRE extension,
|
|
68 |
// it should not demand recompilation
|
|
69 |
if (preg_match($regexp, $this->message)) |
|
70 |
{
|
|
71 |
$this->message = preg_replace($regexp, $replacement, $this->message); |
|
72 |
$bitfield->set($bbcode_data['bbcode_id']); |
|
73 |
}
|
|
74 |
}
|
|
75 |
}
|
|
76 |
}
|
|
77 |
||
78 |
$this->bbcode_bitfield = $bitfield->get_base64(); |
|
79 |
}
|
|
80 |
||
81 |
/**
|
|
82 |
* Prepare some bbcodes for better parsing
|
|
83 |
*/
|
|
84 |
function prepare_bbcodes() |
|
85 |
{
|
|
86 |
// Ok, seems like users instead want the no-parsing of urls, smilies, etc. after and before and within quote tags being tagged as "not a bug".
|
|
87 |
// Fine by me ;) Will ease our live... but do not come back and cry at us, we won't hear you.
|
|
88 |
||
89 |
/* Add newline at the end and in front of each quote block to prevent parsing errors (urls, smilies, etc.)
|
|
90 |
if (strpos($this->message, '[quote') !== false && strpos($this->message, '[/quote]') !== false)
|
|
91 |
{
|
|
92 |
$this->message = str_replace("\r\n", "\n", $this->message);
|
|
93 |
||
94 |
// We strip newlines and spaces after and before quotes in quotes (trimming) and then add exactly one newline
|
|
95 |
$this->message = preg_replace('#\[quote(=".*?")?\]\s*(.*?)\s*\[/quote\]#siu', '[quote\1]' . "\n" . '\2' ."\n[/quote]", $this->message);
|
|
96 |
}
|
|
97 |
*/
|
|
98 |
||
99 |
// Add other checks which needs to be placed before actually parsing anything (be it bbcodes, smilies, urls...)
|
|
100 |
}
|
|
101 |
||
102 |
/**
|
|
103 |
* Init bbcode data for later parsing
|
|
104 |
*/
|
|
105 |
function bbcode_init() |
|
106 |
{
|
|
107 |
static $rowset; |
|
108 |
||
109 |
// This array holds all bbcode data. BBCodes will be processed in this
|
|
110 |
// order, so it is important to keep [code] in first position and
|
|
111 |
// [quote] in second position.
|
|
112 |
$this->bbcodes = array( |
|
113 |
'code' => array('bbcode_id' => 8, 'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#ise' => "\$this->bbcode_code('\$1', '\$2')")), |
|
114 |
'quote' => array('bbcode_id' => 0, 'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#ise' => "\$this->bbcode_quote('\$0')")), |
|
115 |
'attachment' => array('bbcode_id' => 12, 'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#ise' => "\$this->bbcode_attachment('\$1', '\$2')")), |
|
116 |
'b' => array('bbcode_id' => 1, 'regexp' => array('#\[b\](.*?)\[/b\]#ise' => "\$this->bbcode_strong('\$1')")), |
|
117 |
'i' => array('bbcode_id' => 2, 'regexp' => array('#\[i\](.*?)\[/i\]#ise' => "\$this->bbcode_italic('\$1')")), |
|
118 |
'url' => array('bbcode_id' => 3, 'regexp' => array('#\[url(=(.*))?\](.*)\[/url\]#iUe' => "\$this->validate_url('\$2', '\$3')")), |
|
119 |
'img' => array('bbcode_id' => 4, 'regexp' => array('#\[img\](.*)\[/img\]#iUe' => "\$this->bbcode_img('\$1')")), |
|
120 |
'size' => array('bbcode_id' => 5, 'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#ise' => "\$this->bbcode_size('\$1', '\$2')")), |
|
121 |
'color' => array('bbcode_id' => 6, 'regexp' => array('!\[color=(#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!ise' => "\$this->bbcode_color('\$1', '\$2')")), |
|
122 |
'u' => array('bbcode_id' => 7, 'regexp' => array('#\[u\](.*?)\[/u\]#ise' => "\$this->bbcode_underline('\$1')")), |
|
123 |
'list' => array('bbcode_id' => 9, 'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#ise' => "\$this->bbcode_parse_list('\$0')")), |
|
124 |
'email' => array('bbcode_id' => 10, 'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#ise' => "\$this->validate_email('\$1', '\$2')")), |
|
125 |
'flash' => array('bbcode_id' => 11, 'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#ie' => "\$this->bbcode_flash('\$1', '\$2', '\$3')")) |
|
126 |
);
|
|
127 |
||
128 |
// Zero the parsed items array
|
|
129 |
$this->parsed_items = array(); |
|
130 |
||
131 |
foreach ($this->bbcodes as $tag => $bbcode_data) |
|
132 |
{
|
|
133 |
$this->parsed_items[$tag] = 0; |
|
134 |
}
|
|
135 |
||
136 |
if (!is_array($rowset)) |
|
137 |
{
|
|
138 |
global $db; |
|
139 |
$rowset = array(); |
|
140 |
||
141 |
$sql = 'SELECT * |
|
142 |
FROM ' . BBCODES_TABLE; |
|
143 |
$result = $db->sql_query($sql); |
|
144 |
||
145 |
while ($row = $db->sql_fetchrow($result)) |
|
146 |
{
|
|
147 |
$rowset[] = $row; |
|
148 |
}
|
|
149 |
$db->sql_freeresult($result); |
|
150 |
}
|
|
151 |
||
152 |
foreach ($rowset as $row) |
|
153 |
{
|
|
154 |
$this->bbcodes[$row['bbcode_tag']] = array( |
|
155 |
'bbcode_id' => (int) $row['bbcode_id'], |
|
156 |
'regexp' => array($row['first_pass_match'] => str_replace('$uid', $this->bbcode_uid, $row['first_pass_replace'])) |
|
157 |
);
|
|
158 |
}
|
|
159 |
}
|
|
160 |
||
161 |
/**
|
|
162 |
* Making some pre-checks for bbcodes as well as increasing the number of parsed items
|
|
163 |
*/
|
|
164 |
function check_bbcode($bbcode, &$in) |
|
165 |
{
|
|
166 |
// when using the /e modifier, preg_replace slashes double-quotes but does not
|
|
167 |
// seem to slash anything else
|
|
168 |
$in = str_replace("\r\n", "\n", str_replace('\"', '"', $in)); |
|
169 |
||
170 |
// Trimming here to make sure no empty bbcodes are parsed accidently
|
|
171 |
if (trim($in) == '') |
|
172 |
{
|
|
173 |
return false; |
|
174 |
}
|
|
175 |
||
176 |
$this->parsed_items[$bbcode]++; |
|
177 |
||
178 |
return true; |
|
179 |
}
|
|
180 |
||
181 |
/**
|
|
182 |
* Transform some characters in valid bbcodes
|
|
183 |
*/
|
|
184 |
function bbcode_specialchars($text) |
|
185 |
{
|
|
186 |
$str_from = array('<', '>', '[', ']', '.', ':'); |
|
187 |
$str_to = array('<', '>', '[', ']', '.', ':'); |
|
188 |
||
189 |
return str_replace($str_from, $str_to, $text); |
|
190 |
}
|
|
191 |
||
192 |
/**
|
|
193 |
* Parse size tag
|
|
194 |
*/
|
|
195 |
function bbcode_size($stx, $in) |
|
196 |
{
|
|
197 |
global $user, $config; |
|
198 |
||
199 |
if (!$this->check_bbcode('size', $in)) |
|
200 |
{
|
|
201 |
return ''; |
|
202 |
}
|
|
203 |
||
204 |
if ($config['max_' . $this->mode . '_font_size'] && $config['max_' . $this->mode . '_font_size'] < $stx) |
|
205 |
{
|
|
206 |
$this->warn_msg[] = sprintf($user->lang['MAX_FONT_SIZE_EXCEEDED'], $config['max_' . $this->mode . '_font_size']); |
|
207 |
||
208 |
return '[size=' . $stx . ']' . $in . '[/size]'; |
|
209 |
}
|
|
210 |
||
211 |
// Do not allow size=0
|
|
212 |
if ($stx <= 0) |
|
213 |
{
|
|
214 |
return '[size=' . $stx . ']' . $in . '[/size]'; |
|
215 |
}
|
|
216 |
||
217 |
return '[size=' . $stx . ':' . $this->bbcode_uid . ']' . $in . '[/size:' . $this->bbcode_uid . ']'; |
|
218 |
}
|
|
219 |
||
220 |
/**
|
|
221 |
* Parse color tag
|
|
222 |
*/
|
|
223 |
function bbcode_color($stx, $in) |
|
224 |
{
|
|
225 |
if (!$this->check_bbcode('color', $in)) |
|
226 |
{
|
|
227 |
return ''; |
|
228 |
}
|
|
229 |
||
230 |
return '[color=' . $stx . ':' . $this->bbcode_uid . ']' . $in . '[/color:' . $this->bbcode_uid . ']'; |
|
231 |
}
|
|
232 |
||
233 |
/**
|
|
234 |
* Parse u tag
|
|
235 |
*/
|
|
236 |
function bbcode_underline($in) |
|
237 |
{
|
|
238 |
if (!$this->check_bbcode('u', $in)) |
|
239 |
{
|
|
240 |
return ''; |
|
241 |
}
|
|
242 |
||
243 |
return '[u:' . $this->bbcode_uid . ']' . $in . '[/u:' . $this->bbcode_uid . ']'; |
|
244 |
}
|
|
245 |
||
246 |
/**
|
|
247 |
* Parse b tag
|
|
248 |
*/
|
|
249 |
function bbcode_strong($in) |
|
250 |
{
|
|
251 |
if (!$this->check_bbcode('b', $in)) |
|
252 |
{
|
|
253 |
return ''; |
|
254 |
}
|
|
255 |
||
256 |
return '[b:' . $this->bbcode_uid . ']' . $in . '[/b:' . $this->bbcode_uid . ']'; |
|
257 |
}
|
|
258 |
||
259 |
/**
|
|
260 |
* Parse i tag
|
|
261 |
*/
|
|
262 |
function bbcode_italic($in) |
|
263 |
{
|
|
264 |
if (!$this->check_bbcode('i', $in)) |
|
265 |
{
|
|
266 |
return ''; |
|
267 |
}
|
|
268 |
||
269 |
return '[i:' . $this->bbcode_uid . ']' . $in . '[/i:' . $this->bbcode_uid . ']'; |
|
270 |
}
|
|
271 |
||
272 |
/**
|
|
273 |
* Parse img tag
|
|
274 |
*/
|
|
275 |
function bbcode_img($in) |
|
276 |
{
|
|
277 |
global $user, $config; |
|
278 |
||
279 |
if (!$this->check_bbcode('img', $in)) |
|
280 |
{
|
|
281 |
return ''; |
|
282 |
}
|
|
283 |
||
284 |
$in = trim($in); |
|
285 |
$error = false; |
|
286 |
||
287 |
$in = str_replace(' ', '%20', $in); |
|
288 |
||
289 |
// Checking urls
|
|
290 |
if (!preg_match('#^' . get_preg_expression('url') . '$#i', $in) && !preg_match('#^' . get_preg_expression('www_url') . '$#i', $in)) |
|
291 |
{
|
|
292 |
return '[img]' . $in . '[/img]'; |
|
293 |
}
|
|
294 |
||
295 |
// Try to cope with a common user error... not specifying a protocol but only a subdomain
|
|
296 |
if (!preg_match('#^[a-z0-9]+://#i', $in)) |
|
297 |
{
|
|
298 |
$in = 'http://' . $in; |
|
299 |
}
|
|
300 |
||
301 |
if ($config['max_' . $this->mode . '_img_height'] || $config['max_' . $this->mode . '_img_width']) |
|
302 |
{
|
|
303 |
$stats = @getimagesize($in); |
|
304 |
||
305 |
if ($stats === false) |
|
306 |
{
|
|
307 |
$error = true; |
|
308 |
$this->warn_msg[] = $user->lang['UNABLE_GET_IMAGE_SIZE']; |
|
309 |
}
|
|
310 |
else
|
|
311 |
{
|
|
312 |
if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $stats[1]) |
|
313 |
{
|
|
314 |
$error = true; |
|
315 |
$this->warn_msg[] = sprintf($user->lang['MAX_IMG_HEIGHT_EXCEEDED'], $config['max_' . $this->mode . '_img_height']); |
|
316 |
}
|
|
317 |
||
318 |
if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $stats[0]) |
|
319 |
{
|
|
320 |
$error = true; |
|
321 |
$this->warn_msg[] = sprintf($user->lang['MAX_IMG_WIDTH_EXCEEDED'], $config['max_' . $this->mode . '_img_width']); |
|
322 |
}
|
|
323 |
}
|
|
324 |
}
|
|
325 |
||
326 |
if ($error || $this->path_in_domain($in)) |
|
327 |
{
|
|
328 |
return '[img]' . $in . '[/img]'; |
|
329 |
}
|
|
330 |
||
331 |
return '[img:' . $this->bbcode_uid . ']' . $this->bbcode_specialchars($in) . '[/img:' . $this->bbcode_uid . ']'; |
|
332 |
}
|
|
333 |
||
334 |
/**
|
|
335 |
* Parse flash tag
|
|
336 |
*/
|
|
337 |
function bbcode_flash($width, $height, $in) |
|
338 |
{
|
|
339 |
global $user, $config; |
|
340 |
||
341 |
if (!$this->check_bbcode('flash', $in)) |
|
342 |
{
|
|
343 |
return ''; |
|
344 |
}
|
|
345 |
||
346 |
$in = trim($in); |
|
347 |
$error = false; |
|
348 |
||
349 |
// Apply the same size checks on flash files as on images
|
|
350 |
if ($config['max_' . $this->mode . '_img_height'] || $config['max_' . $this->mode . '_img_width']) |
|
351 |
{
|
|
352 |
if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $height) |
|
353 |
{
|
|
354 |
$error = true; |
|
355 |
$this->warn_msg[] = sprintf($user->lang['MAX_FLASH_HEIGHT_EXCEEDED'], $config['max_' . $this->mode . '_img_height']); |
|
356 |
}
|
|
357 |
||
358 |
if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $width) |
|
359 |
{
|
|
360 |
$error = true; |
|
361 |
$this->warn_msg[] = sprintf($user->lang['MAX_FLASH_WIDTH_EXCEEDED'], $config['max_' . $this->mode . '_img_width']); |
|
362 |
}
|
|
363 |
}
|
|
364 |
||
365 |
if ($error || $this->path_in_domain($in)) |
|
366 |
{
|
|
367 |
return '[flash=' . $width . ',' . $height . ']' . $in . '[/flash]'; |
|
368 |
}
|
|
369 |
||
370 |
return '[flash=' . $width . ',' . $height . ':' . $this->bbcode_uid . ']' . $this->bbcode_specialchars($in) . '[/flash:' . $this->bbcode_uid . ']'; |
|
371 |
}
|
|
372 |
||
373 |
/**
|
|
374 |
* Parse inline attachments [ia]
|
|
375 |
*/
|
|
376 |
function bbcode_attachment($stx, $in) |
|
377 |
{
|
|
378 |
if (!$this->check_bbcode('attachment', $in)) |
|
379 |
{
|
|
380 |
return ''; |
|
381 |
}
|
|
382 |
||
383 |
return '[attachment=' . $stx . ':' . $this->bbcode_uid . ']<!-- ia' . $stx . ' -->' . trim($in) . '<!-- ia' . $stx . ' -->[/attachment:' . $this->bbcode_uid . ']'; |
|
384 |
}
|
|
385 |
||
386 |
/**
|
|
387 |
* Parse code text from code tag
|
|
388 |
* @private
|
|
389 |
*/
|
|
390 |
function bbcode_parse_code($stx, &$code) |
|
391 |
{
|
|
392 |
switch (strtolower($stx)) |
|
393 |
{
|
|
394 |
case 'php': |
|
395 |
||
396 |
$remove_tags = false; |
|
397 |
$code = str_replace(array('<', '>'), array('<', '>'), $code); |
|
398 |
||
399 |
if (!preg_match('/\<\?.*?\?\>/is', $code)) |
|
400 |
{
|
|
401 |
$remove_tags = true; |
|
402 |
$code = "<?php $code ?>"; |
|
403 |
}
|
|
404 |
||
405 |
$conf = array('highlight.bg', 'highlight.comment', 'highlight.default', 'highlight.html', 'highlight.keyword', 'highlight.string'); |
|
406 |
foreach ($conf as $ini_var) |
|
407 |
{
|
|
408 |
@ini_set($ini_var, str_replace('highlight.', 'syntax', $ini_var)); |
|
409 |
}
|
|
410 |
||
411 |
// Because highlight_string is specialcharing the text (but we already did this before), we have to reverse this in order to get correct results
|
|
412 |
$code = htmlspecialchars_decode($code); |
|
413 |
$code = highlight_string($code, true); |
|
414 |
||
415 |
$str_from = array('<span style="color: ', '<font color="syntax', '</font>', '<code>', '</code>','[', ']', '.', ':'); |
|
416 |
$str_to = array('<span class="', '<span class="syntax', '</span>', '', '', '[', ']', '.', ':'); |
|
417 |
||
418 |
if ($remove_tags) |
|
419 |
{
|
|
420 |
$str_from[] = '<span class="syntaxdefault"><?php </span>'; |
|
421 |
$str_to[] = ''; |
|
422 |
$str_from[] = '<span class="syntaxdefault"><?php '; |
|
423 |
$str_to[] = '<span class="syntaxdefault">'; |
|
424 |
}
|
|
425 |
||
426 |
$code = str_replace($str_from, $str_to, $code); |
|
427 |
$code = preg_replace('#^(<span class="[a-z_]+">)\n?(.*?)\n?(</span>)$#is', '$1$2$3', $code); |
|
428 |
||
429 |
if ($remove_tags) |
|
430 |
{
|
|
431 |
$code = preg_replace('#(<span class="[a-z]+">)?\?>(</span>)#', '$1 $2', $code); |
|
432 |
}
|
|
433 |
||
434 |
$code = preg_replace('#^<span class="[a-z]+"><span class="([a-z]+)">(.*)</span></span>#s', '<span class="$1">$2</span>', $code); |
|
435 |
$code = preg_replace('#(?:\s++| )*+</span>$#u', '</span>', $code); |
|
436 |
||
437 |
// remove newline at the end
|
|
438 |
if (!empty($code) && substr($code, -1) == "\n") |
|
439 |
{
|
|
440 |
$code = substr($code, 0, -1); |
|
441 |
}
|
|
442 |
||
443 |
return "[code=$stx:" . $this->bbcode_uid . ']' . $code . '[/code:' . $this->bbcode_uid . ']'; |
|
444 |
break; |
|
445 |
||
446 |
default: |
|
447 |
return '[code:' . $this->bbcode_uid . ']' . $this->bbcode_specialchars($code) . '[/code:' . $this->bbcode_uid . ']'; |
|
448 |
break; |
|
449 |
}
|
|
450 |
}
|
|
451 |
||
452 |
/**
|
|
453 |
* Parse code tag
|
|
454 |
* Expects the argument to start right after the opening [code] tag and to end with [/code]
|
|
455 |
*/
|
|
456 |
function bbcode_code($stx, $in) |
|
457 |
{
|
|
458 |
if (!$this->check_bbcode('code', $in)) |
|
459 |
{
|
|
460 |
return ''; |
|
461 |
}
|
|
462 |
||
463 |
// We remove the hardcoded elements from the code block here because it is not used in code blocks
|
|
464 |
// Having it here saves us one preg_replace per message containing [code] blocks
|
|
465 |
// Additionally, magic url parsing should go after parsing bbcodes, but for safety those are stripped out too...
|
|
466 |
$htm_match = get_preg_expression('bbcode_htm'); |
|
467 |
unset($htm_match[4], $htm_match[5]); |
|
468 |
$htm_replace = array('\1', '\1', '\2', '\1'); |
|
469 |
||
470 |
$out = $code_block = ''; |
|
471 |
$open = 1; |
|
472 |
||
473 |
while ($in) |
|
474 |
{
|
|
475 |
// Determine position and tag length of next code block
|
|
476 |
preg_match('#(.*?)(\[code(?:=([a-z]+))?\])(.+)#is', $in, $buffer); |
|
477 |
$pos = (isset($buffer[1])) ? strlen($buffer[1]) : false; |
|
478 |
$tag_length = (isset($buffer[2])) ? strlen($buffer[2]) : false; |
|
479 |
||
480 |
// Determine position of ending code tag
|
|
481 |
$pos2 = stripos($in, '[/code]'); |
|
482 |
||
483 |
// Which is the next block, ending code or code block
|
|
484 |
if ($pos !== false && $pos < $pos2) |
|
485 |
{
|
|
486 |
// Open new block
|
|
487 |
if (!$open) |
|
488 |
{
|
|
489 |
$out .= substr($in, 0, $pos); |
|
490 |
$in = substr($in, $pos); |
|
491 |
$stx = (isset($buffer[3])) ? $buffer[3] : ''; |
|
492 |
$code_block = ''; |
|
493 |
}
|
|
494 |
else
|
|
495 |
{
|
|
496 |
// Already opened block, just append to the current block
|
|
497 |
$code_block .= substr($in, 0, $pos) . ((isset($buffer[2])) ? $buffer[2] : ''); |
|
498 |
$in = substr($in, $pos); |
|
499 |
}
|
|
500 |
||
501 |
$in = substr($in, $tag_length); |
|
502 |
$open++; |
|
503 |
}
|
|
504 |
else
|
|
505 |
{
|
|
506 |
// Close the block
|
|
507 |
if ($open == 1) |
|
508 |
{
|
|
509 |
$code_block .= substr($in, 0, $pos2); |
|
510 |
$code_block = preg_replace($htm_match, $htm_replace, $code_block); |
|
511 |
||
512 |
// Parse this code block
|
|
513 |
$out .= $this->bbcode_parse_code($stx, $code_block); |
|
514 |
$code_block = ''; |
|
515 |
$open--; |
|
516 |
}
|
|
517 |
else if ($open) |
|
518 |
{
|
|
519 |
// Close one open tag... add to the current code block
|
|
520 |
$code_block .= substr($in, 0, $pos2 + 7); |
|
521 |
$open--; |
|
522 |
}
|
|
523 |
else
|
|
524 |
{
|
|
525 |
// end code without opening code... will be always outside code block
|
|
526 |
$out .= substr($in, 0, $pos2 + 7); |
|
527 |
}
|
|
528 |
||
529 |
$in = substr($in, $pos2 + 7); |
|
530 |
}
|
|
531 |
}
|
|
532 |
||
533 |
// if now $code_block has contents we need to parse the remaining code while removing the last closing tag to match up.
|
|
534 |
if ($code_block) |
|
535 |
{
|
|
536 |
$code_block = substr($code_block, 0, -7); |
|
537 |
$code_block = preg_replace($htm_match, $htm_replace, $code_block); |
|
538 |
||
539 |
$out .= $this->bbcode_parse_code($stx, $code_block); |
|
540 |
}
|
|
541 |
||
542 |
return $out; |
|
543 |
}
|
|
544 |
||
545 |
/**
|
|
546 |
* Parse list bbcode
|
|
547 |
* Expects the argument to start with a tag
|
|
548 |
*/
|
|
549 |
function bbcode_parse_list($in) |
|
550 |
{
|
|
551 |
if (!$this->check_bbcode('list', $in)) |
|
552 |
{
|
|
553 |
return ''; |
|
554 |
}
|
|
555 |
||
556 |
// $tok holds characters to stop at. Since the string starts with a '[' we'll get everything up to the first ']' which should be the opening [list] tag
|
|
557 |
$tok = ']'; |
|
558 |
$out = '['; |
|
559 |
||
560 |
// First character is [
|
|
561 |
$in = substr($in, 1); |
|
562 |
$list_end_tags = $item_end_tags = array(); |
|
563 |
||
564 |
do
|
|
565 |
{
|
|
566 |
$pos = strlen($in); |
|
567 |
||
568 |
for ($i = 0, $tok_len = strlen($tok); $i < $tok_len; ++$i) |
|
569 |
{
|
|
570 |
$tmp_pos = strpos($in, $tok[$i]); |
|
571 |
||
572 |
if ($tmp_pos !== false && $tmp_pos < $pos) |
|
573 |
{
|
|
574 |
$pos = $tmp_pos; |
|
575 |
}
|
|
576 |
}
|
|
577 |
||
578 |
$buffer = substr($in, 0, $pos); |
|
579 |
$tok = $in[$pos]; |
|
580 |
||
581 |
$in = substr($in, $pos + 1); |
|
582 |
||
583 |
if ($tok == ']') |
|
584 |
{
|
|
585 |
// if $tok is ']' the buffer holds a tag
|
|
586 |
if (strtolower($buffer) == '/list' && sizeof($list_end_tags)) |
|
587 |
{
|
|
588 |
// valid [/list] tag, check nesting so that we don't hit false positives
|
|
589 |
if (sizeof($item_end_tags) && sizeof($item_end_tags) >= sizeof($list_end_tags)) |
|
590 |
{
|
|
591 |
// current li tag has not been closed
|
|
592 |
$out = preg_replace('/\n?\[$/', '[', $out) . array_pop($item_end_tags) . ']['; |
|
593 |
}
|
|
594 |
||
595 |
$out .= array_pop($list_end_tags) . ']'; |
|
596 |
$tok = '['; |
|
597 |
}
|
|
598 |
else if (preg_match('#^list(=[0-9a-z])?$#i', $buffer, $m)) |
|
599 |
{
|
|
600 |
// sub-list, add a closing tag
|
|
601 |
if (empty($m[1]) || preg_match('/^(?:disc|square|circle)$/i', $m[1])) |
|
602 |
{
|
|
603 |
array_push($list_end_tags, '/list:u:' . $this->bbcode_uid); |
|
604 |
}
|
|
605 |
else
|
|
606 |
{
|
|
607 |
array_push($list_end_tags, '/list:o:' . $this->bbcode_uid); |
|
608 |
}
|
|
609 |
$out .= 'list' . substr($buffer, 4) . ':' . $this->bbcode_uid . ']'; |
|
610 |
$tok = '['; |
|
611 |
}
|
|
612 |
else
|
|
613 |
{
|
|
614 |
if (($buffer == '*' || substr($buffer, -2) == '[*') && sizeof($list_end_tags)) |
|
615 |
{
|
|
616 |
// the buffer holds a bullet tag and we have a [list] tag open
|
|
617 |
if (sizeof($item_end_tags) >= sizeof($list_end_tags)) |
|
618 |
{
|
|
619 |
if (substr($buffer, -2) == '[*') |
|
620 |
{
|
|
621 |
$out .= substr($buffer, 0, -2) . '['; |
|
622 |
}
|
|
623 |
// current li tag has not been closed
|
|
624 |
if (preg_match('/\n\[$/', $out, $m)) |
|
625 |
{
|
|
626 |
$out = preg_replace('/\n\[$/', '[', $out); |
|
627 |
$buffer = array_pop($item_end_tags) . "]\n[*:" . $this->bbcode_uid; |
|
628 |
}
|
|
629 |
else
|
|
630 |
{
|
|
631 |
$buffer = array_pop($item_end_tags) . '][*:' . $this->bbcode_uid; |
|
632 |
}
|
|
633 |
}
|
|
634 |
else
|
|
635 |
{
|
|
636 |
$buffer = '*:' . $this->bbcode_uid; |
|
637 |
}
|
|
638 |
||
639 |
$item_end_tags[] = '/*:m:' . $this->bbcode_uid; |
|
640 |
}
|
|
641 |
else if ($buffer == '/*') |
|
642 |
{
|
|
643 |
array_pop($item_end_tags); |
|
644 |
$buffer = '/*:' . $this->bbcode_uid; |
|
645 |
}
|
|
646 |
||
647 |
$out .= $buffer . $tok; |
|
648 |
$tok = '[]'; |
|
649 |
}
|
|
650 |
}
|
|
651 |
else
|
|
652 |
{
|
|
653 |
// Not within a tag, just add buffer to the return string
|
|
654 |
$out .= $buffer . $tok; |
|
655 |
$tok = ($tok == '[') ? ']' : '[]'; |
|
656 |
}
|
|
657 |
}
|
|
658 |
while ($in); |
|
659 |
||
660 |
// do we have some tags open? close them now
|
|
661 |
if (sizeof($item_end_tags)) |
|
662 |
{
|
|
663 |
$out .= '[' . implode('][', $item_end_tags) . ']'; |
|
664 |
}
|
|
665 |
if (sizeof($list_end_tags)) |
|
666 |
{
|
|
667 |
$out .= '[' . implode('][', $list_end_tags) . ']'; |
|
668 |
}
|
|
669 |
||
670 |
return $out; |
|
671 |
}
|
|
672 |
||
673 |
/**
|
|
674 |
* Parse quote bbcode
|
|
675 |
* Expects the argument to start with a tag
|
|
676 |
*/
|
|
677 |
function bbcode_quote($in) |
|
678 |
{
|
|
679 |
global $config, $user; |
|
680 |
||
681 |
/**
|
|
682 |
* If you change this code, make sure the cases described within the following reports are still working:
|
|
683 |
* #3572 - [quote="[test]test"]test [ test[/quote] - (correct: parsed)
|
|
684 |
* #14667 - [quote]test[/quote] test ] and [ test [quote]test[/quote] (correct: parsed)
|
|
685 |
* #14770 - [quote="["]test[/quote] (correct: parsed)
|
|
686 |
* [quote="[i]test[/i]"]test[/quote] (correct: parsed)
|
|
687 |
* [quote="[quote]test[/quote]"]test[/quote] (correct: NOT parsed)
|
|
688 |
*/
|
|
689 |
||
690 |
$in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in))); |
|
691 |
||
692 |
if (!$in) |
|
693 |
{
|
|
694 |
return ''; |
|
695 |
}
|
|
696 |
||
697 |
// To let the parser not catch tokens within quote_username quotes we encode them before we start this...
|
|
698 |
$in = preg_replace('#quote="(.*?)"\]#ie', "'quote="' . str_replace(array('[', ']'), array('[', ']'), '\$1') . '"]'", $in); |
|
699 |
||
700 |
$tok = ']'; |
|
701 |
$out = '['; |
|
702 |
||
703 |
$in = substr($in, 1); |
|
704 |
$close_tags = $error_ary = array(); |
|
705 |
$buffer = ''; |
|
706 |
||
707 |
do
|
|
708 |
{
|
|
709 |
$pos = strlen($in); |
|
710 |
for ($i = 0, $tok_len = strlen($tok); $i < $tok_len; ++$i) |
|
711 |
{
|
|
712 |
$tmp_pos = strpos($in, $tok[$i]); |
|
713 |
if ($tmp_pos !== false && $tmp_pos < $pos) |
|
714 |
{
|
|
715 |
$pos = $tmp_pos; |
|
716 |
}
|
|
717 |
}
|
|
718 |
||
719 |
$buffer .= substr($in, 0, $pos); |
|
720 |
$tok = $in[$pos]; |
|
721 |
$in = substr($in, $pos + 1); |
|
722 |
||
723 |
if ($tok == ']') |
|
724 |
{
|
|
725 |
if (strtolower($buffer) == '/quote' && sizeof($close_tags) && substr($out, -1, 1) == '[') |
|
726 |
{
|
|
727 |
// we have found a closing tag
|
|
728 |
$out .= array_pop($close_tags) . ']'; |
|
729 |
$tok = '['; |
|
730 |
$buffer = ''; |
|
731 |
||
732 |
/* Add space at the end of the closing tag if not happened before to allow following urls/smilies to be parsed correctly
|
|
733 |
* Do not try to think for the user. :/ Do not parse urls/smilies if there is no space - is the same as with other bbcodes too.
|
|
734 |
* Also, we won't have any spaces within $in anyway, only adding up spaces -> #10982
|
|
735 |
if (!$in || $in[0] !== ' ')
|
|
736 |
{
|
|
737 |
$out .= ' ';
|
|
738 |
}*/
|
|
739 |
}
|
|
740 |
else if (preg_match('#^quote(?:="(.*?)")?$#is', $buffer, $m)) |
|
741 |
{
|
|
742 |
$this->parsed_items['quote']++; |
|
743 |
||
744 |
// the buffer holds a valid opening tag
|
|
745 |
if ($config['max_quote_depth'] && sizeof($close_tags) >= $config['max_quote_depth']) |
|
746 |
{
|
|
747 |
// there are too many nested quotes
|
|
748 |
$error_ary['quote_depth'] = sprintf($user->lang['QUOTE_DEPTH_EXCEEDED'], $config['max_quote_depth']); |
|
749 |
||
750 |
$out .= $buffer . $tok; |
|
751 |
$tok = '[]'; |
|
752 |
$buffer = ''; |
|
753 |
||
754 |
continue; |
|
755 |
}
|
|
756 |
||
757 |
array_push($close_tags, '/quote:' . $this->bbcode_uid); |
|
758 |
||
759 |
if (isset($m[1]) && $m[1]) |
|
760 |
{
|
|
761 |
$username = str_replace(array('[', ']'), array('[', ']'), $m[1]); |
|
762 |
$username = preg_replace('#\[(?!b|i|u|color|url|email|/b|/i|/u|/color|/url|/email)#iU', '[$1', $username); |
|
763 |
||
764 |
$end_tags = array(); |
|
765 |
$error = false; |
|
766 |
||
767 |
preg_match_all('#\[((?:/)?(?:[a-z]+))#i', $username, $tags); |
|
768 |
foreach ($tags[1] as $tag) |
|
769 |
{
|
|
770 |
if ($tag[0] != '/') |
|
771 |
{
|
|
772 |
$end_tags[] = '/' . $tag; |
|
773 |
}
|
|
774 |
else
|
|
775 |
{
|
|
776 |
$end_tag = array_pop($end_tags); |
|
777 |
$error = ($end_tag != $tag) ? true : false; |
|
778 |
}
|
|
779 |
}
|
|
780 |
||
781 |
if ($error) |
|
782 |
{
|
|
783 |
$username = $m[1]; |
|
784 |
}
|
|
785 |
||
786 |
$out .= 'quote="' . $username . '":' . $this->bbcode_uid . ']'; |
|
787 |
}
|
|
788 |
else
|
|
789 |
{
|
|
790 |
$out .= 'quote:' . $this->bbcode_uid . ']'; |
|
791 |
}
|
|
792 |
||
793 |
$tok = '['; |
|
794 |
$buffer = ''; |
|
795 |
}
|
|
796 |
else if (preg_match('#^quote="(.*?)#is', $buffer, $m)) |
|
797 |
{
|
|
798 |
// the buffer holds an invalid opening tag
|
|
799 |
$buffer .= ']'; |
|
800 |
}
|
|
801 |
else
|
|
802 |
{
|
|
803 |
$out .= $buffer . $tok; |
|
804 |
$tok = '[]'; |
|
805 |
$buffer = ''; |
|
806 |
}
|
|
807 |
}
|
|
808 |
else
|
|
809 |
{
|
|
810 |
/**
|
|
811 |
* Old quote code working fine, but having errors listed in bug #3572
|
|
812 |
*
|
|
813 |
* $out .= $buffer . $tok;
|
|
814 |
* $tok = ($tok == '[') ? ']' : '[]';
|
|
815 |
* $buffer = '';
|
|
816 |
*/
|
|
817 |
||
818 |
$out .= $buffer . $tok; |
|
819 |
||
820 |
if ($tok == '[') |
|
821 |
{
|
|
822 |
// Search the text for the next tok... if an ending quote comes first, then change tok to []
|
|
823 |
$pos1 = stripos($in, '[/quote'); |
|
824 |
// If the token ] comes first, we change it to ]
|
|
825 |
$pos2 = strpos($in, ']'); |
|
826 |
// If the token [ comes first, we change it to [
|
|
827 |
$pos3 = strpos($in, '['); |
|
828 |
||
829 |
if ($pos1 !== false && ($pos2 === false || $pos1 < $pos2) && ($pos3 === false || $pos1 < $pos3)) |
|
830 |
{
|
|
831 |
$tok = '[]'; |
|
832 |
}
|
|
833 |
else if ($pos3 !== false && ($pos2 === false || $pos3 < $pos2)) |
|
834 |
{
|
|
835 |
$tok = '['; |
|
836 |
}
|
|
837 |
else
|
|
838 |
{
|
|
839 |
$tok = ']'; |
|
840 |
}
|
|
841 |
}
|
|
842 |
else
|
|
843 |
{
|
|
844 |
$tok = '[]'; |
|
845 |
}
|
|
846 |
$buffer = ''; |
|
847 |
}
|
|
848 |
}
|
|
849 |
while ($in); |
|
850 |
||
851 |
if (sizeof($close_tags)) |
|
852 |
{
|
|
853 |
$out .= '[' . implode('][', $close_tags) . ']'; |
|
854 |
}
|
|
855 |
||
856 |
foreach ($error_ary as $error_msg) |
|
857 |
{
|
|
858 |
$this->warn_msg[] = $error_msg; |
|
859 |
}
|
|
860 |
||
861 |
return $out; |
|
862 |
}
|
|
863 |
||
864 |
/**
|
|
865 |
* Validate email
|
|
866 |
*/
|
|
867 |
function validate_email($var1, $var2) |
|
868 |
{
|
|
869 |
$var1 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var1))); |
|
870 |
$var2 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var2))); |
|
871 |
||
872 |
$txt = $var2; |
|
873 |
$email = ($var1) ? $var1 : $var2; |
|
874 |
||
875 |
$validated = true; |
|
876 |
||
877 |
if (!preg_match('/^' . get_preg_expression('email') . '$/i', $email)) |
|
878 |
{
|
|
879 |
$validated = false; |
|
880 |
}
|
|
881 |
||
882 |
if (!$validated) |
|
883 |
{
|
|
884 |
return '[email' . (($var1) ? "=$var1" : '') . ']' . $var2 . '[/email]'; |
|
885 |
}
|
|
886 |
||
887 |
$this->parsed_items['email']++; |
|
888 |
||
889 |
if ($var1) |
|
890 |
{
|
|
891 |
$retval = '[email=' . $this->bbcode_specialchars($email) . ':' . $this->bbcode_uid . ']' . $txt . '[/email:' . $this->bbcode_uid . ']'; |
|
892 |
}
|
|
893 |
else
|
|
894 |
{
|
|
895 |
$retval = '[email:' . $this->bbcode_uid . ']' . $this->bbcode_specialchars($email) . '[/email:' . $this->bbcode_uid . ']'; |
|
896 |
}
|
|
897 |
||
898 |
return $retval; |
|
899 |
}
|
|
900 |
||
901 |
/**
|
|
902 |
* Validate url
|
|
903 |
*
|
|
904 |
* @param string $var1 optional url parameter for url bbcode: [url(=$var1)]$var2[/url]
|
|
905 |
* @param string $var2 url bbcode content: [url(=$var1)]$var2[/url]
|
|
906 |
*/
|
|
907 |
function validate_url($var1, $var2) |
|
908 |
{
|
|
909 |
global $config; |
|
910 |
||
911 |
$var1 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var1))); |
|
912 |
$var2 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var2))); |
|
913 |
||
914 |
$url = ($var1) ? $var1 : $var2; |
|
915 |
||
916 |
if (!$url || ($var1 && !$var2)) |
|
917 |
{
|
|
918 |
return ''; |
|
919 |
}
|
|
920 |
||
921 |
$valid = false; |
|
922 |
||
923 |
$url = str_replace(' ', '%20', $url); |
|
924 |
||
925 |
// Checking urls
|
|
926 |
if (preg_match('#^' . get_preg_expression('url') . '$#i', $url) || |
|
927 |
preg_match('#^' . get_preg_expression('www_url') . '$#i', $url) || |
|
928 |
preg_match('#^' . preg_quote(generate_board_url(), '#') . get_preg_expression('relative_url') . '$#i', $url)) |
|
929 |
{
|
|
930 |
$valid = true; |
|
931 |
}
|
|
932 |
||
933 |
if ($valid) |
|
934 |
{
|
|
935 |
$this->parsed_items['url']++; |
|
936 |
||
937 |
// if there is no scheme, then add http schema
|
|
938 |
if (!preg_match('#^[a-z][a-z\d+\-.]*:/{2}#i', $url)) |
|
939 |
{
|
|
940 |
$url = 'http://' . $url; |
|
941 |
}
|
|
942 |
||
943 |
// Is this a link to somewhere inside this board? If so then remove the session id from the url
|
|
944 |
if (strpos($url, generate_board_url()) !== false && strpos($url, 'sid=') !== false) |
|
945 |
{
|
|
946 |
$url = preg_replace('/(&|\?)sid=[0-9a-f]{32}&/', '\1', $url); |
|
947 |
$url = preg_replace('/(&|\?)sid=[0-9a-f]{32}$/', '', $url); |
|
948 |
$url = append_sid($url); |
|
949 |
}
|
|
950 |
||
951 |
return ($var1) ? '[url=' . $this->bbcode_specialchars($url) . ':' . $this->bbcode_uid . ']' . $var2 . '[/url:' . $this->bbcode_uid . ']' : '[url:' . $this->bbcode_uid . ']' . $this->bbcode_specialchars($url) . '[/url:' . $this->bbcode_uid . ']'; |
|
952 |
}
|
|
953 |
||
954 |
return '[url' . (($var1) ? '=' . $var1 : '') . ']' . $var2 . '[/url]'; |
|
955 |
}
|
|
956 |
||
957 |
/**
|
|
958 |
* Check if url is pointing to this domain/script_path/php-file
|
|
959 |
*
|
|
960 |
* @param string $url the url to check
|
|
961 |
* @return true if the url is pointing to this domain/script_path/php-file, false if not
|
|
962 |
*
|
|
963 |
* @access private
|
|
964 |
*/
|
|
965 |
function path_in_domain($url) |
|
966 |
{
|
|
967 |
global $config, $phpEx, $user; |
|
968 |
||
969 |
if ($config['force_server_vars']) |
|
970 |
{
|
|
971 |
$check_path = $config['script_path']; |
|
972 |
}
|
|
973 |
else
|
|
974 |
{
|
|
975 |
$check_path = ($user->page['root_script_path'] != '/') ? substr($user->page['root_script_path'], 0, -1) : '/'; |
|
976 |
}
|
|
977 |
||
978 |
// Is the user trying to link to a php file in this domain and script path?
|
|
979 |
if (strpos($url, ".{$phpEx}") !== false && strpos($url, $check_path) !== false) |
|
980 |
{
|
|
981 |
$server_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'); |
|
982 |
||
983 |
// Forcing server vars is the only way to specify/override the protocol
|
|
984 |
if ($config['force_server_vars'] || !$server_name) |
|
985 |
{
|
|
986 |
$server_name = $config['server_name']; |
|
987 |
}
|
|
988 |
||
989 |
// Check again in correct order...
|
|
990 |
$pos_ext = strpos($url, ".{$phpEx}"); |
|
991 |
$pos_path = strpos($url, $check_path); |
|
992 |
$pos_domain = strpos($url, $server_name); |
|
993 |
||
994 |
if ($pos_domain !== false && $pos_path >= $pos_domain && $pos_ext >= $pos_path) |
|
995 |
{
|
|
996 |
// Ok, actually we allow linking to some files (this may be able to be extended in some way later...)
|
|
997 |
if (strpos($url, '/' . $check_path . '/download/file.' . $phpEx) !== 0) |
|
998 |
{
|
|
999 |
return false; |
|
1000 |
}
|
|
1001 |
||
1002 |
return true; |
|
1003 |
}
|
|
1004 |
}
|
|
1005 |
||
1006 |
return false; |
|
1007 |
}
|
|
1008 |
}
|
|
1009 |
||
1010 |
/**
|
|
1011 |
* Main message parser for posting, pm, etc. takes raw message
|
|
1012 |
* and parses it for attachments, bbcode and smilies
|
|
1013 |
* @package phpBB3
|
|
1014 |
*/
|
|
1015 |
class parse_message extends bbcode_firstpass |
|
1016 |
{
|
|
1017 |
var $attachment_data = array(); |
|
1018 |
var $filename_data = array(); |
|
1019 |
||
1020 |
// Helps ironing out user error
|
|
1021 |
var $message_status = ''; |
|
1022 |
||
1023 |
var $allow_img_bbcode = true; |
|
1024 |
var $allow_flash_bbcode = true; |
|
1025 |
var $allow_quote_bbcode = true; |
|
1026 |
var $allow_url_bbcode = true; |
|
1027 |
||
1028 |
var $mode; |
|
1029 |
||
1030 |
/**
|
|
1031 |
* Init - give message here or manually
|
|
1032 |
*/
|
|
1033 |
function parse_message($message = '') |
|
1034 |
{
|
|
1035 |
// Init BBCode UID
|
|
1036 |
$this->bbcode_uid = substr(base_convert(unique_id(), 16, 36), 0, BBCODE_UID_LEN); |
|
1037 |
||
1038 |
if ($message) |
|
1039 |
{
|
|
1040 |
$this->message = $message; |
|
1041 |
}
|
|
1042 |
}
|
|
1043 |
||
1044 |
/**
|
|
1045 |
* Parse Message
|
|
1046 |
*/
|
|
1047 |
function parse($allow_bbcode, $allow_magic_url, $allow_smilies, $allow_img_bbcode = true, $allow_flash_bbcode = true, $allow_quote_bbcode = true, $allow_url_bbcode = true, $update_this_message = true, $mode = 'post') |
|
1048 |
{
|
|
1049 |
global $config, $db, $user; |
|
1050 |
||
1051 |
$mode = ($mode != 'post') ? 'sig' : 'post'; |
|
1052 |
||
1053 |
$this->mode = $mode; |
|
1054 |
||
1055 |
$this->allow_img_bbcode = $allow_img_bbcode; |
|
1056 |
$this->allow_flash_bbcode = $allow_flash_bbcode; |
|
1057 |
$this->allow_quote_bbcode = $allow_quote_bbcode; |
|
1058 |
$this->allow_url_bbcode = $allow_url_bbcode; |
|
1059 |
||
1060 |
// If false, then $this->message won't be altered, the text will be returned instead.
|
|
1061 |
if (!$update_this_message) |
|
1062 |
{
|
|
1063 |
$tmp_message = $this->message; |
|
1064 |
$return_message = &$this->message; |
|
1065 |
}
|
|
1066 |
||
1067 |
if ($this->message_status == 'display') |
|
1068 |
{
|
|
1069 |
$this->decode_message(); |
|
1070 |
}
|
|
1071 |
||
1072 |
// Do some general 'cleanup' first before processing message,
|
|
1073 |
// e.g. remove excessive newlines(?), smilies(?)
|
|
1074 |
$match = array('#(script|about|applet|activex|chrome):#i'); |
|
1075 |
$replace = array("\\1:"); |
|
1076 |
$this->message = preg_replace($match, $replace, trim($this->message)); |
|
1077 |
||
1078 |
// Message length check. 0 disables this check completely.
|
|
1079 |
if ($config['max_' . $mode . '_chars'] > 0) |
|
1080 |
{
|
|
1081 |
$msg_len = ($mode == 'post') ? utf8_strlen($this->message) : utf8_strlen(preg_replace('#\[\/?[a-z\*\+\-]+(=[\S]+)?\]#ius', ' ', $this->message)); |
|
1082 |
||
1083 |
if ((!$msg_len && $mode !== 'sig') || $config['max_' . $mode . '_chars'] && $msg_len > $config['max_' . $mode . '_chars']) |
|
1084 |
{
|
|
1085 |
$this->warn_msg[] = (!$msg_len) ? $user->lang['TOO_FEW_CHARS'] : sprintf($user->lang['TOO_MANY_CHARS_' . strtoupper($mode)], $msg_len, $config['max_' . $mode . '_chars']); |
|
1086 |
return $this->warn_msg; |
|
1087 |
}
|
|
1088 |
}
|
|
1089 |
||
1090 |
// Check for "empty" message
|
|
1091 |
if ($mode !== 'sig' && !utf8_clean_string($this->message)) |
|
1092 |
{
|
|
1093 |
$this->warn_msg[] = $user->lang['TOO_FEW_CHARS']; |
|
1094 |
return $this->warn_msg; |
|
1095 |
}
|
|
1096 |
||
1097 |
// Prepare BBcode (just prepares some tags for better parsing)
|
|
1098 |
if ($allow_bbcode && strpos($this->message, '[') !== false) |
|
1099 |
{
|
|
1100 |
$this->bbcode_init(); |
|
1101 |
$disallow = array('img', 'flash', 'quote', 'url'); |
|
1102 |
foreach ($disallow as $bool) |
|
1103 |
{
|
|
1104 |
if (!${'allow_' . $bool . '_bbcode'}) |
|
1105 |
{
|
|
1106 |
$this->bbcodes[$bool]['disabled'] = true; |
|
1107 |
}
|
|
1108 |
}
|
|
1109 |
||
1110 |
$this->prepare_bbcodes(); |
|
1111 |
}
|
|
1112 |
||
1113 |
// Parse smilies
|
|
1114 |
if ($allow_smilies) |
|
1115 |
{
|
|
1116 |
$this->smilies($config['max_' . $mode . '_smilies']); |
|
1117 |
}
|
|
1118 |
||
1119 |
$num_urls = 0; |
|
1120 |
||
1121 |
// Parse BBCode
|
|
1122 |
if ($allow_bbcode && strpos($this->message, '[') !== false) |
|
1123 |
{
|
|
1124 |
$this->parse_bbcode(); |
|
1125 |
$num_urls += $this->parsed_items['url']; |
|
1126 |
}
|
|
1127 |
||
1128 |
// Parse URL's
|
|
1129 |
if ($allow_magic_url) |
|
1130 |
{
|
|
1131 |
$this->magic_url(generate_board_url()); |
|
1132 |
||
1133 |
if ($config['max_' . $mode . '_urls']) |
|
1134 |
{
|
|
1135 |
$num_urls += preg_match_all('#\<!-- ([lmwe]) --\>.*?\<!-- \1 --\>#', $this->message, $matches); |
|
1136 |
}
|
|
1137 |
}
|
|
1138 |
||
1139 |
// Check number of links
|
|
1140 |
if ($config['max_' . $mode . '_urls'] && $num_urls > $config['max_' . $mode . '_urls']) |
|
1141 |
{
|
|
1142 |
$this->warn_msg[] = sprintf($user->lang['TOO_MANY_URLS'], $config['max_' . $mode . '_urls']); |
|
1143 |
return $this->warn_msg; |
|
1144 |
}
|
|
1145 |
||
1146 |
if (!$update_this_message) |
|
1147 |
{
|
|
1148 |
unset($this->message); |
|
1149 |
$this->message = $tmp_message; |
|
1150 |
return $return_message; |
|
1151 |
}
|
|
1152 |
||
1153 |
$this->message_status = 'parsed'; |
|
1154 |
return false; |
|
1155 |
}
|
|
1156 |
||
1157 |
/**
|
|
1158 |
* Formatting text for display
|
|
1159 |
*/
|
|
1160 |
function format_display($allow_bbcode, $allow_magic_url, $allow_smilies, $update_this_message = true) |
|
1161 |
{
|
|
1162 |
// If false, then the parsed message get returned but internal message not processed.
|
|
1163 |
if (!$update_this_message) |
|
1164 |
{
|
|
1165 |
$tmp_message = $this->message; |
|
1166 |
$return_message = &$this->message; |
|
1167 |
}
|
|
1168 |
||
1169 |
if ($this->message_status == 'plain') |
|
1170 |
{
|
|
1171 |
// Force updating message - of course.
|
|
1172 |
$this->parse($allow_bbcode, $allow_magic_url, $allow_smilies, $this->allow_img_bbcode, $this->allow_flash_bbcode, $this->allow_quote_bbcode, $this->allow_url_bbcode, true); |
|
1173 |
}
|
|
1174 |
||
1175 |
// Replace naughty words such as farty pants
|
|
1176 |
$this->message = censor_text($this->message); |
|
1177 |
||
1178 |
// Parse BBcode
|
|
1179 |
if ($allow_bbcode) |
|
1180 |
{
|
|
1181 |
$this->bbcode_cache_init(); |
|
1182 |
||
1183 |
// We are giving those parameters to be able to use the bbcode class on its own
|
|
1184 |
$this->bbcode_second_pass($this->message, $this->bbcode_uid); |
|
1185 |
}
|
|
1186 |
||
1187 |
$this->message = bbcode_nl2br($this->message); |
|
1188 |
$this->message = smiley_text($this->message, !$allow_smilies); |
|
1189 |
||
1190 |
if (!$update_this_message) |
|
1191 |
{
|
|
1192 |
unset($this->message); |
|
1193 |
$this->message = $tmp_message; |
|
1194 |
return $return_message; |
|
1195 |
}
|
|
1196 |
||
1197 |
$this->message_status = 'display'; |
|
1198 |
return false; |
|
1199 |
}
|
|
1200 |
||
1201 |
/**
|
|
1202 |
* Decode message to be placed back into form box
|
|
1203 |
*/
|
|
1204 |
function decode_message($custom_bbcode_uid = '', $update_this_message = true) |
|
1205 |
{
|
|
1206 |
// If false, then the parsed message get returned but internal message not processed.
|
|
1207 |
if (!$update_this_message) |
|
1208 |
{
|
|
1209 |
$tmp_message = $this->message; |
|
1210 |
$return_message = &$this->message; |
|
1211 |
}
|
|
1212 |
||
1213 |
($custom_bbcode_uid) ? decode_message($this->message, $custom_bbcode_uid) : decode_message($this->message, $this->bbcode_uid); |
|
1214 |
||
1215 |
if (!$update_this_message) |
|
1216 |
{
|
|
1217 |
unset($this->message); |
|
1218 |
$this->message = $tmp_message; |
|
1219 |
return $return_message; |
|
1220 |
}
|
|
1221 |
||
1222 |
$this->message_status = 'plain'; |
|
1223 |
return false; |
|
1224 |
}
|
|
1225 |
||
1226 |
/**
|
|
1227 |
* Replace magic urls of form http://xxx.xxx., www.xxx. and xxx@xxx.xxx.
|
|
1228 |
* Cuts down displayed size of link if over 50 chars, turns absolute links
|
|
1229 |
* into relative versions when the server/script path matches the link
|
|
1230 |
*/
|
|
1231 |
function magic_url($server_url) |
|
1232 |
{
|
|
1233 |
// We use the global make_clickable function
|
|
1234 |
$this->message = make_clickable($this->message, $server_url); |
|
1235 |
}
|
|
1236 |
||
1237 |
/**
|
|
1238 |
* Parse Smilies
|
|
1239 |
*/
|
|
1240 |
function smilies($max_smilies = 0) |
|
1241 |
{
|
|
1242 |
global $db, $user; |
|
1243 |
static $match; |
|
1244 |
static $replace; |
|
1245 |
||
1246 |
// See if the static arrays have already been filled on an earlier invocation
|
|
1247 |
if (!is_array($match)) |
|
1248 |
{
|
|
1249 |
$match = $replace = array(); |
|
1250 |
||
1251 |
// NOTE: obtain_* function? chaching the table contents?
|
|
1252 |
||
1253 |
// For now setting the ttl to 10 minutes
|
|
1254 |
switch ($db->sql_layer) |
|
1255 |
{
|
|
1256 |
case 'mssql': |
|
1257 |
case 'mssql_odbc': |
|
1258 |
$sql = 'SELECT * |
|
1259 |
FROM ' . SMILIES_TABLE . ' |
|
1260 |
ORDER BY LEN(code) DESC'; |
|
1261 |
break; |
|
1262 |
||
1263 |
case 'firebird': |
|
1264 |
$sql = 'SELECT * |
|
1265 |
FROM ' . SMILIES_TABLE . ' |
|
1266 |
ORDER BY CHAR_LENGTH(code) DESC'; |
|
1267 |
break; |
|
1268 |
||
1269 |
// LENGTH supported by MySQL, IBM DB2, Oracle and Access for sure...
|
|
1270 |
default: |
|
1271 |
$sql = 'SELECT * |
|
1272 |
FROM ' . SMILIES_TABLE . ' |
|
1273 |
ORDER BY LENGTH(code) DESC'; |
|
1274 |
break; |
|
1275 |
}
|
|
1276 |
$result = $db->sql_query($sql, 600); |
|
1277 |
||
1278 |
while ($row = $db->sql_fetchrow($result)) |
|
1279 |
{
|
|
1280 |
if (empty($row['code'])) |
|
1281 |
{
|
|
1282 |
continue; |
|
1283 |
}
|
|
1284 |
||
1285 |
// (assertion)
|
|
1286 |
$match[] = '(?<=^|[\n .])' . preg_quote($row['code'], '#') . '(?![^<>]*>)'; |
|
1287 |
$replace[] = '<!-- s' . $row['code'] . ' --><img src="{SMILIES_PATH}/' . $row['smiley_url'] . '" alt="' . $row['code'] . '" title="' . $row['emotion'] . '" /><!-- s' . $row['code'] . ' -->'; |
|
1288 |
}
|
|
1289 |
$db->sql_freeresult($result); |
|
1290 |
}
|
|
1291 |
||
1292 |
if (sizeof($match)) |
|
1293 |
{
|
|
1294 |
if ($max_smilies) |
|
1295 |
{
|
|
1296 |
$num_matches = preg_match_all('#' . implode('|', $match) . '#', $this->message, $matches); |
|
1297 |
unset($matches); |
|
1298 |
||
1299 |
if ($num_matches !== false && $num_matches > $max_smilies) |
|
1300 |
{
|
|
1301 |
$this->warn_msg[] = sprintf($user->lang['TOO_MANY_SMILIES'], $max_smilies); |
|
1302 |
return; |
|
1303 |
}
|
|
1304 |
}
|
|
1305 |
||
1306 |
// Make sure the delimiter # is added in front and at the end of every element within $match
|
|
1307 |
$this->message = trim(preg_replace(explode(chr(0), '#' . implode('#' . chr(0) . '#', $match) . '#'), $replace, $this->message)); |
|
1308 |
}
|
|
1309 |
}
|
|
1310 |
||
1311 |
/**
|
|
1312 |
* Parse Attachments
|
|
1313 |
*/
|
|
1314 |
function parse_attachments($form_name, $mode, $forum_id, $submit, $preview, $refresh, $is_message = false) |
|
1315 |
{
|
|
1316 |
global $config, $auth, $user, $phpbb_root_path, $phpEx, $db; |
|
1317 |
||
1318 |
$error = array(); |
|
1319 |
||
1320 |
$num_attachments = sizeof($this->attachment_data); |
|
1321 |
$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true)); |
|
1322 |
$upload_file = (isset($_FILES[$form_name]) && $_FILES[$form_name]['name'] != 'none' && trim($_FILES[$form_name]['name'])) ? true : false; |
|
1323 |
||
1324 |
$add_file = (isset($_POST['add_file'])) ? true : false; |
|
1325 |
$delete_file = (isset($_POST['delete_file'])) ? true : false; |
|
1326 |
||
1327 |
// First of all adjust comments if changed
|
|
1328 |
$actual_comment_list = utf8_normalize_nfc(request_var('comment_list', array(''), true)); |
|
1329 |
||
1330 |
foreach ($actual_comment_list as $comment_key => $comment) |
|
1331 |
{
|
|
1332 |
if (!isset($this->attachment_data[$comment_key])) |
|
1333 |
{
|
|
1334 |
continue; |
|
1335 |
}
|
|
1336 |
||
1337 |
if ($this->attachment_data[$comment_key]['attach_comment'] != $actual_comment_list[$comment_key]) |
|
1338 |
{
|
|
1339 |
$this->attachment_data[$comment_key]['attach_comment'] = $actual_comment_list[$comment_key]; |
|
1340 |
}
|
|
1341 |
}
|
|
1342 |
||
1343 |
$cfg = array(); |
|
1344 |
$cfg['max_attachments'] = ($is_message) ? $config['max_attachments_pm'] : $config['max_attachments']; |
|
1345 |
$forum_id = ($is_message) ? 0 : $forum_id; |
|
1346 |
||
1347 |
if ($submit && in_array($mode, array('post', 'reply', 'quote', 'edit')) && $upload_file) |
|
1348 |
{
|
|
1349 |
if ($num_attachments < $cfg['max_attachments'] || $auth->acl_get('a_') || $auth->acl_get('m_', $forum_id)) |
|
1350 |
{
|
|
1351 |
$filedata = upload_attachment($form_name, $forum_id, false, '', $is_message); |
|
1352 |
$error = $filedata['error']; |
|
1353 |
||
1354 |
if ($filedata['post_attach'] && !sizeof($error)) |
|
1355 |
{
|
|
1356 |
$sql_ary = array( |
|
1357 |
'physical_filename' => $filedata['physical_filename'], |
|
1358 |
'attach_comment' => $this->filename_data['filecomment'], |
|
1359 |
'real_filename' => $filedata['real_filename'], |
|
1360 |
'extension' => $filedata['extension'], |
|
1361 |
'mimetype' => $filedata['mimetype'], |
|
1362 |
'filesize' => $filedata['filesize'], |
|
1363 |
'filetime' => $filedata['filetime'], |
|
1364 |
'thumbnail' => $filedata['thumbnail'], |
|
1365 |
'is_orphan' => 1, |
|
1366 |
'in_message' => ($is_message) ? 1 : 0, |
|
1367 |
'poster_id' => $user->data['user_id'], |
|
1368 |
);
|
|
1369 |
||
1370 |
$db->sql_query('INSERT INTO ' . ATTACHMENTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); |
|
1371 |
||
1372 |
$new_entry = array( |
|
1373 |
'attach_id' => $db->sql_nextid(), |
|
1374 |
'is_orphan' => 1, |
|
1375 |
'real_filename' => $filedata['real_filename'], |
|
1376 |
'attach_comment'=> $this->filename_data['filecomment'], |
|
1377 |
);
|
|
1378 |
||
1379 |
$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data); |
|
1380 |
$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message); |
|
1381 |
||
1382 |
$this->filename_data['filecomment'] = ''; |
|
1383 |
||
1384 |
// This Variable is set to false here, because Attachments are entered into the
|
|
1385 |
// Database in two modes, one if the id_list is 0 and the second one if post_attach is true
|
|
1386 |
// Since post_attach is automatically switched to true if an Attachment got added to the filesystem,
|
|
1387 |
// but we are assigning an id of 0 here, we have to reset the post_attach variable to false.
|
|
1388 |
//
|
|
1389 |
// This is very relevant, because it could happen that the post got not submitted, but we do not
|
|
1390 |
// know this circumstance here. We could be at the posting page or we could be redirected to the entered
|
|
1391 |
// post. :)
|
|
1392 |
$filedata['post_attach'] = false; |
|
1393 |
}
|
|
1394 |
}
|
|
1395 |
else
|
|
1396 |
{
|
|
1397 |
$error[] = sprintf($user->lang['TOO_MANY_ATTACHMENTS'], $cfg['max_attachments']); |
|
1398 |
}
|
|
1399 |
}
|
|
1400 |
||
1401 |
if ($preview || $refresh || sizeof($error)) |
|
1402 |
{
|
|
1403 |
// Perform actions on temporary attachments
|
|
1404 |
if ($delete_file) |
|
1405 |
{
|
|
1406 |
include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx); |
|
1407 |
||
1408 |
$index = array_keys(request_var('delete_file', array(0 => 0))); |
|
1409 |
$index = (!empty($index)) ? $index[0] : false; |
|
1410 |
||
1411 |
if ($index !== false && !empty($this->attachment_data[$index])) |
|
1412 |
{
|
|
1413 |
// delete selected attachment
|
|
1414 |
if ($this->attachment_data[$index]['is_orphan']) |
|
1415 |
{
|
|
1416 |
$sql = 'SELECT attach_id, physical_filename, thumbnail |
|
1417 |
FROM ' . ATTACHMENTS_TABLE . ' |
|
1418 |
WHERE attach_id = ' . (int) $this->attachment_data[$index]['attach_id'] . ' |
|
1419 |
AND is_orphan = 1
|
|
1420 |
AND poster_id = ' . $user->data['user_id']; |
|
1421 |
$result = $db->sql_query($sql); |
|
1422 |
$row = $db->sql_fetchrow($result); |
|
1423 |
$db->sql_freeresult($result); |
|
1424 |
||
1425 |
if ($row) |
|
1426 |
{
|
|
1427 |
phpbb_unlink($row['physical_filename'], 'file'); |
|
1428 |
||
1429 |
if ($row['thumbnail']) |
|
1430 |
{
|
|
1431 |
phpbb_unlink($row['physical_filename'], 'thumbnail'); |
|
1432 |
}
|
|
1433 |
||
1434 |
$db->sql_query('DELETE FROM ' . ATTACHMENTS_TABLE . ' WHERE attach_id = ' . (int) $this->attachment_data[$index]['attach_id']); |
|
1435 |
}
|
|
1436 |
}
|
|
1437 |
else
|
|
1438 |
{
|
|
1439 |
delete_attachments('attach', array(intval($this->attachment_data[$index]['attach_id']))); |
|
1440 |
}
|
|
1441 |
||
1442 |
unset($this->attachment_data[$index]); |
|
1443 |
$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "(\\1 == \$index) ? '' : ((\\1 > \$index) ? '[attachment=' . (\\1 - 1) . ']\\2[/attachment]' : '\\0')", $this->message); |
|
1444 |
||
1445 |
// Reindex Array
|
|
1446 |
$this->attachment_data = array_values($this->attachment_data); |
|
1447 |
}
|
|
1448 |
}
|
|
1449 |
else if (($add_file || $preview) && $upload_file) |
|
1450 |
{
|
|
1451 |
if ($num_attachments < $cfg['max_attachments'] || $auth->acl_gets('m_', 'a_', $forum_id)) |
|
1452 |
{
|
|
1453 |
$filedata = upload_attachment($form_name, $forum_id, false, '', $is_message); |
|
1454 |
$error = array_merge($error, $filedata['error']); |
|
1455 |
||
1456 |
if (!sizeof($error)) |
|
1457 |
{
|
|
1458 |
$sql_ary = array( |
|
1459 |
'physical_filename' => $filedata['physical_filename'], |
|
1460 |
'attach_comment' => $this->filename_data['filecomment'], |
|
1461 |
'real_filename' => $filedata['real_filename'], |
|
1462 |
'extension' => $filedata['extension'], |
|
1463 |
'mimetype' => $filedata['mimetype'], |
|
1464 |
'filesize' => $filedata['filesize'], |
|
1465 |
'filetime' => $filedata['filetime'], |
|
1466 |
'thumbnail' => $filedata['thumbnail'], |
|
1467 |
'is_orphan' => 1, |
|
1468 |
'in_message' => ($is_message) ? 1 : 0, |
|
1469 |
'poster_id' => $user->data['user_id'], |
|
1470 |
);
|
|
1471 |
||
1472 |
$db->sql_query('INSERT INTO ' . ATTACHMENTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); |
|
1473 |
||
1474 |
$new_entry = array( |
|
1475 |
'attach_id' => $db->sql_nextid(), |
|
1476 |
'is_orphan' => 1, |
|
1477 |
'real_filename' => $filedata['real_filename'], |
|
1478 |
'attach_comment'=> $this->filename_data['filecomment'], |
|
1479 |
);
|
|
1480 |
||
1481 |
$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data); |
|
1482 |
$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message); |
|
1483 |
$this->filename_data['filecomment'] = ''; |
|
1484 |
}
|
|
1485 |
}
|
|
1486 |
else
|
|
1487 |
{
|
|
1488 |
$error[] = sprintf($user->lang['TOO_MANY_ATTACHMENTS'], $cfg['max_attachments']); |
|
1489 |
}
|
|
1490 |
}
|
|
1491 |
}
|
|
1492 |
||
1493 |
foreach ($error as $error_msg) |
|
1494 |
{
|
|
1495 |
$this->warn_msg[] = $error_msg; |
|
1496 |
}
|
|
1497 |
}
|
|
1498 |
||
1499 |
/**
|
|
1500 |
* Get Attachment Data
|
|
1501 |
*/
|
|
1502 |
function get_submitted_attachment_data($check_user_id = false) |
|
1503 |
{
|
|
1504 |
global $user, $db, $phpbb_root_path, $phpEx, $config; |
|
1505 |
||
1506 |
$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true)); |
|
1507 |
$attachment_data = (isset($_POST['attachment_data'])) ? $_POST['attachment_data'] : array(); |
|
1508 |
$this->attachment_data = array(); |
|
1509 |
||
1510 |
$check_user_id = ($check_user_id === false) ? $user->data['user_id'] : $check_user_id; |
|
1511 |
||
1512 |
if (!sizeof($attachment_data)) |
|
1513 |
{
|
|
1514 |
return; |
|
1515 |
}
|
|
1516 |
||
1517 |
$not_orphan = $orphan = array(); |
|
1518 |
||
1519 |
foreach ($attachment_data as $pos => $var_ary) |
|
1520 |
{
|
|
1521 |
if ($var_ary['is_orphan']) |
|
1522 |
{
|
|
1523 |
$orphan[(int) $var_ary['attach_id']] = $pos; |
|
1524 |
}
|
|
1525 |
else
|
|
1526 |
{
|
|
1527 |
$not_orphan[(int) $var_ary['attach_id']] = $pos; |
|
1528 |
}
|
|
1529 |
}
|
|
1530 |
||
1531 |
// Regenerate already posted attachments
|
|
1532 |
if (sizeof($not_orphan)) |
|
1533 |
{
|
|
1534 |
// Get the attachment data, based on the poster id...
|
|
1535 |
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment |
|
1536 |
FROM ' . ATTACHMENTS_TABLE . ' |
|
1537 |
WHERE ' . $db->sql_in_set('attach_id', array_keys($not_orphan)) . ' |
|
1538 |
AND poster_id = ' . $check_user_id; |
|
1539 |
$result = $db->sql_query($sql); |
|
1540 |
||
1541 |
while ($row = $db->sql_fetchrow($result)) |
|
1542 |
{
|
|
1543 |
$pos = $not_orphan[$row['attach_id']]; |
|
1544 |
$this->attachment_data[$pos] = $row; |
|
1545 |
set_var($this->attachment_data[$pos]['attach_comment'], $_POST['attachment_data'][$pos]['attach_comment'], 'string', true); |
|
1546 |
||
1547 |
unset($not_orphan[$row['attach_id']]); |
|
1548 |
}
|
|
1549 |
$db->sql_freeresult($result); |
|
1550 |
}
|
|
1551 |
||
1552 |
if (sizeof($not_orphan)) |
|
1553 |
{
|
|
1554 |
trigger_error('NO_ACCESS_ATTACHMENT', E_USER_ERROR); |
|
1555 |
}
|
|
1556 |
||
1557 |
// Regenerate newly uploaded attachments
|
|
1558 |
if (sizeof($orphan)) |
|
1559 |
{
|
|
1560 |
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment |
|
1561 |
FROM ' . ATTACHMENTS_TABLE . ' |
|
1562 |
WHERE ' . $db->sql_in_set('attach_id', array_keys($orphan)) . ' |
|
1563 |
AND poster_id = ' . $user->data['user_id'] . ' |
|
1564 |
AND is_orphan = 1'; |
|
1565 |
$result = $db->sql_query($sql); |
|
1566 |
||
1567 |
while ($row = $db->sql_fetchrow($result)) |
|
1568 |
{
|
|
1569 |
$pos = $orphan[$row['attach_id']]; |
|
1570 |
$this->attachment_data[$pos] = $row; |
|
1571 |
set_var($this->attachment_data[$pos]['attach_comment'], $_POST['attachment_data'][$pos]['attach_comment'], 'string', true); |
|
1572 |
||
1573 |
unset($orphan[$row['attach_id']]); |
|
1574 |
}
|
|
1575 |
$db->sql_freeresult($result); |
|
1576 |
}
|
|
1577 |
||
1578 |
if (sizeof($orphan)) |
|
1579 |
{
|
|
1580 |
trigger_error('NO_ACCESS_ATTACHMENT', E_USER_ERROR); |
|
1581 |
}
|
|
1582 |
||
1583 |
ksort($this->attachment_data); |
|
1584 |
}
|
|
1585 |
||
1586 |
/**
|
|
1587 |
* Parse Poll
|
|
1588 |
*/
|
|
1589 |
function parse_poll(&$poll) |
|
1590 |
{
|
|
1591 |
global $auth, $user, $config; |
|
1592 |
||
1593 |
$poll_max_options = $poll['poll_max_options']; |
|
1594 |
||
1595 |
// Parse Poll Option text ;)
|
|
1596 |
$tmp_message = $this->message; |
|
1597 |
$this->message = $poll['poll_option_text']; |
|
1598 |
$bbcode_bitfield = $this->bbcode_bitfield; |
|
1599 |
||
1600 |
||
1601 |
$poll['poll_option_text'] = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false); |
|
1602 |
||
1603 |
$bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield)); |
|
1604 |
$this->message = $tmp_message; |
|
1605 |
||
1606 |
// Parse Poll Title
|
|
1607 |
$tmp_message = $this->message; |
|
1608 |
$this->message = $poll['poll_title']; |
|
1609 |
$this->bbcode_bitfield = $bbcode_bitfield; |
|
1610 |
||
1611 |
$poll['poll_options'] = explode("\n", trim($poll['poll_option_text'])); |
|
1612 |
$poll['poll_options_size'] = sizeof($poll['poll_options']); |
|
1613 |
||
1614 |
if (!$poll['poll_title'] && $poll['poll_options_size']) |
|
1615 |
{
|
|
1616 |
$this->warn_msg[] = $user->lang['NO_POLL_TITLE']; |
|
1617 |
}
|
|
1618 |
else
|
|
1619 |
{
|
|
1620 |
if (utf8_strlen(preg_replace('#\[\/?[a-z\*\+\-]+(=[\S]+)?\]#ius', ' ', $this->message)) > 100) |
|
1621 |
{
|
|
1622 |
$this->warn_msg[] = $user->lang['POLL_TITLE_TOO_LONG']; |
|
1623 |
}
|
|
1624 |
$poll['poll_title'] = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false); |
|
1625 |
if (strlen($poll['poll_title']) > 255) |
|
1626 |
{
|
|
1627 |
$this->warn_msg[] = $user->lang['POLL_TITLE_COMP_TOO_LONG']; |
|
1628 |
}
|
|
1629 |
}
|
|
1630 |
||
1631 |
$this->bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield)); |
|
1632 |
$this->message = $tmp_message; |
|
1633 |
unset($tmp_message); |
|
1634 |
||
1635 |
if (sizeof($poll['poll_options']) == 1) |
|
1636 |
{
|
|
1637 |
$this->warn_msg[] = $user->lang['TOO_FEW_POLL_OPTIONS']; |
|
1638 |
}
|
|
1639 |
else if ($poll['poll_options_size'] > (int) $config['max_poll_options']) |
|
1640 |
{
|
|
1641 |
$this->warn_msg[] = $user->lang['TOO_MANY_POLL_OPTIONS']; |
|
1642 |
}
|
|
1643 |
else if ($poll_max_options > $poll['poll_options_size']) |
|
1644 |
{
|
|
1645 |
$this->warn_msg[] = $user->lang['TOO_MANY_USER_OPTIONS']; |
|
1646 |
}
|
|
1647 |
||
1648 |
$poll['poll_max_options'] = ($poll['poll_max_options'] < 1) ? 1 : (($poll['poll_max_options'] > $config['max_poll_options']) ? $config['max_poll_options'] : $poll['poll_max_options']); |
|
1649 |
}
|
|
1650 |
}
|
|
1651 |
||
1652 |
?>
|