toGlyph('fa-paperclip')); } else { define('ATTACHMENT_ICON', ""); } } if(deftrue('BOOTSTRAP') && deftrue('FONTAWESOME')) { define('PM_DELETE_ICON', $tp->toGlyph('fa-trash', 'fw=1')); } else { define("PM_DELETE_ICON", "" . LAN_DELETE . ""); } $qs = explode('.', e_QUERY); $action = varset($qs[0], 'inbox'); if(!$action) { $action = 'inbox'; } if(!empty($_GET['mode'])) { $action = $tp->filter($_GET['mode']); } /* if($action == 'textarea' || $action == 'input') { if($qs[1] == 'pm_to') { require_once(e_HANDLER.'user_select_class.php'); $us = new user_select; $us->popup(); exit; } }*/ $pm_proc_id = intval(varset($qs[1], 0)); //$pm_prefs = $sysprefs->getArray('pm_prefs'); $pm_prefs = e107::getPlugPref('pm'); $pm_prefs['perpage'] = (int) varset($pm_prefs['perpage'], 10); if(!isset($pm_prefs['pm_class']) || !check_class($pm_prefs['pm_class'])) { require_once(HEADERF); $ns->tablerender(LAN_PM, LAN_PM_12); require_once(FOOTERF); exit; } //setScVar('pm_handler_shortcodes','pmPrefs', $pm_prefs); $pmManager = new pmbox_manager($pm_prefs); //setScVar('pm_handler_shortcodes','pmManager', &$pmManager); class pm_extended extends private_message { protected $pmManager = null; /** * Constructor * * @param array $prefs - pref settings for PM plugin * @return none */ public function __construct($prefs, $manager) { $this->pmManager = $manager; parent::__construct($prefs); } /** * Show the 'Send to' form * @param array|int $to_uid - a PM block of message to reply to, or UID of user to send to * * @return string text for display */ function show_send($to_uid) { // trigger_error('Method ' . __METHOD__ . ' is deprecated. Use e107::serialize() instead.', E_USER_DEPRECATED); $pm_info = array(); $pm_outbox = $this->pmManager->pm_getInfo('outbox'); if(is_array($to_uid)) { $pm_info = $to_uid; // We've been passed a 'reply to' PM $to_uid = $pm_info['pm_from']; } if(!empty($to_uid)) { if($this->canSendTo($to_uid) == false) { return "
" . LAN_PM_114 . "
";// sending to this user is not permitted. } $sql2 = e107::getDb('sql2'); if($sql2->select('user', 'user_name', 'user_id = ' . intval($to_uid))) //TODO add a check for userclass. { $row = $sql2->fetch(); $pm_info['from_name'] = $row['user_name']; $pm_info['pm_from'] = intval($to_uid); } else { return "
" . LAN_PM_115 . "
"; } } //echo "Show_send: {$to_uid} from {$pm_info['from_name']} is happening
"; if($pm_outbox['outbox']['filled'] >= 100) { return str_replace('{PERCENT}', $pm_outbox['outbox']['filled'], LAN_PM_13); } // $tpl_file = THEME.'pm_template.php'; // include_once(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php'); if(THEME_LEGACY === true) { include_once(THEME . 'pm_template.php'); $PM_SEND_PM = $this->updateTemplate($PM_SEND_PM); } if(empty($PM_SEND_PM)) { $PM_SEND_PM = e107::getTemplate('pm', 'pm', 'send'); } $enc = (check_class($this->pmPrefs['attach_class']) ? "enctype='multipart/form-data'" : ''); // setScVar('pm_handler_shortcodes','pmInfo', $pm_info); $sc = e107::getScBatch('pm', true, 'pm'); $sc->setVars($pm_info); $sc->wrapper('pm'); // $PM_SEND_PM = $this->updateTemplate($PM_SEND_PM); $text = "
" . e107::getParser()->parseTemplate($PM_SEND_PM, true, $sc) . '
'; return $text; } /** * Show inbox * @param int $start - offset into list * * @return string text for display */ function show_inbox($start = 0) { $tp = e107::getParser(); // $tpl_file = THEME.'pm_template.php'; // include(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php'); if(THEME_LEGACY === true) { include_once(THEME . 'pm_template.php'); // Is updateTemplate really necessary for v2.x templates? $PM_INBOX = array(); $PM_INBOX['start'] = $this->updateTemplate($PM_INBOX_HEADER); $PM_INBOX['item'] = $this->updateTemplate($PM_INBOX_TABLE); $PM_INBOX['empty'] = $this->updateTemplate($PM_INBOX_EMPTY); $PM_INBOX['end'] = $this->updateTemplate($PM_INBOX_FOOTER); } if(empty($PM_INBOX['item'])) { $PM_INBOX = e107::getTemplate('pm', 'pm', 'inbox'); } $pm_blocks = $this->block_get(); $pmlist = $this->pm_get_inbox(USERID, $start, $this->pmPrefs['perpage']); // setScVar('pm_handler_shortcodes', 'pmNextPrev', array('start' => $start, 'total' => $pmlist['total_messages'])); $sc = e107::getScBatch('pm', true, 'pm'); $sc->pmNextPrev = array('start' => $start, 'total' => $pmlist['total_messages']); $sc->wrapper('pm'); // Is updateTemplate really necessary for v2.x templates? /* $PM_INBOX_HEADER = $this->updateTemplate($PM_INBOX['start']); $PM_INBOX_TABLE = $this->updateTemplate($PM_INBOX['item']); $PM_INBOX_EMPTY = $this->updateTemplate($PM_INBOX['empty']); $PM_INBOX_FOOTER = $this->updateTemplate($PM_INBOX['end']); */ $txt = "
"; $txt .= $tp->parseTemplate($PM_INBOX['start'], true, $sc); if($pmlist['total_messages']) { foreach($pmlist['messages'] as $rec) { if(trim($rec['pm_subject']) == '') { $rec['pm_subject'] = '[' . LAN_PM_61 . ']'; } $sc->setVars($rec); $txt .= $tp->parseTemplate($PM_INBOX['item'], true, $sc); } } else { $txt .= $tp->parseTemplate($PM_INBOX['empty'], true, $sc); } $txt .= $tp->parseTemplate($PM_INBOX['end'], true, $sc); $txt .= "
"; return $txt; } /** * Show outbox * @param int $start - offset into list * * @return string text for display */ function show_outbox($start = 0) { $tp = e107::getParser(); // $tpl_file = THEME.'pm_template.php'; // include(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php'); if(THEME_LEGACY === true) { include_once(THEME . 'pm_template.php'); // Is updateTemplate really necessary for v2.x templates? $PM_OUTBOX = array(); $PM_OUTBOX['start'] = $this->updateTemplate($PM_OUTBOX_HEADER); $PM_OUTBOX['item'] = $this->updateTemplate($PM_OUTBOX_TABLE); $PM_OUTBOX['empty'] = $this->updateTemplate($PM_OUTBOX_EMPTY); $PM_OUTBOX['end'] = $this->updateTemplate($PM_OUTBOX_FOOTER); } if(empty($PM_OUTBOX['item'])) { $PM_OUTBOX = e107::getTemplate('pm', 'pm', 'outbox'); } $pmlist = $this->pm_get_outbox(USERID, $start, $this->pmPrefs['perpage']); // setScVar('pm_handler_shortcodes', 'pmNextPrev', array('start' => $start, 'total' => $pmlist['total_messages'])); $sc = e107::getScBatch('pm', true, 'pm'); $sc->pmNextPrev = array('start' => $start, 'total' => $pmlist['total_messages']); $sc->wrapper('pm'); // Is updateTemplate really necessary for v2.x templates? /* $PM_OUTBOX_HEADER = $this->updateTemplate($PM_OUTBOX['start']); $PM_OUTBOX_TABLE = $this->updateTemplate($PM_OUTBOX['item']); $PM_OUTBOX_EMPTY = $this->updateTemplate($PM_OUTBOX['empty']); $PM_OUTBOX_FOOTER = $this->updateTemplate($PM_OUTBOX['end']); */ $txt = "
"; $txt .= $tp->parseTemplate($PM_OUTBOX['start'], true, $sc); if($pmlist['total_messages']) { foreach($pmlist['messages'] as $rec) { if(trim($rec['pm_subject']) == '') { $rec['pm_subject'] = '[' . LAN_PM_61 . ']'; } // setScVar('pm_handler_shortcodes','pmInfo', $rec); $sc->setVars($rec); $txt .= $tp->parseTemplate($PM_OUTBOX['item'], true, $sc); } } else { $txt .= $tp->parseTemplate($PM_OUTBOX['empty'], true, $sc); } $txt .= $tp->parseTemplate($PM_OUTBOX['end'], true, $sc); $txt .= '
'; return $txt; } /** * Show details of a pm * @param int $pmid - DB ID for PM * @param string $comeFrom - inbox|outbox - determines whether inbox or outbox is shown after PM * * @return string text for display */ function show_pm($pmid, $comeFrom = '') { $ns = e107::getRender(); // $tpl_file = THEME.'pm_template.php'; // include_once(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php'); if(THEME_LEGACY === true) { $PM_SHOW = null; include_once(THEME . 'pm_template.php'); $PM_SHOW = $this->updateTemplate($PM_SHOW); } if(empty($PM_SHOW)) { $PM_SHOW = e107::getTemplate('pm', 'pm', 'show'); } $pm_info = $this->pm_get($pmid); $sc = e107::getScBatch('pm', true, 'pm'); $sc->setVars($pm_info); $sc->wrapper('pm'); if($pm_info['pm_to'] != USERID && $pm_info['pm_from'] != USERID) { $ns->tablerender(LAN_PM, LAN_PM_60); return null; } if($pm_info['pm_read'] == 0 && $pm_info['pm_to'] == USERID) { // Inbox $now = time(); $pm_info['pm_read'] = $now; $this->pm_mark_read($pmid, $pm_info); } $sc->pmMode = $comeFrom; // $PM_SHOW = $this->updateTemplate($PM_SHOW); $txt = e107::getParser()->parseTemplate($PM_SHOW, true, $sc); if($comeFrom == 'outbox') { $bread = array('text' => LAN_PLUGIN_PM_OUTBOX, 'url' => e107::url('pm', 'index') . '?mode=outbox'); } else { $bread = array('text' => LAN_PLUGIN_PM_INBOX, 'url' => e107::url('pm', 'index') . '?mode=inbox'); } $ns->tablerender(LAN_PM, $this->breadcrumb($bread, '#' . $pmid) . $txt); if(!$comeFrom) { if($pm_info['pm_from'] == USERID) { $comeFrom = 'outbox'; } } // Need to show inbox or outbox from start if($comeFrom == 'outbox') { // Show Outbox $caption = ''; if(!deftrue('BOOTSTRAP')) { $caption .= LAN_PM . " - " . LAN_PLUGIN_PM_OUTBOX; } $ns->tablerender($caption, $this->show_outbox(), 'PM'); } else { // Show Inbox $caption = ''; if(!deftrue('BOOTSTRAP')) { $caption .= LAN_PM . " - " . LAN_PLUGIN_PM_INBOX; } $ns->tablerender($caption, $this->show_inbox(), 'PM'); } } /** * Show list of blocked users * @param int $start - not used at present; offset into list * * @return string text for display */ public function showBlocked($start = 0) { $tp = e107::getParser(); // $tpl_file = THEME.'pm_template.php'; // include(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php'); if(THEME_LEGACY === true) { include_once(THEME . 'pm_template.php'); // Is updateTemplate really necessary for v2.x templates? $PM_BLOCKED = array(); $PM_BLOCKED['start'] = $this->updateTemplate($PM_BLOCKED_HEADER); $PM_BLOCKED['item'] = $this->updateTemplate($PM_BLOCKED_TABLE); $PM_BLOCKED['empty'] = $this->updateTemplate($PM_BLOCKED_EMPTY); $PM_BLOCKED['end'] = $this->updateTemplate($PM_BLOCKED_FOOTER); } if(empty($PM_BLOCKED)) { $PM_BLOCKED = e107::getTemplate('pm', 'pm', 'blocked'); } $pmBlocks = $this->block_get_user(); // TODO - handle pagination, maybe (is it likely to be necessary?) $sc = e107::getScBatch('pm', true, 'pm'); $sc->pmBlocks = $pmBlocks; $sc->wrapper('pm'); // Is updateTemplate really necessary for v2.x templates? /* $PM_BLOCKED_HEADER = $this->updateTemplate($PM_BLOCKED['start']); $PM_BLOCKED_TABLE = $this->updateTemplate($PM_BLOCKED['item']); $PM_BLOCKED_EMPTY = $this->updateTemplate($PM_BLOCKED['empty']); $PM_BLOCKED_FOOTER = $this->updateTemplate($PM_BLOCKED['end']); */ $txt = "
"; $txt .= $tp->parseTemplate($PM_BLOCKED['start'], true, $sc); if($pmTotalBlocked = count($pmBlocks)) { foreach($pmBlocks as $pmBlocked) { $sc->pmBlocked = $pmBlocked; // setScVar('pm_handler_shortcodes','pmBlocked', $pmBlocked); $txt .= $tp->parseTemplate($PM_BLOCKED['item'], true, $sc); } } else { $txt .= $tp->parseTemplate($PM_BLOCKED['empty'], true, $sc); } $txt .= $tp->parseTemplate($PM_BLOCKED['end'], true, $sc); $txt .= '
'; return $txt; } /** * Send a PM based on $_POST parameters * * @return string text for display */ function post_pm() { // print_a($_POST); if(!check_class($this->pmPrefs['pm_class'])) { return LAN_PM_12; } $pm_info = $this->pmManager->pm_getInfo('outbox'); if($pm_info['outbox']['total'] != $_POST['numsent']) { return LAN_PM_14; } if(isset($_POST['pm_userclass']) && ($_POST['pm_userclass'] == e_UC_NOBODY)) { $_POST['pm_userclass'] = false; } if(isset($_POST['user'])) { $_POST['pm_to'] = $_POST['user']; } if(isset($_POST['pm_to'])) { $msg = ''; if(!empty($_POST['pm_userclass'])) { if(!check_class($this->pmPrefs['opt_userclass'])) { return LAN_PM_15; } elseif((!check_class($_POST['pm_userclass']) || !check_class($this->pmPrefs['multi_class'])) && !ADMIN) { return LAN_PM_16; } } else { $to_array = explode(",", str_replace(" ", "", $_POST['pm_to'])); $to_array = array_unique($to_array); if(count($to_array) == 1) { $_POST['pm_to'] = $to_array[0]; } if(check_class($this->pmPrefs['multi_class']) && count($to_array) > 1) { foreach($to_array as $to) { if($to_info = $this->pm_getuid($to)) { // Check whether sender is blocked - if so, add one to count if(!e107::getDb()->update('private_msg_block', "pm_block_count=pm_block_count+1 WHERE pm_block_from = '" . USERID . "' AND pm_block_to = '" . e107::getParser()->toDB($to) . "'")) { $_POST['to_array'][] = $to_info; } } } } else { if($to_info = $this->pm_getuid($_POST['pm_to'])) { $_POST['to_info'] = $to_info; } else { return LAN_PM_17; } if(e107::getDb()->update('private_msg_block', "pm_block_count=pm_block_count+1 WHERE pm_block_from = '" . USERID . "' AND pm_block_to = '{$to_info['user_id']}'")) { return LAN_PM_18 . $to_info['user_name']; } } } if(isset($_POST['receipt'])) { if(!check_class($this->pmPrefs['receipt_class'])) { unset($_POST['receipt']); } } $totalsize = strlen($_POST['pm_message']); $maxsize = intval($this->pmPrefs['attach_size']) * 1024; foreach(array_keys($_FILES['file_userfile']['size']) as $fid) { if($maxsize > 0 && $_FILES['file_userfile']['size'][$fid] > $maxsize) { $msg .= str_replace("{FILENAME}", $_FILES['file_userfile']['name'][$fid], LAN_PM_62) . "
"; $_FILES['file_userfile']['size'][$fid] = 0; } $totalsize += $_FILES['file_userfile']['size'][$fid]; } if(intval($this->pmPrefs['pm_limits']) > 0) { if($this->pmPrefs['pm_limits'] == '1') { if($pm_info['outbox']['total'] == $pm_info['outbox']['limit']) { return LAN_PM_19; } } else { if($pm_info['outbox']['size'] + $totalsize > $pm_info['outbox']['limit']) { return LAN_PM_21; } } } if(!empty($_POST['uploaded'])) { if(check_class($this->pmPrefs['attach_class'])) { $_POST['uploaded'] = $this->processAttachments(); foreach($_POST['uploaded'] as $var) { if(!empty($var['message'])) { $msg .= $var['message'] . "
"; } } } else { $msg .= LAN_PM_23 . '
'; unset($_POST['uploaded']); } } $_POST['from_id'] = USERID; return $msg . $this->add($_POST); } } function processAttachments() { $randnum = rand(1000, 9999); $type = 'attachment+' . $randnum . '_'; return e107::getFile()->getUploaded("attachments", $type, array('max_file_count' => 3)); } function breadcrumb($type = '', $other='') { if(!deftrue('BOOTSTRAP')) { return null; } $array = array(); $array[0] = array('text' => LAN_PM, 'url' => e107::url('pm', 'index')); if(is_string($type)) { $array[1] = array('text' => $type, 'url' => null); } elseif(is_array($type)) { $array[1] = $type; } if(!empty($other)) { $array[2] = array('text' => $other, 'url' => null); } e107::breadcrumb($array); return e107::getForm()->breadcrumb($array); } } /** * Look up users matching a keyword, output a list of those found * Direct echo */ function pm_user_lookup() { $sql = e107::getDb(); $tp = e107::getParser(); $query = "SELECT * FROM #user WHERE user_name REGEXP '^" . $tp->filter($_POST['keyword'], 'w') . "' "; if($sql->gen($query)) { echo '['; while($row = $sql->fetch()) { $u[] = "{\"caption\":\"" . $row['user_name'] . "\",\"value\":" . $row['user_id'] . "}"; } echo implode(",", $u); echo ']'; } exit; } //$pm =& new private_message; $pm = new pm_extended($pm_prefs, $pmManager); $message = ''; $pmSource = ''; if(isset($_POST['pm_come_from'])) { $pmSource = $tp->toDB($_POST['pm_come_from']); } elseif(isset($qs[2])) { $pmSource = $tp->toDB($qs[2]); } //Auto-delete message, if timeout set in admin $del_qry = array(); $read_timeout = intval($pm_prefs['read_timeout']); $unread_timeout = intval($pm_prefs['unread_timeout']); if($read_timeout > 0) { $timeout = time() - ($read_timeout * 86400); $del_qry[] = "(pm_sent < {$timeout} AND pm_read > 0)"; } if($unread_timeout > 0) { $timeout = time() - ($unread_timeout * 86400); $del_qry[] = "(pm_sent < {$timeout} AND pm_read = 0)"; } if(count($del_qry) > 0) { $qry = implode(' OR ', $del_qry) . ' AND (pm_from = ' . USERID . ' OR pm_to = ' . USERID . ')'; if($sql->select('private_msg', 'pm_id', $qry)) { $delList = $sql->db_getList(); foreach($delList as $p) { $pm->del($p['pm_id'], true); } } } if('del' == $action || isset($_POST['pm_delete_selected'])) { if(isset($_POST['pm_delete_selected'])) { foreach(array_keys($_POST['selected_pm']) as $id) { $message .= LAN_PM_24 . ": {$id}
"; $message .= $pm->del($id); } } if('del' == $action) { $message = $pm->del($pm_proc_id); } if($pmSource) { $action = $pmSource; } else { if(substr($_SERVER['HTTP_REFERER'], -5) == 'inbox') { $action = 'inbox'; } elseif(substr($_SERVER['HTTP_REFERER'], -6) == 'outbox') { $action = 'outbox'; } } $pm_proc_id = 0; unset($qs); } if('delblocked' == $action || isset($_POST['pm_delete_blocked_selected'])) { if(isset($_POST['pm_delete_blocked_selected'])) { foreach(array_keys($_POST['selected_pm']) as $id) { $message .= LAN_PM_70 . ": {$id}
"; $message .= $pm->block_del($id) . '
'; } } elseif('delblocked' == $action) { $message = $pm->block_del($pm_proc_id); } $action = 'blocked'; $pm_proc_id = 0; unset($qs); } if('block' == $action) { $message = $pm->block_add($pm_proc_id); $action = 'inbox'; $pm_proc_id = 0; } if('unblock' == $action) { $message = $pm->block_del($pm_proc_id); $action = 'inbox'; $pm_proc_id = 0; } if('get' == $action) { $pm->send_file($pm_proc_id, intval($qs[2])); exit; } require_once(HEADERF); if(isset($_POST['postpm'])) { $message = $pm->post_pm(); $action = 'outbox'; } $mes = e107::getMessage(); if($message != '') { $mes->add($message); // $ns->tablerender('', "
". $message."
"); } //----------------------------------------- // DISPLAY TASKS //----------------------------------------- switch($action) { case 'send' : $ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PLUGIN_PM_NEW) . $mes->render() . $pm->show_send($pm_proc_id)); break; case 'reply' : $pmid = $pm_proc_id; if($pm_info = $pm->pm_get($pmid)) { if($pm_info['pm_to'] != USERID) { $ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PM_55) . $mes->render() . LAN_PM_56); } else { $ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PM_55) . $mes->render() . $pm->show_send($pm_info)); } } else { $ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PM_55) . $mes->render() . LAN_PM_57); } break; case 'inbox' : $caption = LAN_PM; if(THEME_LEGACY === true) { $caption .= ' - ' . LAN_PLUGIN_PM_INBOX; } $ns->tablerender($caption, $pm->breadcrumb(LAN_PLUGIN_PM_INBOX) . $mes->render() . $pm->show_inbox($pm_proc_id), 'PM'); break; case 'outbox' : $caption = LAN_PM; if(THEME_LEGACY === true) { $caption .= ' - ' . LAN_PLUGIN_PM_OUTBOX; } $ns->tablerender($caption, $pm->breadcrumb(LAN_PLUGIN_PM_OUTBOX) . $mes->render() . $pm->show_outbox($pm_proc_id), 'PM'); break; case 'show' : $pm->show_pm($pm_proc_id, $pmSource); break; case 'blocked' : $caption = LAN_PM; if(THEME_LEGACY === true) { $caption .= ' - ' . LAN_PM_66; } $ns->tablerender($caption, $pm->breadcrumb('blocked') . $mes->render() . $pm->showBlocked($pm_proc_id), 'PM'); break; } require_once(FOOTERF);