Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

ucp_pm_compose.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 45.11 KiB


0001  <?php
0002  /**
0003  *
0004  * This file is part of the phpBB Forum Software package.
0005  *
0006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
0007  * @license GNU General Public License, version 2 (GPL-2.0)
0008  *
0009  * For full copyright and license information, please see
0010  * the docs/CREDITS.txt file.
0011  *
0012  */
0013   
0014  /**
0015  * @ignore
0016  */
0017  if (!defined('IN_PHPBB'))
0018  {
0019      exit;
0020  }
0021   
0022  /**
0023  * Compose private message
0024  * Called from ucp_pm with mode == 'compose'
0025  */
0026  function compose_pm($id, $mode, $action, $user_folders = array())
0027  {
0028      global $template, $db, $auth, $user, $cache;
0029      global $phpbb_root_path, $phpEx, $config;
0030      global $request, $phpbb_dispatcher, $phpbb_container;
0031   
0032      // Damn php and globals - i know, this is horrible
0033      // Needed for handle_message_list_actions()
0034      global $refresh, $submit, $preview;
0035   
0036      include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
0037      include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
0038      include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
0039   
0040      if (!$action)
0041      {
0042          $action = 'post';
0043      }
0044      add_form_key('ucp_pm_compose');
0045   
0046      // Grab only parameters needed here
0047      $to_user_id        = request_var('u', 0);
0048      $to_group_id    = request_var('g', 0);
0049      $msg_id            = request_var('p', 0);
0050      $draft_id        = request_var('d', 0);
0051      $lastclick        = request_var('lastclick', 0);
0052   
0053      // Reply to all triggered (quote/reply)
0054      $reply_to_all    = request_var('reply_to_all', 0);
0055   
0056      $address_list    = $request->variable('address_list', array('' => array(0 => '')));
0057   
0058      $submit        = (isset($_POST['post'])) ? true : false;
0059      $preview    = (isset($_POST['preview'])) ? true : false;
0060      $save        = (isset($_POST['save'])) ? true : false;
0061      $load        = (isset($_POST['load'])) ? true : false;
0062      $cancel        = (isset($_POST['cancel']) && !isset($_POST['save'])) ? true : false;
0063      $delete        = (isset($_POST['delete'])) ? true : false;
0064   
0065      $remove_u    = (isset($_REQUEST['remove_u'])) ? true : false;
0066      $remove_g    = (isset($_REQUEST['remove_g'])) ? true : false;
0067      $add_to        = (isset($_REQUEST['add_to'])) ? true : false;
0068      $add_bcc    = (isset($_REQUEST['add_bcc'])) ? true : false;
0069   
0070      $refresh    = isset($_POST['add_file']) || isset($_POST['delete_file']) || $save || $load
0071          || $remove_u || $remove_g || $add_to || $add_bcc;
0072   
0073      $action        = ($delete && !$preview && !$refresh && $submit) ? 'delete' : $action;
0074      $select_single = ($config['allow_mass_pm'] && $auth->acl_get('u_masspm')) ? false : true;
0075   
0076      $error = array();
0077      $current_time = time();
0078   
0079      // Was cancel pressed? If so then redirect to the appropriate page
0080      if ($cancel || ($current_time - $lastclick < 2 && $submit))
0081      {
0082          if ($msg_id)
0083          {
0084              redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=view&amp;action=view_message&amp;p=' . $msg_id));
0085          }
0086          redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm'));
0087      }
0088   
0089      // Since viewtopic.php language entries are used in several modes,
0090      // we include the language file here
0091      $user->add_lang('viewtopic');
0092   
0093      // Output PM_TO box if message composing
0094      if ($action != 'edit')
0095      {
0096          // Add groups to PM box
0097          if ($config['allow_mass_pm'] && $auth->acl_get('u_masspm_group'))
0098          {
0099              $sql = 'SELECT g.group_id, g.group_name, g.group_type
0100                  FROM ' . GROUPS_TABLE . ' g';
0101   
0102              if (!$auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
0103              {
0104                  $sql .= ' LEFT JOIN ' . USER_GROUP_TABLE . ' ug
0105                      ON (
0106                          g.group_id = ug.group_id
0107                          AND ug.user_id = ' . $user->data['user_id'] . '
0108                          AND ug.user_pending = 0
0109                      )
0110                      WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')';
0111              }
0112   
0113              $sql .= ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? ' WHERE ' : ' AND ';
0114   
0115              $sql .= 'g.group_receive_pm = 1
0116                  ORDER BY g.group_type DESC, g.group_name ASC';
0117              $result = $db->sql_query($sql);
0118   
0119              $group_options = '';
0120              while ($row = $db->sql_fetchrow($result))
0121              {
0122                  $group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
0123              }
0124              $db->sql_freeresult($result);
0125          }
0126   
0127          $template->assign_vars(array(
0128              'S_SHOW_PM_BOX'        => true,
0129              'S_ALLOW_MASS_PM'    => ($config['allow_mass_pm'] && $auth->acl_get('u_masspm')) ? true : false,
0130              'S_GROUP_OPTIONS'    => ($config['allow_mass_pm'] && $auth->acl_get('u_masspm_group')) ? $group_options : '',
0131              'U_FIND_USERNAME'    => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=searchuser&amp;form=postform&amp;field=username_list&amp;select_single=$select_single"),
0132          ));
0133      }
0134   
0135      $sql = '';
0136      $folder_id = 0;
0137   
0138      // What is all this following SQL for? Well, we need to know
0139      // some basic information in all cases before we do anything.
0140      switch ($action)
0141      {
0142          case 'post':
0143              if (!$auth->acl_get('u_sendpm'))
0144              {
0145                  trigger_error('NO_AUTH_SEND_MESSAGE');
0146              }
0147          break;
0148   
0149          case 'reply':
0150          case 'quote':
0151          case 'forward':
0152          case 'quotepost':
0153              if (!$msg_id)
0154              {
0155                  trigger_error('NO_MESSAGE');
0156              }
0157   
0158              if (!$auth->acl_get('u_sendpm'))
0159              {
0160                  trigger_error('NO_AUTH_SEND_MESSAGE');
0161              }
0162   
0163              if ($action == 'quotepost')
0164              {
0165                  $sql = 'SELECT p.post_id as msg_id, p.forum_id, p.post_text as message_text, p.poster_id as author_id, p.post_time as message_time, p.bbcode_bitfield, p.bbcode_uid, p.enable_sig, p.enable_smilies, p.enable_magic_url, t.topic_title as message_subject, u.username as quote_username
0166                      FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . " u
0167                      WHERE p.post_id = $msg_id
0168                          AND t.topic_id = p.topic_id
0169                          AND u.user_id = p.poster_id";
0170              }
0171              else
0172              {
0173                  $sql = 'SELECT t.folder_id, p.*, u.username as quote_username
0174                      FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p, ' . USERS_TABLE . ' u
0175                      WHERE t.user_id = ' . $user->data['user_id'] . "
0176                          AND p.author_id = u.user_id
0177                          AND t.msg_id = p.msg_id
0178                          AND p.msg_id = $msg_id";
0179              }
0180          break;
0181   
0182          case 'edit':
0183              if (!$msg_id)
0184              {
0185                  trigger_error('NO_MESSAGE');
0186              }
0187   
0188              // check for outbox (not read) status, we do not allow editing if one user already having the message
0189              $sql = 'SELECT p.*, t.folder_id
0190                  FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p
0191                  WHERE t.user_id = ' . $user->data['user_id'] . '
0192                      AND t.folder_id = ' . PRIVMSGS_OUTBOX . "
0193                      AND t.msg_id = $msg_id
0194                      AND t.msg_id = p.msg_id";
0195          break;
0196   
0197          case 'delete':
0198              if (!$auth->acl_get('u_pm_delete'))
0199              {
0200                  trigger_error('NO_AUTH_DELETE_MESSAGE');
0201              }
0202   
0203              if (!$msg_id)
0204              {
0205                  trigger_error('NO_MESSAGE');
0206              }
0207   
0208              $sql = 'SELECT msg_id, pm_unread, pm_new, author_id, folder_id
0209                  FROM ' . PRIVMSGS_TO_TABLE . '
0210                  WHERE user_id = ' . $user->data['user_id'] . "
0211                      AND msg_id = $msg_id";
0212          break;
0213   
0214          case 'smilies':
0215              generate_smilies('window', 0);
0216          break;
0217   
0218          default:
0219              trigger_error('NO_ACTION_MODE', E_USER_ERROR);
0220          break;
0221      }
0222   
0223      if ($action == 'forward' && (!$config['forward_pm'] || !$auth->acl_get('u_pm_forward')))
0224      {
0225          trigger_error('NO_AUTH_FORWARD_MESSAGE');
0226      }
0227   
0228      if ($action == 'edit' && !$auth->acl_get('u_pm_edit'))
0229      {
0230          trigger_error('NO_AUTH_EDIT_MESSAGE');
0231      }
0232   
0233      if ($sql)
0234      {
0235          /**
0236          * Alter sql query to get message for user to write the PM
0237          *
0238          * @event core.ucp_pm_compose_compose_pm_basic_info_query_before
0239          * @var    string    sql                        String with the query to be executed
0240          * @var    array    forum_list                List of forums that contain the posts
0241          * @var    int        visibility_const        Integer with one of the possible ITEM_* constant values
0242          * @var    int        msg_id                    topic_id in the page request
0243          * @var    int        to_user_id                The id of whom the message is to
0244          * @var    int        to_group_id                The id of the group whom the message is to
0245          * @var    bool    submit                    Whether the user is sending the PM or not
0246          * @var    bool    preview                    Whether the user is previewing the PM or not
0247          * @var    string    action                    One of: post, reply, quote, forward, quotepost, edit, delete, smilies
0248          * @var    bool    delete                    Whether the user is deleting the PM
0249          * @var    int        reply_to_all            Value of reply_to_all request variable.
0250          * @var    string    limit_time_sql            String with the SQL code to limit the time interval of the post (Note: May be empty string)
0251          * @var    string    sort_order_sql            String with the ORDER BY SQL code used in this query
0252          * @since 3.1.0-RC5
0253          */
0254          $vars = array(
0255              'sql',
0256              'forum_list',
0257              'visibility_const',
0258              'msg_id',
0259              'to_user_id',
0260              'to_group_id',
0261              'submit',
0262              'preview',
0263              'action',
0264              'delete',
0265              'reply_to_all',
0266              'limit_time_sql',
0267              'sort_order_sql',
0268          );
0269          extract($phpbb_dispatcher->trigger_event('core.ucp_pm_compose_compose_pm_basic_info_query_before', compact($vars)));
0270   
0271          $result = $db->sql_query($sql);
0272          $post = $db->sql_fetchrow($result);
0273          $db->sql_freeresult($result);
0274   
0275          if (!$post)
0276          {
0277              // If editing it could be the recipient already read the message...
0278              if ($action == 'edit')
0279              {
0280                  $sql = 'SELECT p.*, t.folder_id
0281                      FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p
0282                      WHERE t.user_id = ' . $user->data['user_id'] . "
0283                          AND t.msg_id = $msg_id
0284                          AND t.msg_id = p.msg_id";
0285                  $result = $db->sql_query($sql);
0286                  $post = $db->sql_fetchrow($result);
0287                  $db->sql_freeresult($result);
0288   
0289                  if ($post)
0290                  {
0291                      trigger_error('NO_EDIT_READ_MESSAGE');
0292                  }
0293              }
0294   
0295              trigger_error('NO_MESSAGE');
0296          }
0297   
0298          if ($action == 'quotepost')
0299          {
0300              if (($post['forum_id'] && !$auth->acl_get('f_read', $post['forum_id'])) || (!$post['forum_id'] && !$auth->acl_getf_global('f_read')))
0301              {
0302                  trigger_error('NOT_AUTHORISED');
0303              }
0304   
0305              /**
0306              * Get the result of querying for the post to be quoted in the pm message
0307              *
0308              * @event core.ucp_pm_compose_quotepost_query_after
0309              * @var    string    sql                    The original SQL used in the query
0310              * @var    array    post                Associative array with the data of the quoted post
0311              * @var    array    msg_id                The post_id that was searched to get the message for quoting
0312              * @var    int        visibility_const    Visibility of the quoted post (one of the possible ITEM_* constant values)
0313              * @var    int        topic_id            Topic ID of the quoted post
0314              * @var    int        to_user_id            Users the message is sent to
0315              * @var    int        to_group_id            Groups the message is sent to
0316              * @var    bool    submit                Whether the user is sending the PM or not
0317              * @var    bool    preview                Whether the user is previewing the PM or not
0318              * @var    string    action                One of: post, reply, quote, forward, quotepost, edit, delete, smilies
0319              * @var    bool    delete                If deleting message
0320              * @var    int        reply_to_all        Value of reply_to_all request variable.
0321              * @since 3.1.0-RC5
0322              */
0323              $vars = array(
0324                  'sql',
0325                  'post',
0326                  'msg_id',
0327                  'visibility_const',
0328                  'topic_id',
0329                  'to_user_id',
0330                  'to_group_id',
0331                  'submit',
0332                  'preview',
0333                  'action',
0334                  'delete',
0335                  'reply_to_all',
0336              );
0337              extract($phpbb_dispatcher->trigger_event('core.ucp_pm_compose_quotepost_query_after', compact($vars)));
0338   
0339              // Passworded forum?
0340              if ($post['forum_id'])
0341              {
0342                  $sql = 'SELECT forum_id, forum_name, forum_password
0343                      FROM ' . FORUMS_TABLE . '
0344                      WHERE forum_id = ' . (int) $post['forum_id'];
0345                  $result = $db->sql_query($sql);
0346                  $forum_data = $db->sql_fetchrow($result);
0347                  $db->sql_freeresult($result);
0348   
0349                  if (!empty($forum_data['forum_password']))
0350                  {
0351                      login_forum_box($forum_data);
0352                  }
0353              }
0354          }
0355   
0356          $msg_id            = (int) $post['msg_id'];
0357          $folder_id        = (isset($post['folder_id'])) ? $post['folder_id'] : 0;
0358          $message_text    = (isset($post['message_text'])) ? $post['message_text'] : '';
0359   
0360          if ((!$post['author_id'] || ($post['author_id'] == ANONYMOUS && $action != 'delete')) && $msg_id)
0361          {
0362              trigger_error('NO_AUTHOR');
0363          }
0364   
0365          if ($action == 'quotepost')
0366          {
0367              // Decode text for message display
0368              decode_message($message_text, $post['bbcode_uid']);
0369          }
0370   
0371          if ($action != 'delete')
0372          {
0373              $enable_urls = $post['enable_magic_url'];
0374              $enable_sig = (isset($post['enable_sig'])) ? $post['enable_sig'] : 0;
0375   
0376              $message_attachment = (isset($post['message_attachment'])) ? $post['message_attachment'] : 0;
0377              $message_subject = $post['message_subject'];
0378              $message_time = $post['message_time'];
0379              $bbcode_uid = $post['bbcode_uid'];
0380   
0381              $quote_username = (isset($post['quote_username'])) ? $post['quote_username'] : '';
0382              $icon_id = (isset($post['icon_id'])) ? $post['icon_id'] : 0;
0383   
0384              if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !sizeof($address_list) && !$refresh && !$submit && !$preview)
0385              {
0386                  // Add the original author as the recipient if quoting a post or only replying and not having checked "reply to all"
0387                  if ($action == 'quotepost' || !$reply_to_all)
0388                  {
0389                      $address_list = array('u' => array($post['author_id'] => 'to'));
0390                  }
0391                  else
0392                  {
0393                      // We try to include every previously listed member from the TO Header - Reply to all
0394                      $address_list = rebuild_header(array('to' => $post['to_address']));
0395   
0396                      // Add the author (if he is already listed then this is no shame (it will be overwritten))
0397                      $address_list['u'][$post['author_id']] = 'to';
0398   
0399                      // Now, make sure the user itself is not listed. ;)
0400                      if (isset($address_list['u'][$user->data['user_id']]))
0401                      {
0402                          unset($address_list['u'][$user->data['user_id']]);
0403                      }
0404                  }
0405              }
0406              else if ($action == 'edit' && !sizeof($address_list) && !$refresh && !$submit && !$preview)
0407              {
0408                  // Rebuild TO and BCC Header
0409                  $address_list = rebuild_header(array('to' => $post['to_address'], 'bcc' => $post['bcc_address']));
0410              }
0411   
0412              if ($action == 'quotepost')
0413              {
0414                  $check_value = 0;
0415              }
0416              else
0417              {
0418                  $check_value = (($post['enable_bbcode']+1) << 8) + (($post['enable_smilies']+1) << 4) + (($enable_urls+1) << 2) + (($post['enable_sig']+1) << 1);
0419              }
0420          }
0421      }
0422      else
0423      {
0424          $message_attachment = 0;
0425          $message_text = $message_subject = '';
0426   
0427          if ($to_user_id && $to_user_id != ANONYMOUS && $action == 'post')
0428          {
0429              $address_list['u'][$to_user_id] = 'to';
0430          }
0431          else if ($to_group_id && $action == 'post')
0432          {
0433              $address_list['g'][$to_group_id] = 'to';
0434          }
0435          $check_value = 0;
0436      }
0437   
0438      if (($to_group_id || isset($address_list['g'])) && (!$config['allow_mass_pm'] || !$auth->acl_get('u_masspm_group')))
0439      {
0440          trigger_error('NO_AUTH_GROUP_MESSAGE');
0441      }
0442   
0443      if ($action == 'edit' && !$refresh && !$preview && !$submit)
0444      {
0445          if (!($message_time > time() - ($config['pm_edit_time'] * 60) || !$config['pm_edit_time']))
0446          {
0447              trigger_error('CANNOT_EDIT_MESSAGE_TIME');
0448          }
0449      }
0450   
0451      if ($action == 'post')
0452      {
0453          $template->assign_var('S_NEW_MESSAGE', true);
0454      }
0455   
0456      if (!isset($icon_id))
0457      {
0458          $icon_id = 0;
0459      }
0460   
0461      $message_parser = new parse_message();
0462      $plupload = $phpbb_container->get('plupload');
0463      $message_parser->set_plupload($plupload);
0464   
0465      $message_parser->message = ($action == 'reply') ? '' : $message_text;
0466      unset($message_text);
0467   
0468      $s_action = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=$id&amp;mode=$mode&amp;action=$action", true, $user->session_id);
0469      $s_action .= (($folder_id) ? "&amp;f=$folder_id" : '') . (($msg_id) ? "&amp;p=$msg_id" : '');
0470   
0471      // Delete triggered ?
0472      if ($action == 'delete')
0473      {
0474          // Folder id has been determined by the SQL Statement
0475          // $folder_id = request_var('f', PRIVMSGS_NO_BOX);
0476   
0477          // Do we need to confirm ?
0478          if (confirm_box(true))
0479          {
0480              delete_pm($user->data['user_id'], $msg_id, $folder_id);
0481   
0482              // jump to next message in "history"? nope, not for the moment. But able to be included later.
0483              $meta_info = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;folder=$folder_id");
0484              $message = $user->lang['MESSAGE_DELETED'];
0485   
0486              meta_refresh(3, $meta_info);
0487              $message .= '<br /><br />' . sprintf($user->lang['RETURN_FOLDER'], '<a href="' . $meta_info . '">', '</a>');
0488              trigger_error($message);
0489          }
0490          else
0491          {
0492              $s_hidden_fields = array(
0493                  'p'            => $msg_id,
0494                  'f'            => $folder_id,
0495                  'action'    => 'delete'
0496              );
0497   
0498              // "{$phpbb_root_path}ucp.$phpEx?i=pm&amp;mode=compose"
0499              confirm_box(false, 'DELETE_MESSAGE', build_hidden_fields($s_hidden_fields));
0500          }
0501   
0502          redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=view&amp;action=view_message&amp;p=' . $msg_id));
0503      }
0504   
0505      // Get maximum number of allowed recipients
0506      $sql = 'SELECT MAX(g.group_max_recipients) as max_recipients
0507          FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
0508          WHERE ug.user_id = ' . $user->data['user_id'] . '
0509              AND ug.user_pending = 0
0510              AND ug.group_id = g.group_id';
0511      $result = $db->sql_query($sql);
0512      $max_recipients = (int) $db->sql_fetchfield('max_recipients');
0513      $db->sql_freeresult($result);
0514   
0515      $max_recipients = (!$max_recipients) ? $config['pm_max_recipients'] : $max_recipients;
0516   
0517      // If this is a quote/reply "to all"... we may increase the max_recpients to the number of original recipients
0518      if (($action == 'reply' || $action == 'quote') && $max_recipients && $reply_to_all)
0519      {
0520          // We try to include every previously listed member from the TO Header
0521          $list = rebuild_header(array('to' => $post['to_address']));
0522   
0523          // Can be an empty array too ;)
0524          $list = (!empty($list['u'])) ? $list['u'] : array();
0525          $list[$post['author_id']] = 'to';
0526   
0527          if (isset($list[$user->data['user_id']]))
0528          {
0529              unset($list[$user->data['user_id']]);
0530          }
0531   
0532          $max_recipients = ($max_recipients < sizeof($list)) ? sizeof($list) : $max_recipients;
0533   
0534          unset($list);
0535      }
0536   
0537      // Handle User/Group adding/removing
0538      handle_message_list_actions($address_list, $error, $remove_u, $remove_g, $add_to, $add_bcc);
0539   
0540      // Check mass pm to group permission
0541      if ((!$config['allow_mass_pm'] || !$auth->acl_get('u_masspm_group')) && !empty($address_list['g']))
0542      {
0543          $address_list = array();
0544          $error[] = $user->lang['NO_AUTH_GROUP_MESSAGE'];
0545      }
0546   
0547      // Check mass pm to users permission
0548      if ((!$config['allow_mass_pm'] || !$auth->acl_get('u_masspm')) && num_recipients($address_list) > 1)
0549      {
0550          $address_list = get_recipients($address_list, 1);
0551          $error[] = $user->lang('TOO_MANY_RECIPIENTS', 1);
0552      }
0553   
0554      // Check for too many recipients
0555      if (!empty($address_list['u']) && $max_recipients && sizeof($address_list['u']) > $max_recipients)
0556      {
0557          $address_list = get_recipients($address_list, $max_recipients);
0558          $error[] = $user->lang('TOO_MANY_RECIPIENTS', $max_recipients);
0559      }
0560   
0561      // Always check if the submitted attachment data is valid and belongs to the user.
0562      // Further down (especially in submit_post()) we do not check this again.
0563      $message_parser->get_submitted_attachment_data();
0564   
0565      if ($message_attachment && !$submit && !$refresh && !$preview && $action == 'edit')
0566      {
0567          // Do not change to SELECT *
0568          $sql = 'SELECT attach_id, is_orphan, attach_comment, real_filename, filesize
0569              FROM ' . ATTACHMENTS_TABLE . "
0570              WHERE post_msg_id = $msg_id
0571                  AND in_message = 1
0572                  AND is_orphan = 0
0573              ORDER BY filetime DESC";
0574          $result = $db->sql_query($sql);
0575          $message_parser->attachment_data = array_merge($message_parser->attachment_data, $db->sql_fetchrowset($result));
0576          $db->sql_freeresult($result);
0577      }
0578   
0579      if (!in_array($action, array('quote', 'edit', 'delete', 'forward')))
0580      {
0581          $enable_sig        = ($config['allow_sig'] && $config['allow_sig_pm'] && $auth->acl_get('u_sig') && $user->optionget('attachsig'));
0582          $enable_smilies    = ($config['allow_smilies'] && $auth->acl_get('u_pm_smilies') && $user->optionget('smilies'));
0583          $enable_bbcode    = ($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode') && $user->optionget('bbcode'));
0584          $enable_urls    = true;
0585      }
0586   
0587      $enable_magic_url = $drafts = false;
0588   
0589      // User own some drafts?
0590      if ($auth->acl_get('u_savedrafts') && $action != 'delete')
0591      {
0592          $sql = 'SELECT draft_id
0593              FROM ' . DRAFTS_TABLE . '
0594              WHERE forum_id = 0
0595                  AND topic_id = 0
0596                  AND user_id = ' . $user->data['user_id'] .
0597                  (($draft_id) ? " AND draft_id <> $draft_id" : '');
0598          $result = $db->sql_query_limit($sql, 1);
0599          $row = $db->sql_fetchrow($result);
0600          $db->sql_freeresult($result);
0601   
0602          if ($row)
0603          {
0604              $drafts = true;
0605          }
0606      }
0607   
0608      if ($action == 'edit')
0609      {
0610          $message_parser->bbcode_uid = $bbcode_uid;
0611      }
0612   
0613      $bbcode_status    = ($config['allow_bbcode'] && $config['auth_bbcode_pm'] && $auth->acl_get('u_pm_bbcode')) ? true : false;
0614      $smilies_status    = ($config['allow_smilies'] && $config['auth_smilies_pm'] && $auth->acl_get('u_pm_smilies')) ? true : false;
0615      $img_status        = ($config['auth_img_pm'] && $auth->acl_get('u_pm_img')) ? true : false;
0616      $flash_status    = ($config['auth_flash_pm'] && $auth->acl_get('u_pm_flash')) ? true : false;
0617      $url_status        = ($config['allow_post_links']) ? true : false;
0618   
0619      // Save Draft
0620      if ($save && $auth->acl_get('u_savedrafts'))
0621      {
0622          $subject = utf8_normalize_nfc(request_var('subject', '', true));
0623          $subject = (!$subject && $action != 'post') ? $user->lang['NEW_MESSAGE'] : $subject;
0624          $message = utf8_normalize_nfc(request_var('message', '', true));
0625   
0626          if ($subject && $message)
0627          {
0628              if (confirm_box(true))
0629              {
0630                  $sql = 'INSERT INTO ' . DRAFTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
0631                      'user_id'        => $user->data['user_id'],
0632                      'topic_id'        => 0,
0633                      'forum_id'        => 0,
0634                      'save_time'        => $current_time,
0635                      'draft_subject'    => $subject,
0636                      'draft_message'    => $message
0637                      )
0638                  );
0639                  $db->sql_query($sql);
0640   
0641                  $redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=$mode");
0642   
0643                  meta_refresh(3, $redirect_url);
0644                  $message = $user->lang['DRAFT_SAVED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $redirect_url . '">', '</a>');
0645   
0646                  trigger_error($message);
0647              }
0648              else
0649              {
0650                  $s_hidden_fields = build_hidden_fields(array(
0651                      'mode'        => $mode,
0652                      'action'    => $action,
0653                      'save'        => true,
0654                      'subject'    => $subject,
0655                      'message'    => $message,
0656                      'u'            => $to_user_id,
0657                      'g'            => $to_group_id,
0658                      'p'            => $msg_id)
0659                  );
0660                  $s_hidden_fields .= build_address_field($address_list);
0661   
0662                  confirm_box(false, 'SAVE_DRAFT', $s_hidden_fields);
0663              }
0664          }
0665          else
0666          {
0667              if (utf8_clean_string($subject) === '')
0668              {
0669                  $error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
0670              }
0671   
0672              if (utf8_clean_string($message) === '')
0673              {
0674                  $error[] = $user->lang['TOO_FEW_CHARS'];
0675              }
0676          }
0677   
0678          unset($subject, $message);
0679      }
0680   
0681      // Load Draft
0682      if ($draft_id && $auth->acl_get('u_savedrafts'))
0683      {
0684          $sql = 'SELECT draft_subject, draft_message
0685              FROM ' . DRAFTS_TABLE . "
0686              WHERE draft_id = $draft_id
0687                  AND topic_id = 0
0688                  AND forum_id = 0
0689                  AND user_id = " . $user->data['user_id'];
0690          $result = $db->sql_query_limit($sql, 1);
0691   
0692          if ($row = $db->sql_fetchrow($result))
0693          {
0694              $message_parser->message = $row['draft_message'];
0695              $message_subject = $row['draft_subject'];
0696   
0697              $template->assign_var('S_DRAFT_LOADED', true);
0698          }
0699          else
0700          {
0701              $draft_id = 0;
0702          }
0703          $db->sql_freeresult($result);
0704      }
0705   
0706      // Load Drafts
0707      if ($load && $drafts)
0708      {
0709          load_drafts(0, 0, $id, $action, $msg_id);
0710      }
0711   
0712      if ($submit || $preview || $refresh)
0713      {
0714          if (($submit || $preview) && !check_form_key('ucp_pm_compose'))
0715          {
0716              $error[] = $user->lang['FORM_INVALID'];
0717          }
0718          $subject = utf8_normalize_nfc(request_var('subject', '', true));
0719          $message_parser->message = utf8_normalize_nfc(request_var('message', '', true));
0720   
0721          $icon_id            = request_var('icon', 0);
0722   
0723          $enable_bbcode         = (!$bbcode_status || isset($_POST['disable_bbcode'])) ? false : true;
0724          $enable_smilies        = (!$smilies_status || isset($_POST['disable_smilies'])) ? false : true;
0725          $enable_urls         = (isset($_POST['disable_magic_url'])) ? 0 : 1;
0726          $enable_sig            = (!$config['allow_sig'] ||!$config['allow_sig_pm']) ? false : ((isset($_POST['attach_sig'])) ? true : false);
0727   
0728          if ($submit)
0729          {
0730              $status_switch    = (($enable_bbcode+1) << 8) + (($enable_smilies+1) << 4) + (($enable_urls+1) << 2) + (($enable_sig+1) << 1);
0731              $status_switch = ($status_switch != $check_value);
0732          }
0733          else
0734          {
0735              $status_switch = 1;
0736          }
0737   
0738          // Parse Attachments - before checksum is calculated
0739          $message_parser->parse_attachments('fileupload', $action, 0, $submit, $preview, $refresh, true);
0740   
0741          if (sizeof($message_parser->warn_msg) && !($remove_u || $remove_g || $add_to || $add_bcc))
0742          {
0743              $error[] = implode('<br />', $message_parser->warn_msg);
0744              $message_parser->warn_msg = array();
0745          }
0746   
0747          // Parse message
0748          $message_parser->parse($enable_bbcode, ($config['allow_post_links']) ? $enable_urls : false, $enable_smilies, $img_status, $flash_status, true, $config['allow_post_links']);
0749   
0750          // On a refresh we do not care about message parsing errors
0751          if (sizeof($message_parser->warn_msg) && !$refresh)
0752          {
0753              $error[] = implode('<br />', $message_parser->warn_msg);
0754          }
0755   
0756          if ($action != 'edit' && !$preview && !$refresh && $config['flood_interval'] && !$auth->acl_get('u_ignoreflood'))
0757          {
0758              // Flood check
0759              $last_post_time = $user->data['user_lastpost_time'];
0760   
0761              if ($last_post_time)
0762              {
0763                  if ($last_post_time && ($current_time - $last_post_time) < intval($config['flood_interval']))
0764                  {
0765                      $error[] = $user->lang['FLOOD_ERROR'];
0766                  }
0767              }
0768          }
0769   
0770          // Subject defined
0771          if ($submit)
0772          {
0773              if (utf8_clean_string($subject) === '')
0774              {
0775                  $error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
0776              }
0777   
0778              if (!sizeof($address_list))
0779              {
0780                  $error[] = $user->lang['NO_RECIPIENT'];
0781              }
0782          }
0783   
0784          // Store message, sync counters
0785          if (!sizeof($error) && $submit)
0786          {
0787              $pm_data = array(
0788                  'msg_id'                => (int) $msg_id,
0789                  'from_user_id'            => $user->data['user_id'],
0790                  'from_user_ip'            => $user->ip,
0791                  'from_username'            => $user->data['username'],
0792                  'reply_from_root_level'    => (isset($post['root_level'])) ? (int) $post['root_level'] : 0,
0793                  'reply_from_msg_id'        => (int) $msg_id,
0794                  'icon_id'                => (int) $icon_id,
0795                  'enable_sig'            => (bool) $enable_sig,
0796                  'enable_bbcode'            => (bool) $enable_bbcode,
0797                  'enable_smilies'        => (bool) $enable_smilies,
0798                  'enable_urls'            => (bool) $enable_urls,
0799                  'bbcode_bitfield'        => $message_parser->bbcode_bitfield,
0800                  'bbcode_uid'            => $message_parser->bbcode_uid,
0801                  'message'                => $message_parser->message,
0802                  'attachment_data'        => $message_parser->attachment_data,
0803                  'filename_data'            => $message_parser->filename_data,
0804                  'address_list'            => $address_list
0805              );
0806   
0807              // ((!$message_subject) ? $subject : $message_subject)
0808              $msg_id = submit_pm($action, $subject, $pm_data);
0809   
0810              $return_message_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=view&amp;p=' . $msg_id);
0811              $inbox_folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=inbox');
0812              $outbox_folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=outbox');
0813   
0814              $folder_url = '';
0815              if (($folder_id > 0) && isset($user_folders[$folder_id]))
0816              {
0817                  $folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $folder_id);
0818              }
0819   
0820              $return_box_url = ($action === 'post' || $action === 'edit') ? $outbox_folder_url : $inbox_folder_url;
0821              $return_box_lang = ($action === 'post' || $action === 'edit') ? 'PM_OUTBOX' : 'PM_INBOX';
0822   
0823              $save_message = ($action === 'edit') ? $user->lang['MESSAGE_EDITED'] : $user->lang['MESSAGE_STORED'];
0824              $message = $save_message . '<br /><br />' . $user->lang('VIEW_PRIVATE_MESSAGE', '<a href="' . $return_message_url . '">', '</a>');
0825   
0826              $last_click_type = 'CLICK_RETURN_FOLDER';
0827              if ($folder_url)
0828              {
0829                  $message .= '<br /><br />' . sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . $folder_url . '">', '</a>', $user_folders[$folder_id]['folder_name']);
0830                  $last_click_type = 'CLICK_GOTO_FOLDER';
0831              }
0832              $message .= '<br /><br />' . sprintf($user->lang[$last_click_type], '<a href="' . $return_box_url . '">', '</a>', $user->lang[$return_box_lang]);
0833   
0834              meta_refresh(3, $return_message_url);
0835              trigger_error($message);
0836          }
0837   
0838          $message_subject = $subject;
0839      }
0840   
0841      // Preview
0842      if (!sizeof($error) && $preview)
0843      {
0844          $preview_message = $message_parser->format_display($enable_bbcode, $enable_urls, $enable_smilies, false);
0845   
0846          $preview_signature = $user->data['user_sig'];
0847          $preview_signature_uid = $user->data['user_sig_bbcode_uid'];
0848          $preview_signature_bitfield = $user->data['user_sig_bbcode_bitfield'];
0849   
0850          // Signature
0851          if ($enable_sig && $config['allow_sig'] && $preview_signature)
0852          {
0853              $parse_sig = new parse_message($preview_signature);
0854              $parse_sig->bbcode_uid = $preview_signature_uid;
0855              $parse_sig->bbcode_bitfield = $preview_signature_bitfield;
0856   
0857              $parse_sig->format_display($config['allow_sig_bbcode'], $config['allow_sig_links'], $config['allow_sig_smilies']);
0858              $preview_signature = $parse_sig->message;
0859              unset($parse_sig);
0860          }
0861          else
0862          {
0863              $preview_signature = '';
0864          }
0865   
0866          // Attachment Preview
0867          if (sizeof($message_parser->attachment_data))
0868          {
0869              $template->assign_var('S_HAS_ATTACHMENTS', true);
0870   
0871              $update_count = array();
0872              $attachment_data = $message_parser->attachment_data;
0873   
0874              parse_attachments(false, $preview_message, $attachment_data, $update_count, true);
0875   
0876              foreach ($attachment_data as $i => $attachment)
0877              {
0878                  $template->assign_block_vars('attachment', array(
0879                      'DISPLAY_ATTACHMENT'    => $attachment)
0880                  );
0881              }
0882              unset($attachment_data);
0883          }
0884   
0885          $preview_subject = censor_text($subject);
0886   
0887          if (!sizeof($error))
0888          {
0889              $template->assign_vars(array(
0890                  'PREVIEW_SUBJECT'        => $preview_subject,
0891                  'PREVIEW_MESSAGE'        => $preview_message,
0892                  'PREVIEW_SIGNATURE'        => $preview_signature,
0893   
0894                  'S_DISPLAY_PREVIEW'        => true)
0895              );
0896          }
0897          unset($message_text);
0898      }
0899   
0900      // Decode text for message display
0901      $bbcode_uid = (($action == 'quote' || $action == 'forward') && !$preview && !$refresh && (!sizeof($error) || (sizeof($error) && !$submit))) ? $bbcode_uid : $message_parser->bbcode_uid;
0902   
0903      $message_parser->decode_message($bbcode_uid);
0904   
0905      if (($action == 'quote' || $action == 'quotepost') && !$preview && !$refresh && !$submit)
0906      {
0907          if ($action == 'quotepost')
0908          {
0909              $post_id = request_var('p', 0);
0910              if ($config['allow_post_links'])
0911              {
0912                  $message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}[/url]\n\n";
0913              }
0914              else
0915              {
0916                  $message_link = $user->lang['SUBJECT'] . $user->lang['COLON'] . ' ' . $message_subject . " (" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id})\n\n";
0917              }
0918          }
0919          else
0920          {
0921              $message_link = '';
0922          }
0923          $message_parser->message = $message_link . '[quote=&quot;' . $quote_username . '&quot;]' . censor_text(trim($message_parser->message)) . "[/quote]\n";
0924      }
0925   
0926      if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh)
0927      {
0928          $message_subject = ((!preg_match('/^Re:/', $message_subject)) ? 'Re: ' : '') . censor_text($message_subject);
0929      }
0930   
0931      if ($action == 'forward' && !$preview && !$refresh && !$submit)
0932      {
0933          $fwd_to_field = write_pm_addresses(array('to' => $post['to_address']), 0, true);
0934   
0935          if ($config['allow_post_links'])
0936          {
0937              $quote_username_text = '[url=' . generate_board_url() . "/memberlist.$phpEx?mode=viewprofile&amp;u={$post['author_id']}]{$quote_username}[/url]";
0938          }
0939          else
0940          {
0941              $quote_username_text = $quote_username . ' (' . generate_board_url() . "/memberlist.$phpEx?mode=viewprofile&amp;u={$post['author_id']})";
0942          }
0943   
0944          $forward_text = array();
0945          $forward_text[] = $user->lang['FWD_ORIGINAL_MESSAGE'];
0946          $forward_text[] = sprintf($user->lang['FWD_SUBJECT'], censor_text($message_subject));
0947          $forward_text[] = sprintf($user->lang['FWD_DATE'], $user->format_date($message_time, false, true));
0948          $forward_text[] = sprintf($user->lang['FWD_FROM'], $quote_username_text);
0949          $forward_text[] = sprintf($user->lang['FWD_TO'], implode($user->lang['COMMA_SEPARATOR'], $fwd_to_field['to']));
0950   
0951          $message_parser->message = implode("\n", $forward_text) . "\n\n[quote=&quot;{$quote_username}&quot;]\n" . censor_text(trim($message_parser->message)) . "\n[/quote]";
0952          $message_subject = ((!preg_match('/^Fwd:/', $message_subject)) ? 'Fwd: ' : '') . censor_text($message_subject);
0953      }
0954   
0955      $attachment_data = $message_parser->attachment_data;
0956      $filename_data = $message_parser->filename_data;
0957      $message_text = $message_parser->message;
0958   
0959      // MAIN PM PAGE BEGINS HERE
0960   
0961      // Generate smiley listing
0962      generate_smilies('inline', 0);
0963   
0964      // Generate PM Icons
0965      $s_pm_icons = false;
0966      if ($config['enable_pm_icons'])
0967      {
0968          $s_pm_icons = posting_gen_topic_icons($action, $icon_id);
0969      }
0970   
0971      // Generate inline attachment select box
0972      posting_gen_inline_attachments($attachment_data);
0973   
0974      // Build address list for display
0975      // array('u' => array($author_id => 'to'));
0976      if (sizeof($address_list))
0977      {
0978          // Get Usernames and Group Names
0979          $result = array();
0980          if (!empty($address_list['u']))
0981          {
0982              $sql = 'SELECT user_id as id, username as name, user_colour as colour
0983                  FROM ' . USERS_TABLE . '
0984                  WHERE ' . $db->sql_in_set('user_id', array_map('intval', array_keys($address_list['u']))) . '
0985                  ORDER BY username_clean ASC';
0986              $result['u'] = $db->sql_query($sql);
0987          }
0988   
0989          if (!empty($address_list['g']))
0990          {
0991              $sql = 'SELECT g.group_id AS id, g.group_name AS name, g.group_colour AS colour, g.group_type
0992                  FROM ' . GROUPS_TABLE . ' g';
0993   
0994              if (!$auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
0995              {
0996                  $sql .= ' LEFT JOIN ' . USER_GROUP_TABLE . ' ug
0997                      ON (
0998                          g.group_id = ug.group_id
0999                          AND ug.user_id = ' . $user->data['user_id'] . '
1000                          AND ug.user_pending = 0
1001                      )
1002                      WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')';
1003              }
1004   
1005              $sql .= ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? ' WHERE ' : ' AND ';
1006   
1007              $sql .= 'g.group_receive_pm = 1
1008                  AND ' . $db->sql_in_set('g.group_id', array_map('intval', array_keys($address_list['g']))) . '
1009                  ORDER BY g.group_name ASC';
1010   
1011              $result['g'] = $db->sql_query($sql);
1012          }
1013   
1014          $u = $g = array();
1015          $_types = array('u', 'g');
1016          foreach ($_types as $type)
1017          {
1018              if (isset($result[$type]) && $result[$type])
1019              {
1020                  while ($row = $db->sql_fetchrow($result[$type]))
1021                  {
1022                      if ($type == 'g')
1023                      {
1024                          $row['name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['name']] : $row['name'];
1025                      }
1026   
1027                      ${$type}[$row['id']] = array('name' => $row['name'], 'colour' => $row['colour']);
1028                  }
1029                  $db->sql_freeresult($result[$type]);
1030              }
1031          }
1032   
1033          // Now Build the address list
1034          $plain_address_field = '';
1035          foreach ($address_list as $type => $adr_ary)
1036          {
1037              foreach ($adr_ary as $id => $field)
1038              {
1039                  if (!isset(${$type}[$id]))
1040                  {
1041                      unset($address_list[$type][$id]);
1042                      continue;
1043                  }
1044   
1045                  $field = ($field == 'to') ? 'to' : 'bcc';
1046                  $type = ($type == 'u') ? 'u' : 'g';
1047                  $id = (int) $id;
1048   
1049                  $tpl_ary = array(
1050                      'IS_GROUP'    => ($type == 'g') ? true : false,
1051                      'IS_USER'    => ($type == 'u') ? true : false,
1052                      'UG_ID'        => $id,
1053                      'NAME'        => ${$type}[$id]['name'],
1054                      'COLOUR'    => (${$type}[$id]['colour']) ? '#' . ${$type}[$id]['colour'] : '',
1055                      'TYPE'        => $type,
1056                  );
1057   
1058                  if ($type == 'u')
1059                  {
1060                      $tpl_ary = array_merge($tpl_ary, array(
1061                          'U_VIEW'        => get_username_string('profile', $id, ${$type}[$id]['name'], ${$type}[$id]['colour']),
1062                          'NAME_FULL'        => get_username_string('full', $id, ${$type}[$id]['name'], ${$type}[$id]['colour']),
1063                      ));
1064                  }
1065                  else
1066                  {
1067                      $tpl_ary = array_merge($tpl_ary, array(
1068                          'U_VIEW'        => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $id),
1069                      ));
1070                  }
1071   
1072                  $template->assign_block_vars($field . '_recipient', $tpl_ary);
1073              }
1074          }
1075      }
1076   
1077      // Build hidden address list
1078      $s_hidden_address_field = build_address_field($address_list);
1079   
1080      $bbcode_checked        = (isset($enable_bbcode)) ? !$enable_bbcode : (($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode')) ? !$user->optionget('bbcode') : 1);
1081      $smilies_checked    = (isset($enable_smilies)) ? !$enable_smilies : (($config['allow_smilies'] && $auth->acl_get('u_pm_smilies')) ? !$user->optionget('smilies') : 1);
1082      $urls_checked        = (isset($enable_urls)) ? !$enable_urls : 0;
1083      $sig_checked        = $enable_sig;
1084   
1085      switch ($action)
1086      {
1087          case 'post':
1088              $page_title = $user->lang['POST_NEW_PM'];
1089          break;
1090   
1091          case 'quote':
1092              $page_title = $user->lang['POST_QUOTE_PM'];
1093          break;
1094   
1095          case 'quotepost':
1096              $page_title = $user->lang['POST_PM_POST'];
1097          break;
1098   
1099          case 'reply':
1100              $page_title = $user->lang['POST_REPLY_PM'];
1101          break;
1102   
1103          case 'edit':
1104              $page_title = $user->lang['POST_EDIT_PM'];
1105          break;
1106   
1107          case 'forward':
1108              $page_title = $user->lang['POST_FORWARD_PM'];
1109          break;
1110   
1111          default:
1112              trigger_error('NO_ACTION_MODE', E_USER_ERROR);
1113          break;
1114      }
1115   
1116      $s_hidden_fields = '<input type="hidden" name="lastclick" value="' . $current_time . '" />';
1117      $s_hidden_fields .= (isset($check_value)) ? '<input type="hidden" name="status_switch" value="' . $check_value . '" />' : '';
1118      $s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . ((isset($_REQUEST['draft_loaded'])) ? $request->variable('draft_loaded', 0) : $draft_id) . '" />' : '';
1119   
1120      $form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_pm_attach'] || !$auth->acl_get('u_pm_attach')) ? '' : ' enctype="multipart/form-data"';
1121   
1122      // Start assigning vars for main posting page ...
1123      $template->assign_vars(array(
1124          'L_POST_A'                    => $page_title,
1125          'L_ICON'                    => $user->lang['PM_ICON'],
1126          'L_MESSAGE_BODY_EXPLAIN'    => $user->lang('MESSAGE_BODY_EXPLAIN', (int) $config['max_post_chars']),
1127   
1128          'SUBJECT'                => (isset($message_subject)) ? $message_subject : '',
1129          'MESSAGE'                => $message_text,
1130          'BBCODE_STATUS'            => ($bbcode_status) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'),
1131          'IMG_STATUS'            => ($img_status) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
1132          'FLASH_STATUS'            => ($flash_status) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
1133          'SMILIES_STATUS'        => ($smilies_status) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
1134          'URL_STATUS'            => ($url_status) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'],
1135          'MAX_FONT_SIZE'            => (int) $config['max_post_font_size'],
1136          'MINI_POST_IMG'            => $user->img('icon_post_target', $user->lang['PM']),
1137          'ERROR'                    => (sizeof($error)) ? implode('<br />', $error) : '',
1138          'MAX_RECIPIENTS'        => ($config['allow_mass_pm'] && ($auth->acl_get('u_masspm') || $auth->acl_get('u_masspm_group'))) ? $max_recipients : 0,
1139   
1140          'S_COMPOSE_PM'            => true,
1141          'S_EDIT_POST'            => ($action == 'edit'),
1142          'S_SHOW_PM_ICONS'        => $s_pm_icons,
1143          'S_BBCODE_ALLOWED'        => ($bbcode_status) ? 1 : 0,
1144          'S_BBCODE_CHECKED'        => ($bbcode_checked) ? ' checked="checked"' : '',
1145          'S_SMILIES_ALLOWED'        => $smilies_status,
1146          'S_SMILIES_CHECKED'        => ($smilies_checked) ? ' checked="checked"' : '',
1147          'S_SIG_ALLOWED'            => ($config['allow_sig'] && $config['allow_sig_pm'] && $auth->acl_get('u_sig')),
1148          'S_SIGNATURE_CHECKED'    => ($sig_checked) ? ' checked="checked"' : '',
1149          'S_LINKS_ALLOWED'        => $url_status,
1150          'S_MAGIC_URL_CHECKED'    => ($urls_checked) ? ' checked="checked"' : '',
1151          'S_SAVE_ALLOWED'        => ($auth->acl_get('u_savedrafts') && $action != 'edit') ? true : false,
1152          'S_HAS_DRAFTS'            => ($auth->acl_get('u_savedrafts') && $drafts),
1153          'S_FORM_ENCTYPE'        => $form_enctype,
1154          'S_ATTACH_DATA'            => json_encode($message_parser->attachment_data),
1155   
1156          'S_BBCODE_IMG'            => $img_status,
1157          'S_BBCODE_FLASH'        => $flash_status,
1158          'S_BBCODE_QUOTE'        => true,
1159          'S_BBCODE_URL'            => $url_status,
1160   
1161          'S_POST_ACTION'                => $s_action,
1162          'S_HIDDEN_ADDRESS_FIELD'    => $s_hidden_address_field,
1163          'S_HIDDEN_FIELDS'            => $s_hidden_fields,
1164   
1165          'S_CLOSE_PROGRESS_WINDOW'    => isset($_POST['add_file']),
1166          'U_PROGRESS_BAR'            => append_sid("{$phpbb_root_path}posting.$phpEx", 'f=0&amp;mode=popup'),
1167          'UA_PROGRESS_BAR'            => addslashes(append_sid("{$phpbb_root_path}posting.$phpEx", 'f=0&amp;mode=popup')),
1168      ));
1169   
1170      // Build custom bbcodes array
1171      display_custom_bbcodes();
1172   
1173      // Show attachment box for adding attachments if true
1174      $allowed = ($auth->acl_get('u_pm_attach') && $config['allow_pm_attach'] && $form_enctype);
1175   
1176      if ($allowed)
1177      {
1178          $max_files = ($auth->acl_gets('a_', 'm_')) ? 0 : (int) $config['max_attachments_pm'];
1179          $plupload->configure($cache, $template, $s_action, false, $max_files);
1180      }
1181   
1182      // Attachment entry
1183      posting_gen_attachment_entry($attachment_data, $filename_data, $allowed);
1184   
1185      // Message History
1186      if ($action == 'reply' || $action == 'quote' || $action == 'forward')
1187      {
1188          if (message_history($msg_id, $user->data['user_id'], $post, array(), true))
1189          {
1190              $template->assign_var('S_DISPLAY_HISTORY', true);
1191          }
1192      }
1193  }
1194   
1195  /**
1196  * For composing messages, handle list actions
1197  */
1198  function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove_g, $add_to, $add_bcc)
1199  {
1200      global $auth, $db, $user;
1201      global $request;
1202   
1203      // Delete User [TO/BCC]
1204      if ($remove_u && $request->variable('remove_u', array(0 => '')))
1205      {
1206          $remove_user_id = array_keys($request->variable('remove_u', array(0 => '')));
1207   
1208          if (isset($remove_user_id[0]))
1209          {
1210              unset($address_list['u'][(int) $remove_user_id[0]]);
1211          }
1212      }
1213   
1214      // Delete Group [TO/BCC]
1215      if ($remove_g && $request->variable('remove_g', array(0 => '')))
1216      {
1217          $remove_group_id = array_keys($request->variable('remove_g', array(0 => '')));
1218   
1219          if (isset($remove_group_id[0]))
1220          {
1221              unset($address_list['g'][(int) $remove_group_id[0]]);
1222          }
1223      }
1224   
1225      // Add Selected Groups
1226      $group_list = request_var('group_list', array(0));
1227   
1228      // Build usernames to add
1229      $usernames = request_var('username', '', true);
1230      $usernames = (empty($usernames)) ? array() : array($usernames);
1231   
1232      $username_list = request_var('username_list', '', true);
1233      if ($username_list)
1234      {
1235          $usernames = array_merge($usernames, explode("\n", $username_list));
1236      }
1237   
1238      // If add to or add bcc not pressed, users could still have usernames listed they want to add...
1239      if (!$add_to && !$add_bcc && (sizeof($group_list) || sizeof($usernames)))
1240      {
1241          $add_to = true;
1242   
1243          global $refresh, $submit, $preview;
1244   
1245          $refresh = true;
1246          $submit = false;
1247   
1248          // Preview is only true if there was also a message entered
1249          if (request_var('message', ''))
1250          {
1251              $preview = true;
1252          }
1253      }
1254   
1255      // Add User/Group [TO]
1256      if ($add_to || $add_bcc)
1257      {
1258          $type = ($add_to) ? 'to' : 'bcc';
1259   
1260          if (sizeof($group_list))
1261          {
1262              foreach ($group_list as $group_id)
1263              {
1264                  $address_list['g'][$group_id] = $type;
1265              }
1266          }
1267   
1268          // User ID's to add...
1269          $user_id_ary = array();
1270   
1271          // Reveal the correct user_ids
1272          if (sizeof($usernames))
1273          {
1274              $user_id_ary = array();
1275              user_get_id_name($user_id_ary, $usernames, array(USER_NORMAL, USER_FOUNDER, USER_INACTIVE));
1276   
1277              // If there are users not existing, we will at least print a notice...
1278              if (!sizeof($user_id_ary))
1279              {
1280                  $error[] = $user->lang['PM_NO_USERS'];
1281              }
1282          }
1283   
1284          // Add Friends if specified
1285          $friend_list = array_keys($request->variable('add_' . $type, array(0)));
1286          $user_id_ary = array_merge($user_id_ary, $friend_list);
1287   
1288          foreach ($user_id_ary as $user_id)
1289          {
1290              if ($user_id == ANONYMOUS)
1291              {
1292                  continue;
1293              }
1294   
1295              $address_list['u'][$user_id] = $type;
1296          }
1297      }
1298   
1299      // Check for disallowed recipients
1300      if (!empty($address_list['u']))
1301      {
1302          $can_ignore_allow_pm = $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_');
1303   
1304          // Administrator deactivated users check and we need to check their
1305          //        PM status (do they want to receive PM's?)
1306          //         Only check PM status if not a moderator or admin, since they
1307          //        are allowed to override this user setting
1308          $sql = 'SELECT user_id, user_allow_pm
1309              FROM ' . USERS_TABLE . '
1310              WHERE ' . $db->sql_in_set('user_id', array_keys($address_list['u'])) . '
1311                  AND (
1312                          (user_type = ' . USER_INACTIVE . '
1313                          AND user_inactive_reason = ' . INACTIVE_MANUAL . ')
1314                          ' . ($can_ignore_allow_pm ? '' : ' OR user_allow_pm = 0') . '
1315                      )';
1316   
1317          $result = $db->sql_query($sql);
1318   
1319          $removed_no_pm = $removed_no_permission = false;
1320          while ($row = $db->sql_fetchrow($result))
1321          {
1322              if (!$can_ignore_allow_pm && !$row['user_allow_pm'])
1323              {
1324                  $removed_no_pm = true;
1325              }
1326              else
1327              {
1328                  $removed_no_permission = true;
1329              }
1330   
1331              unset($address_list['u'][$row['user_id']]);
1332          }
1333          $db->sql_freeresult($result);
1334   
1335          // print a notice about users not being added who do not want to receive pms
1336          if ($removed_no_pm)
1337          {
1338              $error[] = $user->lang['PM_USERS_REMOVED_NO_PM'];
1339          }
1340   
1341          // print a notice about users not being added who do not have permission to receive PMs
1342          if ($removed_no_permission)
1343          {
1344              $error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
1345          }
1346   
1347          if (!sizeof(array_keys($address_list['u'])))
1348          {
1349              return;
1350          }
1351   
1352          // Check if users have permission to read PMs
1353          $can_read = $auth->acl_get_list(array_keys($address_list['u']), 'u_readpm');
1354          $can_read = (empty($can_read) || !isset($can_read[0]['u_readpm'])) ? array() : $can_read[0]['u_readpm'];
1355          $cannot_read_list = array_diff(array_keys($address_list['u']), $can_read);
1356          if (!empty($cannot_read_list))
1357          {
1358              foreach ($cannot_read_list as $cannot_read)
1359              {
1360                  unset($address_list['u'][$cannot_read]);
1361              }
1362   
1363              $error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
1364          }
1365   
1366          // Check if users are banned
1367          $banned_user_list = phpbb_get_banned_user_ids(array_keys($address_list['u']), false);
1368          if (!empty($banned_user_list))
1369          {
1370              foreach ($banned_user_list as $banned_user)
1371              {
1372                  unset($address_list['u'][$banned_user]);
1373              }
1374   
1375              $error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
1376          }
1377      }
1378  }
1379   
1380  /**
1381  * Build the hidden field for the recipients. Needed, as the variable is not read via request_var.
1382  */
1383  function build_address_field($address_list)
1384  {
1385      $s_hidden_address_field = '';
1386      foreach ($address_list as $type => $adr_ary)
1387      {
1388          foreach ($adr_ary as $id => $field)
1389          {
1390              $s_hidden_address_field .= '<input type="hidden" name="address_list[' . (($type == 'u') ? 'u' : 'g') . '][' . (int) $id . ']" value="' . (($field == 'to') ? 'to' : 'bcc') . '" />';
1391          }
1392      }
1393      return $s_hidden_address_field;
1394  }
1395   
1396  /**
1397  * Return number of private message recipients
1398  */
1399  function num_recipients($address_list)
1400  {
1401      $num_recipients = 0;
1402   
1403      foreach ($address_list as $field => $adr_ary)
1404      {
1405          $num_recipients += sizeof($adr_ary);
1406      }
1407   
1408      return $num_recipients;
1409  }
1410   
1411  /**
1412  * Get number of 'num_recipients' recipients from first position
1413  */
1414  function get_recipients($address_list, $num_recipients = 1)
1415  {
1416      $recipient = array();
1417   
1418      $count = 0;
1419      foreach ($address_list as $field => $adr_ary)
1420      {
1421          foreach ($adr_ary as $id => $type)
1422          {
1423              if ($count >= $num_recipients)
1424              {
1425                  break 2;
1426              }
1427              $recipient[$field][$id] = $type;
1428              $count++;
1429          }
1430      }
1431   
1432      return $recipient;
1433  }
1434