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

« back to all changes in this revision

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

  • Committer: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

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'