~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/message_parser.php

  • Committer: dcoles
  • Date: 2008-02-13 04:10:55 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:443
Added Forum application along with unmodifed version of phpBB3 "Olympus" 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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(=&quot;.*?&quot;)?\]\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(?:=&quot;(.*?)&quot;)?\](.+)\[/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('&lt;', '&gt;', '&#91;', '&#93;', '&#46;', '&#58;');
 
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('&lt;', '&gt;'), 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>', '', '', '&#91;', '&#93;', '&#46;', '&#58;');
 
417
 
 
418
                                if ($remove_tags)
 
419
                                {
 
420
                                        $str_from[] = '<span class="syntaxdefault">&lt;?php </span>';
 
421
                                        $str_to[] = '';
 
422
                                        $str_from[] = '<span class="syntaxdefault">&lt;?php&nbsp;';
 
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]+">)?\?&gt;(</span>)#', '$1&nbsp;$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++|&nbsp;)*+</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=&quot;(.*?)&quot;\]#ie', "'quote=&quot;' . str_replace(array('[', ']'), array('&#91;', '&#93;'), '\$1') . '&quot;]'", $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(?:=&quot;(.*?)&quot;)?$#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('&#91;', '&#93;'), array('[', ']'), $m[1]);
 
762
                                                $username = preg_replace('#\[(?!b|i|u|color|url|email|/b|/i|/u|/color|/url|/email)#iU', '&#91;$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=&quot;' . $username . '&quot;:' . $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=&quot;(.*?)#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('/(&amp;|\?)sid=[0-9a-f]{32}&amp;/', '\1', $url);
 
947
                                $url = preg_replace('/(&amp;|\?)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&#058;");
 
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
?>
 
 
b'\\ No newline at end of file'