Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

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:51 - Dateigröße: 35.31 KiB


0001  <?php
0002  /**
0003  *
0004  * @package ucp
0005  * @version $Id$
0006  * @copyright (c) 2005 phpBB Group
0007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
0008  *
0009  */
0010   
0011  /**
0012  * @ignore
0013  */
0014  if (!defined('IN_PHPBB'))
0015  {
0016      exit;
0017  }
0018   
0019  /**
0020  * Compose private message
0021  * Called from ucp_pm with mode == 'compose'
0022  */
0023  function compose_pm($id, $mode, $action)
0024  {
0025      global $template, $db, $auth, $user;
0026      global $phpbb_root_path, $phpEx, $config;
0027   
0028      include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
0029      include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
0030      include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
0031   
0032      if (!$action)
0033      {
0034          $action = 'post';
0035      }
0036      add_form_key('ucp_pm_compose');
0037   
0038      // Grab only parameters needed here
0039      $to_user_id        = request_var('u', 0);
0040      $to_group_id    = request_var('g', 0);
0041      $msg_id            = request_var('p', 0);
0042      $draft_id        = request_var('d', 0);
0043      $lastclick        = request_var('lastclick', 0);
0044   
0045      // Do NOT use request_var or specialchars here
0046      $address_list    = isset($_REQUEST['address_list']) ? $_REQUEST['address_list'] : array();
0047   
0048      $submit        = (isset($_POST['post'])) ? true : false;
0049      $preview    = (isset($_POST['preview'])) ? true : false;
0050      $save        = (isset($_POST['save'])) ? true : false;
0051      $load        = (isset($_POST['load'])) ? true : false;
0052      $cancel        = (isset($_POST['cancel']) && !isset($_POST['save'])) ? true : false;
0053      $delete        = (isset($_POST['delete'])) ? true : false;
0054   
0055      $remove_u    = (isset($_REQUEST['remove_u'])) ? true : false;
0056      $remove_g    = (isset($_REQUEST['remove_g'])) ? true : false;
0057      $add_to        = (isset($_REQUEST['add_to'])) ? true : false;
0058      $add_bcc    = (isset($_REQUEST['add_bcc'])) ? true : false;
0059   
0060      $refresh    = isset($_POST['add_file']) || isset($_POST['delete_file']) || $save || $load
0061          || $remove_u || $remove_g || $add_to || $add_bcc;
0062   
0063      $action        = ($delete && !$preview && !$refresh && $submit) ? 'delete' : $action;
0064      $select_single = ($config['allow_mass_pm'] && $auth->acl_get('u_masspm')) ? false : true;
0065   
0066      $error = array();
0067      $current_time = time();
0068   
0069      // Was cancel pressed? If so then redirect to the appropriate page
0070      if ($cancel || ($current_time - $lastclick < 2 && $submit))
0071      {
0072          if ($msg_id)
0073          {
0074              redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=view&amp;action=view_message&amp;p=' . $msg_id));
0075          }
0076          redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm'));
0077      }
0078   
0079      // Output PM_TO box if message composing
0080      if ($action != 'edit')
0081      {
0082          if ($config['allow_mass_pm'] && $auth->acl_get('u_masspm'))
0083          {
0084              $sql = 'SELECT g.group_id, g.group_name, g.group_type
0085                  FROM ' . GROUPS_TABLE . ' g';
0086   
0087              if (!$auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
0088              {
0089                  $sql .= ' LEFT JOIN ' . USER_GROUP_TABLE . ' ug
0090                      ON (
0091                          g.group_id = ug.group_id
0092                          AND ug.user_id = ' . $user->data['user_id'] . '
0093                          AND ug.user_pending = 0
0094                      )
0095                      WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')';
0096              }
0097   
0098              $sql .= ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? ' WHERE ' : ' AND ';
0099   
0100              $sql .= 'g.group_receive_pm = 1
0101                  ORDER BY g.group_type DESC, g.group_name ASC';
0102              $result = $db->sql_query($sql);
0103   
0104              $group_options = '';
0105              while ($row = $db->sql_fetchrow($result))
0106              {
0107                  $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>';
0108              }
0109              $db->sql_freeresult($result);
0110          }
0111   
0112          $template->assign_vars(array(
0113              'S_SHOW_PM_BOX'        => true,
0114              'S_ALLOW_MASS_PM'    => ($config['allow_mass_pm'] && $auth->acl_get('u_masspm')) ? true : false,
0115              'S_GROUP_OPTIONS'    => ($config['allow_mass_pm'] && $auth->acl_get('u_masspm')) ? $group_options : '',
0116              'U_FIND_USERNAME'    => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=searchuser&amp;form=postform&amp;field=username_list&amp;select_single=$select_single"),
0117          ));
0118      }
0119   
0120      $sql = '';
0121   
0122      // What is all this following SQL for? Well, we need to know
0123      // some basic information in all cases before we do anything.
0124      switch ($action)
0125      {
0126          case 'post':
0127              if (!$auth->acl_get('u_sendpm'))
0128              {
0129                  trigger_error('NO_AUTH_SEND_MESSAGE');
0130              }
0131          break;
0132   
0133          case 'reply':
0134          case 'quote':
0135          case 'forward':
0136          case 'quotepost':
0137              if (!$msg_id)
0138              {
0139                  trigger_error('NO_MESSAGE');
0140              }
0141   
0142              if (!$auth->acl_get('u_sendpm'))
0143              {
0144                  trigger_error('NO_AUTH_SEND_MESSAGE');
0145              }
0146   
0147              if ($action == 'quotepost')
0148              {
0149                  $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
0150                      FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . " u
0151                      WHERE p.post_id = $msg_id
0152                          AND t.topic_id = p.topic_id
0153                          AND u.user_id = p.poster_id";
0154              }
0155              else
0156              {
0157                  $sql = 'SELECT t.folder_id, p.*, u.username as quote_username
0158                      FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p, ' . USERS_TABLE . ' u
0159                      WHERE t.user_id = ' . $user->data['user_id'] . "
0160                          AND p.author_id = u.user_id
0161                          AND t.msg_id = p.msg_id
0162                          AND p.msg_id = $msg_id";
0163              }
0164          break;
0165   
0166          case 'edit':
0167              if (!$msg_id)
0168              {
0169                  trigger_error('NO_MESSAGE');
0170              }
0171   
0172              // check for outbox (not read) status, we do not allow editing if one user already having the message
0173              $sql = 'SELECT p.*, t.folder_id
0174                  FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p
0175                  WHERE t.user_id = ' . $user->data['user_id'] . '
0176                      AND t.folder_id = ' . PRIVMSGS_OUTBOX . "
0177                      AND t.msg_id = $msg_id
0178                      AND t.msg_id = p.msg_id";
0179          break;
0180   
0181          case 'delete':
0182              if (!$auth->acl_get('u_pm_delete'))
0183              {
0184                  trigger_error('NO_AUTH_DELETE_MESSAGE');
0185              }
0186   
0187              if (!$msg_id)
0188              {
0189                  trigger_error('NO_MESSAGE');
0190              }
0191   
0192              $sql = 'SELECT msg_id, pm_unread, pm_new, author_id, folder_id
0193                  FROM ' . PRIVMSGS_TO_TABLE . '
0194                  WHERE user_id = ' . $user->data['user_id'] . "
0195                      AND msg_id = $msg_id";
0196          break;
0197   
0198          case 'smilies':
0199              generate_smilies('window', 0);
0200          break;
0201   
0202          default:
0203              trigger_error('NO_ACTION_MODE', E_USER_ERROR);
0204          break;
0205      }
0206   
0207      if ($action == 'forward' && (!$config['forward_pm'] || !$auth->acl_get('u_pm_forward')))
0208      {
0209          trigger_error('NO_AUTH_FORWARD_MESSAGE');
0210      }
0211   
0212      if ($action == 'edit' && !$auth->acl_get('u_pm_edit'))
0213      {
0214          trigger_error('NO_AUTH_EDIT_MESSAGE');
0215      }
0216   
0217      if ($sql)
0218      {
0219          $result = $db->sql_query($sql);
0220          $post = $db->sql_fetchrow($result);
0221          $db->sql_freeresult($result);
0222   
0223          if (!$post)
0224          {
0225              // If editing it could be the recipient already read the message...
0226              if ($action == 'edit')
0227              {
0228                  $sql = 'SELECT p.*, t.folder_id
0229                      FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p
0230                      WHERE t.user_id = ' . $user->data['user_id'] . "
0231                          AND t.msg_id = $msg_id
0232                          AND t.msg_id = p.msg_id";
0233                  $result = $db->sql_query($sql);
0234                  $post = $db->sql_fetchrow($result);
0235                  $db->sql_freeresult($result);
0236   
0237                  if ($post)
0238                  {
0239                      trigger_error('NO_EDIT_READ_MESSAGE');
0240                  }
0241              }
0242   
0243              trigger_error('NO_MESSAGE');
0244          }
0245   
0246          if ($action == 'quotepost')
0247          {
0248              if (($post['forum_id'] && !$auth->acl_get('f_read', $post['forum_id'])) || (!$post['forum_id'] && !$auth->acl_getf_global('f_read')))
0249              {
0250                  trigger_error('NOT_AUTHORISED');
0251              }
0252          }
0253   
0254          $msg_id            = (int) $post['msg_id'];
0255          $folder_id        = (isset($post['folder_id'])) ? $post['folder_id'] : 0;
0256          $message_text    = (isset($post['message_text'])) ? $post['message_text'] : '';
0257   
0258          if ((!$post['author_id'] || ($post['author_id'] == ANONYMOUS && $action != 'delete')) && $msg_id)
0259          {
0260              trigger_error('NO_AUTHOR');
0261          }
0262   
0263          if ($action == 'quotepost')
0264          {
0265              // Decode text for message display
0266              decode_message($message_text, $post['bbcode_uid']);
0267          }
0268   
0269          if ($action != 'delete')
0270          {
0271              $enable_urls = $post['enable_magic_url'];
0272              $enable_sig = (isset($post['enable_sig'])) ? $post['enable_sig'] : 0;
0273   
0274              $message_attachment = (isset($post['message_attachment'])) ? $post['message_attachment'] : 0;
0275              $message_subject = $post['message_subject'];
0276              $message_time = $post['message_time'];
0277              $bbcode_uid = $post['bbcode_uid'];
0278   
0279              $quote_username = (isset($post['quote_username'])) ? $post['quote_username'] : '';
0280              $icon_id = (isset($post['icon_id'])) ? $post['icon_id'] : 0;
0281   
0282              if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !sizeof($address_list) && !$refresh && !$submit && !$preview)
0283              {
0284                  $address_list = array('u' => array($post['author_id'] => 'to'));
0285              }
0286              else if ($action == 'edit' && !sizeof($address_list) && !$refresh && !$submit && !$preview)
0287              {
0288                  // Rebuild TO and BCC Header
0289                  $address_list = rebuild_header(array('to' => $post['to_address'], 'bcc' => $post['bcc_address']));
0290              }
0291   
0292              if ($action == 'quotepost')
0293              {
0294                  $check_value = 0;
0295              }
0296              else
0297              {
0298                  $check_value = (($post['enable_bbcode']+1) << 8) + (($post['enable_smilies']+1) << 4) + (($enable_urls+1) << 2) + (($post['enable_sig']+1) << 1);
0299              }
0300          }
0301      }
0302      else
0303      {
0304          $message_attachment = 0;
0305          $message_text = $message_subject = '';
0306   
0307          if ($to_user_id && $action == 'post')
0308          {
0309              $address_list['u'][$to_user_id] = 'to';
0310          }
0311          else if ($to_group_id && $action == 'post')
0312          {
0313              $address_list['g'][$to_group_id] = 'to';
0314          }
0315          $check_value = 0;
0316      }
0317   
0318      if (($to_group_id || isset($address_list['g'])) && (!$config['allow_mass_pm'] || !$auth->acl_get('u_masspm')))
0319      {
0320          trigger_error('NO_AUTH_GROUP_MESSAGE');
0321      }
0322   
0323      if ($action == 'edit' && !$refresh && !$preview && !$submit)
0324      {
0325          if (!($message_time > time() - ($config['pm_edit_time'] * 60) || !$config['pm_edit_time']))
0326          {
0327              trigger_error('CANNOT_EDIT_MESSAGE_TIME');
0328          }
0329      }
0330   
0331      if ($action == 'post')
0332      {
0333          $template->assign_var('S_NEW_MESSAGE', true);
0334      }
0335   
0336      if (!isset($icon_id))
0337      {
0338          $icon_id = 0;
0339      }
0340   
0341      $message_parser = new parse_message();
0342   
0343      $message_parser->message = ($action == 'reply') ? '' : $message_text;
0344      unset($message_text);
0345   
0346      $s_action = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=$id&amp;mode=$mode&amp;action=$action", true, $user->session_id);
0347      $s_action .= ($msg_id) ? "&amp;p=$msg_id" : '';
0348   
0349      // Delete triggered ?
0350      if ($action == 'delete')
0351      {
0352          // Folder id has been determined by the SQL Statement
0353          // $folder_id = request_var('f', PRIVMSGS_NO_BOX);
0354   
0355          // Do we need to confirm ?
0356          if (confirm_box(true))
0357          {
0358              delete_pm($user->data['user_id'], $msg_id, $folder_id);
0359   
0360              // jump to next message in "history"? nope, not for the moment. But able to be included later.
0361              $meta_info = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;folder=$folder_id");
0362              $message = $user->lang['MESSAGE_DELETED'];
0363   
0364              meta_refresh(3, $meta_info);
0365              $message .= '<br /><br />' . sprintf($user->lang['RETURN_FOLDER'], '<a href="' . $meta_info . '">', '</a>');
0366              trigger_error($message);
0367          }
0368          else
0369          {
0370              $s_hidden_fields = array(
0371                  'p'            => $msg_id,
0372                  'f'            => $folder_id,
0373                  'action'    => 'delete'
0374              );
0375   
0376              // "{$phpbb_root_path}ucp.$phpEx?i=pm&amp;mode=compose"
0377              confirm_box(false, 'DELETE_MESSAGE', build_hidden_fields($s_hidden_fields));
0378          }
0379   
0380          redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=view&amp;action=view_message&amp;p=' . $msg_id));
0381      }
0382   
0383      // Handle User/Group adding/removing
0384      handle_message_list_actions($address_list, $error, $remove_u, $remove_g, $add_to, $add_bcc);
0385   
0386      // Check for too many recipients
0387      if ((!$config['allow_mass_pm'] || !$auth->acl_get('u_masspm')) && num_recipients($address_list) > 1)
0388      {
0389          $address_list = get_recipient_pos($address_list, 1);
0390          $error[] = $user->lang['TOO_MANY_RECIPIENTS'];
0391      }
0392   
0393      // Always check if the submitted attachment data is valid and belongs to the user.
0394      // Further down (especially in submit_post()) we do not check this again.
0395      $message_parser->get_submitted_attachment_data();
0396   
0397      if ($message_attachment && !$submit && !$refresh && !$preview && $action == 'edit')
0398      {
0399          // Do not change to SELECT *
0400          $sql = 'SELECT attach_id, is_orphan, attach_comment, real_filename
0401              FROM ' . ATTACHMENTS_TABLE . "
0402              WHERE post_msg_id = $msg_id
0403                  AND in_message = 1
0404                  AND is_orphan = 0
0405              ORDER BY filetime DESC";
0406          $result = $db->sql_query($sql);
0407          $message_parser->attachment_data = array_merge($message_parser->attachment_data, $db->sql_fetchrowset($result));
0408          $db->sql_freeresult($result);
0409      }
0410   
0411      if (!in_array($action, array('quote', 'edit', 'delete', 'forward')))
0412      {
0413          $enable_sig        = ($config['allow_sig'] && $config['allow_sig_pm'] && $auth->acl_get('u_sig') && $user->optionget('attachsig'));
0414          $enable_smilies    = ($config['allow_smilies'] && $auth->acl_get('u_pm_smilies') && $user->optionget('smilies'));
0415          $enable_bbcode    = ($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode') && $user->optionget('bbcode'));
0416          $enable_urls    = true;
0417      }
0418   
0419      $enable_magic_url = $drafts = false;
0420   
0421      // User own some drafts?
0422      if ($auth->acl_get('u_savedrafts') && $action != 'delete')
0423      {
0424          $sql = 'SELECT draft_id
0425              FROM ' . DRAFTS_TABLE . '
0426              WHERE forum_id = 0
0427                  AND topic_id = 0
0428                  AND user_id = ' . $user->data['user_id'] .
0429                  (($draft_id) ? " AND draft_id <> $draft_id" : '');
0430          $result = $db->sql_query_limit($sql, 1);
0431          $row = $db->sql_fetchrow($result);
0432          $db->sql_freeresult($result);
0433   
0434          if ($row)
0435          {
0436              $drafts = true;
0437          }
0438      }
0439   
0440      if ($action == 'edit')
0441      {
0442          $message_parser->bbcode_uid = $bbcode_uid;
0443      }
0444   
0445      $bbcode_status    = ($config['allow_bbcode'] && $config['auth_bbcode_pm'] && $auth->acl_get('u_pm_bbcode')) ? true : false;
0446      $smilies_status    = ($config['allow_smilies'] && $config['auth_smilies_pm'] && $auth->acl_get('u_pm_smilies')) ? true : false;
0447      $img_status        = ($config['auth_img_pm'] && $auth->acl_get('u_pm_img')) ? true : false;
0448      $flash_status    = ($config['auth_flash_pm'] && $auth->acl_get('u_pm_flash')) ? true : false;
0449      $url_status        = ($config['allow_post_links']) ? true : false;
0450   
0451      // Save Draft
0452      if ($save && $auth->acl_get('u_savedrafts'))
0453      {
0454          $subject = utf8_normalize_nfc(request_var('subject', '', true));
0455          $subject = (!$subject && $action != 'post') ? $user->lang['NEW_MESSAGE'] : $subject;
0456          $message = utf8_normalize_nfc(request_var('message', '', true));
0457   
0458          if ($subject && $message)
0459          {
0460              if (confirm_box(true))
0461              {
0462                  $sql = 'INSERT INTO ' . DRAFTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
0463                      'user_id'        => $user->data['user_id'],
0464                      'topic_id'        => 0,
0465                      'forum_id'        => 0,
0466                      'save_time'        => $current_time,
0467                      'draft_subject'    => $subject,
0468                      'draft_message'    => $message)
0469                  );
0470                  $db->sql_query($sql);
0471   
0472                  $redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=$mode");
0473   
0474                  meta_refresh(3, $redirect_url);
0475                  $message = $user->lang['DRAFT_SAVED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $redirect_url . '">', '</a>');
0476   
0477                  trigger_error($message);
0478              }
0479              else
0480              {
0481                  $s_hidden_fields = build_hidden_fields(array(
0482                      'mode'        => $mode,
0483                      'action'    => $action,
0484                      'save'        => true,
0485                      'subject'    => $subject,
0486                      'message'    => $message,
0487                      'u'            => $to_user_id,
0488                      'g'            => $to_group_id,
0489                      'p'            => $msg_id)
0490                  );
0491   
0492                  confirm_box(false, 'SAVE_DRAFT', $s_hidden_fields);
0493              }
0494          }
0495          else
0496          {
0497              if (!$subject || !utf8_clean_string($subject))
0498              {
0499                  $error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
0500              }
0501   
0502              if (!$message)
0503              {
0504                  $error[] = $user->lang['TOO_FEW_CHARS'];
0505              }
0506          }
0507   
0508          unset($subject, $message);
0509      }
0510   
0511      // Load Draft
0512      if ($draft_id && $auth->acl_get('u_savedrafts'))
0513      {
0514          $sql = 'SELECT draft_subject, draft_message
0515              FROM ' . DRAFTS_TABLE . "
0516              WHERE draft_id = $draft_id
0517                  AND topic_id = 0
0518                  AND forum_id = 0
0519                  AND user_id = " . $user->data['user_id'];
0520          $result = $db->sql_query_limit($sql, 1);
0521   
0522          if ($row = $db->sql_fetchrow($result))
0523          {
0524              $message_parser->message = $row['draft_message'];
0525              $message_subject = $row['draft_subject'];
0526   
0527              $template->assign_var('S_DRAFT_LOADED', true);
0528          }
0529          else
0530          {
0531              $draft_id = 0;
0532          }
0533          $db->sql_freeresult($result);
0534      }
0535   
0536      // Load Drafts
0537      if ($load && $drafts)
0538      {
0539          load_drafts(0, 0, $id);
0540      }
0541   
0542      if ($submit || $preview || $refresh)
0543      {
0544          if (!check_form_key('ucp_pm_compose'))
0545          {
0546              $error[] = $user->lang['FORM_INVALID'];
0547          }
0548          $subject = utf8_normalize_nfc(request_var('subject', '', true));
0549          $message_parser->message = utf8_normalize_nfc(request_var('message', '', true));
0550   
0551          $icon_id            = request_var('icon', 0);
0552   
0553          $enable_bbcode         = (!$bbcode_status || isset($_POST['disable_bbcode'])) ? false : true;
0554          $enable_smilies        = (!$smilies_status || isset($_POST['disable_smilies'])) ? false : true;
0555          $enable_urls         = (isset($_POST['disable_magic_url'])) ? 0 : 1;
0556          $enable_sig            = (!$config['allow_sig'] ||!$config['allow_sig_pm']) ? false : ((isset($_POST['attach_sig'])) ? true : false);
0557   
0558          if ($submit)
0559          {
0560              $status_switch    = (($enable_bbcode+1) << 8) + (($enable_smilies+1) << 4) + (($enable_urls+1) << 2) + (($enable_sig+1) << 1);
0561              $status_switch = ($status_switch != $check_value);
0562          }
0563          else
0564          {
0565              $status_switch = 1;
0566          }
0567   
0568          // Parse Attachments - before checksum is calculated
0569          $message_parser->parse_attachments('fileupload', $action, 0, $submit, $preview, $refresh, true);
0570   
0571          if (sizeof($message_parser->warn_msg) && !($remove_u || $remove_g || $add_to || $add_bcc))
0572          {
0573              $error[] = implode('<br />', $message_parser->warn_msg);
0574              $message_parser->warn_msg = array();
0575          }
0576   
0577          // Parse message
0578          $message_parser->parse($enable_bbcode, ($config['allow_post_links']) ? $enable_urls : false, $enable_smilies, $img_status, $flash_status, true, $config['allow_post_links']);
0579   
0580          // On a refresh we do not care about message parsing errors
0581          if (sizeof($message_parser->warn_msg) && !$refresh)
0582          {
0583              $error[] = implode('<br />', $message_parser->warn_msg);
0584          }
0585   
0586          if ($action != 'edit' && !$preview && !$refresh && $config['flood_interval'] && !$auth->acl_get('u_ignoreflood'))
0587          {
0588              // Flood check
0589              $last_post_time = $user->data['user_lastpost_time'];
0590   
0591              if ($last_post_time)
0592              {
0593                  if ($last_post_time && ($current_time - $last_post_time) < intval($config['flood_interval']))
0594                  {
0595                      $error[] = $user->lang['FLOOD_ERROR'];
0596                  }
0597              }
0598          }
0599   
0600          // Subject defined
0601          if ($submit)
0602          {
0603              if (!$subject || !utf8_clean_string($subject))
0604              {
0605                  $error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
0606              }
0607   
0608              if (!sizeof($address_list))
0609              {
0610                  $error[] = $user->lang['NO_RECIPIENT'];
0611              }
0612          }
0613   
0614          // Store message, sync counters
0615          if (!sizeof($error) && $submit)
0616          {
0617              $pm_data = array(
0618                  'msg_id'                => (int) $msg_id,
0619                  'from_user_id'            => $user->data['user_id'],
0620                  'from_user_ip'            => $user->ip,
0621                  'from_username'            => $user->data['username'],
0622                  'reply_from_root_level'    => (isset($post['root_level'])) ? (int) $post['root_level'] : 0,
0623                  'reply_from_msg_id'        => (int) $msg_id,
0624                  'icon_id'                => (int) $icon_id,
0625                  'enable_sig'            => (bool) $enable_sig,
0626                  'enable_bbcode'            => (bool) $enable_bbcode,
0627                  'enable_smilies'        => (bool) $enable_smilies,
0628                  'enable_urls'            => (bool) $enable_urls,
0629                  'bbcode_bitfield'        => $message_parser->bbcode_bitfield,
0630                  'bbcode_uid'            => $message_parser->bbcode_uid,
0631                  'message'                => $message_parser->message,
0632                  'attachment_data'        => $message_parser->attachment_data,
0633                  'filename_data'            => $message_parser->filename_data,
0634                  'address_list'            => $address_list
0635              );
0636              unset($message_parser);
0637   
0638              // ((!$message_subject) ? $subject : $message_subject)
0639              $msg_id = submit_pm($action, $subject, $pm_data);
0640   
0641              $return_message_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=view&amp;p=' . $msg_id);
0642              $return_folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=outbox');
0643              meta_refresh(3, $return_message_url);
0644   
0645              $message = $user->lang['MESSAGE_STORED'] . '<br /><br />' . sprintf($user->lang['VIEW_PRIVATE_MESSAGE'], '<a href="' . $return_message_url . '">', '</a>') . '<br /><br />' . sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . $return_folder_url . '">', '</a>', $user->lang['PM_OUTBOX']);
0646              trigger_error($message);
0647          }
0648   
0649          $message_subject = $subject;
0650      }
0651   
0652      // Preview
0653      if (!sizeof($error) && $preview)
0654      {
0655          $user->add_lang('viewtopic');
0656          $preview_message = $message_parser->format_display($enable_bbcode, $enable_urls, $enable_smilies, false);
0657   
0658          $preview_signature = $user->data['user_sig'];
0659          $preview_signature_uid = $user->data['user_sig_bbcode_uid'];
0660          $preview_signature_bitfield = $user->data['user_sig_bbcode_bitfield'];
0661   
0662          // Signature
0663          if ($enable_sig && $config['allow_sig'] && $preview_signature)
0664          {
0665              $parse_sig = new parse_message($preview_signature);
0666              $parse_sig->bbcode_uid = $preview_signature_uid;
0667              $parse_sig->bbcode_bitfield = $preview_signature_bitfield;
0668   
0669              $parse_sig->format_display($enable_bbcode, $enable_urls, $enable_smilies);
0670              $preview_signature = $parse_sig->message;
0671              unset($parse_sig);
0672          }
0673          else
0674          {
0675              $preview_signature = '';
0676          }
0677   
0678          // Attachment Preview
0679          if (sizeof($message_parser->attachment_data))
0680          {
0681              $template->assign_var('S_HAS_ATTACHMENTS', true);
0682   
0683              $update_count = array();
0684              $attachment_data = $message_parser->attachment_data;
0685   
0686              parse_attachments(false, $preview_message, $attachment_data, $update_count, true);
0687   
0688              foreach ($attachment_data as $i => $attachment)
0689              {
0690                  $template->assign_block_vars('attachment', array(
0691                      'DISPLAY_ATTACHMENT'    => $attachment)
0692                  );
0693              }
0694              unset($attachment_data);
0695          }
0696   
0697          $preview_subject = censor_text($subject);
0698   
0699          if (!sizeof($error))
0700          {
0701              $template->assign_vars(array(
0702                  'PREVIEW_SUBJECT'        => $preview_subject,
0703                  'PREVIEW_MESSAGE'        => $preview_message,
0704                  'PREVIEW_SIGNATURE'        => $preview_signature,
0705   
0706                  'S_DISPLAY_PREVIEW'        => true)
0707              );
0708          }
0709          unset($message_text);
0710      }
0711   
0712      // Decode text for message display
0713      $bbcode_uid = (($action == 'quote' || $action == 'forward') && !$preview && !$refresh && !sizeof($error)) ? $bbcode_uid : $message_parser->bbcode_uid;
0714   
0715      $message_parser->decode_message($bbcode_uid);
0716   
0717      if (($action == 'quote' || $action == 'quotepost') && !$preview && !$refresh && !$submit)
0718      {
0719          if ($action == 'quotepost')
0720          {
0721              $post_id = request_var('p', 0);
0722              if ($config['allow_post_links'])
0723              {
0724                  $message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}{$message_subject}[/url]\n\n";
0725              }
0726              else
0727              {
0728                  $message_link = $user->lang['SUBJECT'] . ': ' . $message_subject . " (" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id})\n\n";
0729              }
0730          }
0731          else
0732          {
0733              $message_link = '';
0734          }
0735          $message_parser->message = $message_link . '[quote=&quot;' . $quote_username . '&quot;]' . censor_text(trim($message_parser->message)) . "[/quote]\n";
0736      }
0737   
0738      if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh)
0739      {
0740          $message_subject = ((!preg_match('/^Re:/', $message_subject)) ? 'Re: ' : '') . censor_text($message_subject);
0741      }
0742   
0743      if ($action == 'forward' && !$preview && !$refresh && !$submit)
0744      {
0745          $fwd_to_field = write_pm_addresses(array('to' => $post['to_address']), 0, true);
0746   
0747          if ($config['allow_post_links'])
0748          {
0749              $quote_username_text = '[url=' . generate_board_url() . "/memberlist.$phpEx?mode=viewprofile&amp;u={$post['author_id']}]{$quote_username}[/url]";
0750          }
0751          else
0752          {
0753              $quote_username_text = $quote_username . ' (' . generate_board_url() . "/memberlist.$phpEx?mode=viewprofile&amp;u={$post['author_id']})";
0754          }
0755   
0756          $forward_text = array();
0757          $forward_text[] = $user->lang['FWD_ORIGINAL_MESSAGE'];
0758          $forward_text[] = sprintf($user->lang['FWD_SUBJECT'], censor_text($message_subject));
0759          $forward_text[] = sprintf($user->lang['FWD_DATE'], $user->format_date($message_time));
0760          $forward_text[] = sprintf($user->lang['FWD_FROM'], $quote_username_text);
0761          $forward_text[] = sprintf($user->lang['FWD_TO'], implode(', ', $fwd_to_field['to']));
0762   
0763          $message_parser->message = implode("\n", $forward_text) . "\n\n[quote=\"{$quote_username}\"]\n" . censor_text(trim($message_parser->message)) . "\n[/quote]";
0764          $message_subject = ((!preg_match('/^Fwd:/', $message_subject)) ? 'Fwd: ' : '') . censor_text($message_subject);
0765      }
0766   
0767      $attachment_data = $message_parser->attachment_data;
0768      $filename_data = $message_parser->filename_data;
0769      $message_text = $message_parser->message;
0770      unset($message_parser);
0771   
0772      // MAIN PM PAGE BEGINS HERE
0773   
0774      // Generate smiley listing
0775      generate_smilies('inline', 0);
0776   
0777      // Generate PM Icons
0778      $s_pm_icons = false;
0779      if ($config['enable_pm_icons'])
0780      {
0781          $s_pm_icons = posting_gen_topic_icons($action, $icon_id);
0782      }
0783   
0784      // Generate inline attachment select box
0785      posting_gen_inline_attachments($attachment_data);
0786   
0787      // Build address list for display
0788      // array('u' => array($author_id => 'to'));
0789      if (sizeof($address_list))
0790      {
0791          // Get Usernames and Group Names
0792          $result = array();
0793          if (!empty($address_list['u']))
0794          {
0795              $sql = 'SELECT user_id as id, username as name, user_colour as colour
0796                  FROM ' . USERS_TABLE . '
0797                  WHERE ' . $db->sql_in_set('user_id', array_map('intval', array_keys($address_list['u']))) . '
0798                  ORDER BY username_clean ASC';
0799              $result['u'] = $db->sql_query($sql);
0800          }
0801   
0802          if (!empty($address_list['g']))
0803          {
0804              $sql = 'SELECT g.group_id AS id, g.group_name AS name, g.group_colour AS colour, g.group_type
0805                  FROM ' . GROUPS_TABLE . ' g';
0806   
0807              if (!$auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
0808              {
0809                  $sql .= ' LEFT JOIN ' . USER_GROUP_TABLE . ' ug
0810                      ON (
0811                          g.group_id = ug.group_id
0812                          AND ug.user_id = ' . $user->data['user_id'] . '
0813                          AND ug.user_pending = 0
0814                      )
0815                      WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')';
0816              }
0817   
0818              $sql .= ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? ' WHERE ' : ' AND ';
0819   
0820              $sql .= 'g.group_receive_pm = 1
0821                  AND ' . $db->sql_in_set('g.group_id', array_map('intval', array_keys($address_list['g']))) . '
0822                  ORDER BY g.group_name ASC';
0823   
0824              $result['g'] = $db->sql_query($sql);
0825          }
0826   
0827          $u = $g = array();
0828          $_types = array('u', 'g');
0829          foreach ($_types as $type)
0830          {
0831              if (isset($result[$type]) && $result[$type])
0832              {
0833                  while ($row = $db->sql_fetchrow($result[$type]))
0834                  {
0835                      if ($type == 'g')
0836                      {
0837                          $row['name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['name']] : $row['name'];
0838                      }
0839   
0840                      ${$type}[$row['id']] = array('name' => $row['name'], 'colour' => $row['colour']);
0841                  }
0842                  $db->sql_freeresult($result[$type]);
0843              }
0844          }
0845   
0846          // Now Build the address list
0847          $plain_address_field = '';
0848          foreach ($address_list as $type => $adr_ary)
0849          {
0850              foreach ($adr_ary as $id => $field)
0851              {
0852                  if (!isset(${$type}[$id]))
0853                  {
0854                      unset($address_list[$type][$id]);
0855                      continue;
0856                  }
0857   
0858                  $field = ($field == 'to') ? 'to' : 'bcc';
0859                  $type = ($type == 'u') ? 'u' : 'g';
0860                  $id = (int) $id;
0861   
0862                  $tpl_ary = array(
0863                      'IS_GROUP'    => ($type == 'g') ? true : false,
0864                      'IS_USER'    => ($type == 'u') ? true : false,
0865                      'UG_ID'        => $id,
0866                      'NAME'        => ${$type}[$id]['name'],
0867                      'COLOUR'    => (${$type}[$id]['colour']) ? '#' . ${$type}[$id]['colour'] : '',
0868                      'TYPE'        => $type,
0869                  );
0870   
0871                  if ($type == 'u')
0872                  {
0873                      $tpl_ary = array_merge($tpl_ary, array(
0874                          'U_VIEW'        => get_username_string('profile', $id, ${$type}[$id]['name'], ${$type}[$id]['colour']),
0875                          'NAME_FULL'        => get_username_string('full', $id, ${$type}[$id]['name'], ${$type}[$id]['colour']),
0876                      ));
0877                  }
0878                  else
0879                  {
0880                      $tpl_ary = array_merge($tpl_ary, array(
0881                          'U_VIEW'        => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $id),
0882                      ));
0883                  }
0884   
0885                  $template->assign_block_vars($field . '_recipient', $tpl_ary);
0886              }
0887          }
0888      }
0889   
0890      // Build hidden address list
0891      $s_hidden_address_field = '';
0892      foreach ($address_list as $type => $adr_ary)
0893      {
0894          foreach ($adr_ary as $id => $field)
0895          {
0896              $s_hidden_address_field .= '<input type="hidden" name="address_list[' . (($type == 'u') ? 'u' : 'g') . '][' . (int) $id . ']" value="' . (($field == 'to') ? 'to' : 'bcc') . '" />';
0897          }
0898      }
0899   
0900      $bbcode_checked        = (isset($enable_bbcode)) ? !$enable_bbcode : (($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode')) ? !$user->optionget('bbcode') : 1);
0901      $smilies_checked    = (isset($enable_smilies)) ? !$enable_smilies : (($config['allow_smilies'] && $auth->acl_get('u_pm_smilies')) ? !$user->optionget('smilies') : 1);
0902      $urls_checked        = (isset($enable_urls)) ? !$enable_urls : 0;
0903      $sig_checked        = $enable_sig;
0904   
0905      switch ($action)
0906      {
0907          case 'post':
0908              $page_title = $user->lang['POST_NEW_PM'];
0909          break;
0910   
0911          case 'quote':
0912              $page_title = $user->lang['POST_QUOTE_PM'];
0913          break;
0914   
0915          case 'quotepost':
0916              $page_title = $user->lang['POST_PM_POST'];
0917          break;
0918   
0919          case 'reply':
0920              $page_title = $user->lang['POST_REPLY_PM'];
0921          break;
0922   
0923          case 'edit':
0924              $page_title = $user->lang['POST_EDIT_PM'];
0925          break;
0926   
0927          case 'forward':
0928              $page_title = $user->lang['POST_FORWARD_PM'];
0929          break;
0930   
0931          default:
0932              trigger_error('NO_ACTION_MODE', E_USER_ERROR);
0933          break;
0934      }
0935   
0936      $s_hidden_fields = '<input type="hidden" name="lastclick" value="' . $current_time . '" />';
0937      $s_hidden_fields .= (isset($check_value)) ? '<input type="hidden" name="status_switch" value="' . $check_value . '" />' : '';
0938      $s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . ((isset($_REQUEST['draft_loaded'])) ? intval($_REQUEST['draft_loaded']) : $draft_id) . '" />' : '';
0939   
0940      $form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || @ini_get('file_uploads') == '0' || !$config['allow_pm_attach'] || !$auth->acl_get('u_pm_attach')) ? '' : ' enctype="multipart/form-data"';
0941   
0942      // Start assigning vars for main posting page ...
0943      $template->assign_vars(array(
0944          'L_POST_A'                    => $page_title,
0945          'L_ICON'                    => $user->lang['PM_ICON'],
0946          'L_MESSAGE_BODY_EXPLAIN'    => (intval($config['max_post_chars'])) ? sprintf($user->lang['MESSAGE_BODY_EXPLAIN'], intval($config['max_post_chars'])) : '',
0947   
0948          'SUBJECT'                => (isset($message_subject)) ? $message_subject : '',
0949          'MESSAGE'                => $message_text,
0950          '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>'),
0951          'IMG_STATUS'            => ($img_status) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
0952          'FLASH_STATUS'            => ($flash_status) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
0953          'SMILIES_STATUS'        => ($smilies_status) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
0954          'URL_STATUS'            => ($url_status) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'],
0955          'MINI_POST_IMG'            => $user->img('icon_post_target', $user->lang['PM']),
0956          'ERROR'                    => (sizeof($error)) ? implode('<br />', $error) : '',
0957   
0958          'S_COMPOSE_PM'            => true,
0959          'S_EDIT_POST'            => ($action == 'edit'),
0960          'S_SHOW_PM_ICONS'        => $s_pm_icons,
0961          'S_BBCODE_ALLOWED'        => $bbcode_status,
0962          'S_BBCODE_CHECKED'        => ($bbcode_checked) ? ' checked="checked"' : '',
0963          'S_SMILIES_ALLOWED'        => $smilies_status,
0964          'S_SMILIES_CHECKED'        => ($smilies_checked) ? ' checked="checked"' : '',
0965          'S_SIG_ALLOWED'            => ($config['allow_sig'] && $config['allow_sig_pm'] && $auth->acl_get('u_sig')),
0966          'S_SIGNATURE_CHECKED'    => ($sig_checked) ? ' checked="checked"' : '',
0967          'S_LINKS_ALLOWED'        => $url_status,
0968          'S_MAGIC_URL_CHECKED'    => ($urls_checked) ? ' checked="checked"' : '',
0969          'S_SAVE_ALLOWED'        => ($auth->acl_get('u_savedrafts') && $action != 'edit') ? true : false,
0970          'S_HAS_DRAFTS'            => ($auth->acl_get('u_savedrafts') && $drafts),
0971          'S_FORM_ENCTYPE'        => $form_enctype,
0972   
0973          'S_BBCODE_IMG'            => $img_status,
0974          'S_BBCODE_FLASH'        => $flash_status,
0975          'S_BBCODE_QUOTE'        => true,
0976          'S_BBCODE_URL'            => $url_status,
0977   
0978          'S_POST_ACTION'                => $s_action,
0979          'S_HIDDEN_ADDRESS_FIELD'    => $s_hidden_address_field,
0980          'S_HIDDEN_FIELDS'            => $s_hidden_fields,
0981   
0982          'S_CLOSE_PROGRESS_WINDOW'    => isset($_POST['add_file']),
0983          'U_PROGRESS_BAR'            => append_sid("{$phpbb_root_path}posting.$phpEx", 'f=0&amp;mode=popup'),
0984          'UA_PROGRESS_BAR'            => addslashes(append_sid("{$phpbb_root_path}posting.$phpEx", 'f=0&amp;mode=popup')),
0985      ));
0986   
0987      // Build custom bbcodes array
0988      display_custom_bbcodes();
0989   
0990      // Attachment entry
0991      if ($auth->acl_get('u_pm_attach') && $config['allow_pm_attach'] && $form_enctype)
0992      {
0993          posting_gen_attachment_entry($attachment_data, $filename_data);
0994      }
0995   
0996      // Message History
0997      if ($action == 'reply' || $action == 'quote' || $action == 'forward')
0998      {
0999          if (message_history($msg_id, $user->data['user_id'], $post, array(), true))
1000          {
1001              $template->assign_var('S_DISPLAY_HISTORY', true);
1002          }
1003      }
1004  }
1005   
1006  /**
1007  * For composing messages, handle list actions
1008  */
1009  function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove_g, $add_to, $add_bcc)
1010  {
1011      global $auth, $db, $user;
1012   
1013      // Delete User [TO/BCC]
1014      if ($remove_u && !empty($_REQUEST['remove_u']) && is_array($_REQUEST['remove_u']))
1015      {
1016          $remove_user_id = array_keys($_REQUEST['remove_u']);
1017   
1018          if (isset($remove_user_id[0]))
1019          {
1020              unset($address_list['u'][(int) $remove_user_id[0]]);
1021          }
1022      }
1023   
1024      // Delete Group [TO/BCC]
1025      if ($remove_g && !empty($_REQUEST['remove_g']) && is_array($_REQUEST['remove_g']))
1026      {
1027          $remove_group_id = array_keys($_REQUEST['remove_g']);
1028   
1029          if (isset($remove_group_id[0]))
1030          {
1031              unset($address_list['g'][(int) $remove_group_id[0]]);
1032          }
1033      }
1034   
1035      // Add User/Group [TO]
1036      if ($add_to || $add_bcc)
1037      {
1038          $type = ($add_to) ? 'to' : 'bcc';
1039   
1040          // Add Selected Groups
1041          $group_list = request_var('group_list', array(0));
1042   
1043          if (sizeof($group_list))
1044          {
1045              foreach ($group_list as $group_id)
1046              {
1047                  $address_list['g'][$group_id] = $type;
1048              }
1049          }
1050   
1051          // User ID's to add...
1052          $user_id_ary = array();
1053   
1054          // Build usernames to add
1055          $usernames = (isset($_REQUEST['username'])) ? array(request_var('username', '', true)) : array();
1056          $username_list = request_var('username_list', '', true);
1057          if ($username_list)
1058          {
1059              $usernames = array_merge($usernames, explode("\n", $username_list));
1060          }
1061   
1062          // Reveal the correct user_ids
1063          if (sizeof($usernames))
1064          {
1065              $user_id_ary = array();
1066              user_get_id_name($user_id_ary, $usernames, array(USER_NORMAL, USER_FOUNDER, USER_INACTIVE));
1067   
1068              // If there are users not existing, we will at least print a notice...
1069              if (!sizeof($user_id_ary))
1070              {
1071                  $error[] = $user->lang['PM_NO_USERS'];
1072              }
1073          }
1074   
1075          // Add Friends if specified
1076          $friend_list = (is_array($_REQUEST['add_' . $type])) ? array_map('intval', array_keys($_REQUEST['add_' . $type])) : array();
1077          $user_id_ary = array_merge($user_id_ary, $friend_list);
1078   
1079          foreach ($user_id_ary as $user_id)
1080          {
1081              if ($user_id == ANONYMOUS)
1082              {
1083                  continue;
1084              }
1085   
1086              $address_list['u'][$user_id] = $type;
1087          }
1088      }
1089   
1090      // Check for disallowed recipients
1091      if (!empty($address_list['u']))
1092      {
1093          // We need to check their PM status (do they want to receive PM's?)
1094          // Only check if not a moderator or admin, since they are allowed to override this user setting
1095          if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
1096          {
1097              $sql = 'SELECT user_id
1098                  FROM ' . USERS_TABLE . '
1099                  WHERE ' . $db->sql_in_set('user_id', array_keys($address_list['u'])) . '
1100                      AND user_allow_pm = 0';
1101              $result = $db->sql_query($sql);
1102   
1103              $removed = false;
1104              while ($row = $db->sql_fetchrow($result))
1105              {
1106                  $removed = true;
1107                  unset($address_list['u'][$row['user_id']]);
1108              }
1109              $db->sql_freeresult($result);
1110   
1111              // print a notice about users not being added who do not want to receive pms
1112              if ($removed)
1113              {
1114                  $error[] = $user->lang['PM_USERS_REMOVED_NO_PM'];
1115              }
1116          }
1117      }
1118  }
1119   
1120  /**
1121  * Return number of private message recipients
1122  */
1123  function num_recipients($address_list)
1124  {
1125      $num_recipients = 0;
1126   
1127      foreach ($address_list as $field => $adr_ary)
1128      {
1129          $num_recipients += sizeof($adr_ary);
1130      }
1131   
1132      return $num_recipients;
1133  }
1134   
1135  /**
1136  * Get recipient at position 'pos'
1137  */
1138  function get_recipient_pos($address_list, $position = 1)
1139  {
1140      $recipient = array();
1141   
1142      $count = 1;
1143      foreach ($address_list as $field => $adr_ary)
1144      {
1145          foreach ($adr_ary as $id => $type)
1146          {
1147              if ($count == $position)
1148              {
1149                  $recipient[$field][$id] = $type;
1150                  break 2;
1151              }
1152              $count++;
1153          }
1154      }
1155   
1156      return $recipient;
1157  }
1158   
1159  ?>