Exemple #1
0
                        phorum_admin_set_vroot($cur_folder_id,$parent_folder[$cur_folder['parent_id']]['vroot'],$cur_folder_id);
                        
                    } else { // just default root ... 
                        phorum_admin_set_vroot($cur_folder_id,0,$cur_folder_id);
                    }
                    
                    // need to clear announcements in this vroot
                    $PHORUM['forum_id']=$oldfolder['vroot'];
                    $GLOBALS['PHORUM']['forum_id']=$oldfolder['vroot'];
                    $msg_array=phorum_db_get_message(PHORUM_SORT_ANNOUNCEMENT,'sort');
                    while(count($msg_array)) {
                    	// set announcements to forum-id=0 and hidden ...
                    	$new_msg=array('forum_id'=>0,'status'=>PHORUM_STATUS_HIDDEN);
                    	
                    	phorum_db_update_message($msg_array['message_id'],$new_msg);
                    	$msg_array=phorum_db_get_message(PHORUM_SORT_ANNOUNCEMENT,'sort');
                    }
                    

                // we have now set this folder as vroot
                } elseif($setvroot && ($oldfolder['vroot']==0 || $oldfolder['vroot'] != $cur_folder_id)) {    
                    if(!phorum_admin_set_vroot($cur_folder_id)) {
                        $error="Database error while setting virtual-root info.";
                    }            
                    
                } // is there an else?
                
            } else {
                $error="Database error while adding/updating folder.";
            }
        }
Exemple #2
0
 // the message attachments with the working copy list
 // of attachments.
 foreach ($message_copy["attachments"] as $info) {
     if ($info["keep"]) {
         phorum_db_file_link($info["file_id"], $message["message_id"], PHORUM_LINK_MESSAGE);
     } else {
         if (phorum_api_file_check_delete_access($info["file_id"])) {
             phorum_api_file_delete($info["file_id"]);
         }
     }
 }
 // Retrieve the message again to have it in the correct
 // format (otherwise it's a bit messed up in the
 // post-function). Do merge back data which is not
 // stored in the database, but which we might need later on.
 $message = phorum_db_get_message($message["message_id"], 'message_id', false, true);
 foreach ($message_copy as $key => $val) {
     if (!isset($message[$key])) {
         $message[$key] = $val;
     }
 }
 phorum_update_thread_info($message["thread"]);
 /*
  * [hook]
  *     after_message_save
  *
  * [description]
  *     This hook can be used for performing actions based on what the
  *     message contained or altering it before it is emailed to the
  *     subscribed users. It is also useful for adding or removing 
  *     subscriptions.
Exemple #3
0
function phorum_mod_event_logging_hide_thread($message_id)
{
    if (!$GLOBALS["PHORUM"]["mod_event_logging"]["do_log_mod_hide"]) {
        return $message_id;
    }
    // Check for suspended logging.
    if (!empty($GLOBALS["PHORUM"]["MOD_EVENT_LOGGING"]["SUSPEND"])) {
        return $message_id;
    }
    $dbmsg = phorum_db_get_message($message_id, "message_id", TRUE);
    if ($dbmsg === NULL || !is_array($dbmsg)) {
        return $message_id;
    }
    list($source, $from_module) = event_logging_find_source(1);
    $what = $dbmsg["parent_id"] == 0 ? "thread" : "message";
    event_logging_writelog(array("message" => "Moderation: Disapproved and hid {$what} \"{$dbmsg["subject"]}\".", "loglevel" => EVENTLOG_LVL_INFO, "message_id" => $message_id, "thread_id" => $dbmsg["thread"], "forum_id" => $dbmsg["forum_id"], "source" => $source, "category" => $from_module ? EVENTLOG_CAT_MODULE : EVENTLOG_CAT_APPLICATION));
    return $message_id;
}
Exemple #4
0
    phorum_redirect_by_url($dest_url);
    exit();
}

if(isset($PHORUM["args"][1])){
    $thread=$PHORUM["args"][1];
} elseif(isset($_POST["thread"])){
    $thread=$_POST["thread"];
}

if(empty($thread)) {
    phorum_redirect_by_url(phorum_get_url(PHORUM_LIST_URL));
    exit();
}

$message=phorum_db_get_message($thread);

if(isset($PHORUM["args"]["remove"])){
    // we are removing a message from the follow list
    phorum_user_unsubscribe( $PHORUM['user']['user_id'], $thread );
    $PHORUM["DATA"]["MESSAGE"]=$PHORUM["DATA"]["LANG"]["RemoveFollowed"];
    $PHORUM["DATA"]["URL"]["REDIRECT"]=phorum_get_url(PHORUM_FOREIGN_READ_URL, $message["forum_id"], $thread);
    $PHORUM["DATA"]["BACKMSG"]=$PHORUM["DATA"]["LANG"]["BackToThread"];
    $template="message";
} elseif(isset($PHORUM["args"]["noemail"])){
    // we are stopping emails for this thread
    phorum_user_unsubscribe( $PHORUM['user']['user_id'], $thread );
    phorum_user_subscribe( $PHORUM['user']['user_id'], $message["forum_id"], $thread, PHORUM_SUBSCRIPTION_BOOKMARK );
    $PHORUM["DATA"]["MESSAGE"]=$PHORUM["DATA"]["LANG"]["NoMoreEmails"];
    $PHORUM["DATA"]["URL"]["REDIRECT"]=phorum_get_url(PHORUM_FOREIGN_READ_URL, $message["forum_id"], $thread);
    $PHORUM["DATA"]["BACKMSG"]=$PHORUM["DATA"]["LANG"]["BackToThread"];
Exemple #5
0
include_once "./include/format_functions.php";
include_once "./include/api/base.php";
include_once "./include/api/user.php";
// set all our URL's ... we need these earlier
phorum_build_common_urls();
// checking read-permissions
if (!phorum_check_read_common()) {
    return;
}
$report = false;
$template = "report";
$message = array();
// get the message
if (isset($PHORUM["args"][1]) && is_numeric($PHORUM["args"][1])) {
    $message_id = $PHORUM["args"][1];
    $message = phorum_db_get_message($message_id);
}
if (is_array($message) && count($message)) {
    // check for report requests
    if (!empty($_POST["report"])) {
        if ($PHORUM["DATA"]["LOGGEDIN"]) {
            if (empty($_POST["explanation"])) {
                $_POST["explanation"] = "<" . $PHORUM["DATA"]["LANG"]["None"] . ">";
            }
            $mail_users = phorum_api_user_list_moderators($PHORUM['forum_id'], $PHORUM['email_ignore_admin'], TRUE);
            if (count($mail_users)) {
                $mail_data = array("mailmessage" => $PHORUM["DATA"]["LANG"]['ReportPostEmailBody'], "mailsubject" => $PHORUM["DATA"]["LANG"]['ReportPostEmailSubject'], "forumname" => $PHORUM["DATA"]["NAME"], "reportedby" => $PHORUM["user"]["display_name"], "author" => $message["author"], "subject" => $message["subject"], "body" => wordwrap($message["body"], 72), "ip" => $message["ip"], "raw_date" => $message["datestamp"], "date" => phorum_date($PHORUM["short_date_time"], $message["datestamp"]), "explanation" => wordwrap($_POST["explanation"], 72), "url" => phorum_get_url(PHORUM_READ_URL, $message["thread"], $message_id), "delete_url" => phorum_get_url(PHORUM_MODERATION_URL, PHORUM_DELETE_MESSAGE, $message_id), "hide_url" => phorum_get_url(PHORUM_MODERATION_URL, PHORUM_HIDE_POST, $message_id), "edit_url" => phorum_get_url(PHORUM_POSTING_URL, 'moderation', $message_id), "reporter_url" => phorum_get_url(PHORUM_PROFILE_URL, $PHORUM["user"]["user_id"]), "message" => $message);
                if (isset($_POST[PHORUM_SESSION_LONG_TERM])) {
                    // strip any auth info from the created urls
                    $mail_data["url"] = preg_replace("!,{0,1}" . PHORUM_SESSION_LONG_TERM . "=" . urlencode($_POST[PHORUM_SESSION_LONG_TERM]) . "!", "", $mail_data["url"]);
                    $mail_data["delete_url"] = preg_replace("!,{0,1}" . PHORUM_SESSION_LONG_TERM . "=" . urlencode($_POST[PHORUM_SESSION_LONG_TERM]) . "!", "", $mail_data["delete_url"]);
Exemple #6
0
     $PHORUM['DATA']["FORM"]["thread_id"] = $message["thread"];
     $PHORUM['DATA']["FORM"]["message_id"] = $msgthd_id;
     $PHORUM['DATA']["FORM"]["message_subject"] = htmlspecialchars($message["subject"], ENT_COMPAT, $PHORUM["DATA"]["HCHARSET"]);
     $PHORUM['DATA']["FORM"]["mod_step"] = PHORUM_DO_THREAD_SPLIT;
     $template = "split_form";
     break;
 case PHORUM_DO_THREAD_SPLIT:
     // this is the last step of a thread split
     $PHORUM['DATA']['OKMSG'] = $PHORUM["DATA"]['LANG']['MsgSplitOk'];
     $PHORUM['DATA']["URL"]["REDIRECT"] = $PHORUM["DATA"]["URL"]["LIST"];
     settype($_POST['forum_id'], "int");
     settype($_POST['message'], "int");
     settype($_POST['thread'], "int");
     phorum_db_split_thread($_POST['message'], $_POST['forum_id']);
     if ($PHORUM['cache_messages']) {
         $message = phorum_db_get_message($_POST['thread']);
         foreach ($message['meta']['message_ids'] as $message_id) {
             phorum_cache_remove('message', $message_id);
         }
     }
     // update message count / stats
     phorum_update_thread_info($_POST['thread']);
     phorum_update_thread_info($_POST['message']);
     phorum_db_update_forum_stats(true);
     /*
      * [hook]
      *     after_split
      *
      * [description]
      *     This hook can be used for performing actions on
      *     splitting threads
Exemple #7
0
 $forum_ids = array_keys($forums);
 // get messages
 $messages = phorum_db_get_recent_messages(30, 0, $forum_ids, $thread, $replies ? LIST_RECENT_MESSAGES : LIST_RECENT_THREADS);
 // remove users from messages array
 $users = $messages["users"];
 unset($messages["users"]);
 // run read hooks to get everything formatted
 if (isset($PHORUM["hooks"]["read"])) {
     $messages = phorum_hook("read", $messages);
 }
 $messages = phorum_format_messages($messages);
 // set up the feed specifics based on the info we are getting
 if ($thread && $PHORUM["forum_id"]) {
     // could happen with long threads
     if (!isset($messages[$thread])) {
         $thread_start = phorum_db_get_message($thread);
     } else {
         $thread_start = $messages[$thread];
     }
     $feed_url = phorum_get_url(PHORUM_FOREIGN_READ_URL, $PHORUM["forum_id"], $thread, $thread);
     $feed_title = strip_tags($thread_start["subject"]);
     $feed_description = strip_tags($thread_start["body"]);
 } elseif ($PHORUM["forum_id"]) {
     $feed_url = phorum_get_url(PHORUM_LIST_URL);
     $feed_title = strip_tags($PHORUM["DATA"]["TITLE"] . " - " . $PHORUM["DATA"]["NAME"]);
     $feed_description = strip_tags($PHORUM["DATA"]["DESCRIPTION"]);
 } else {
     $feed_url = phorum_get_url(PHORUM_INDEX_URL);
     $feed_title = strip_tags($PHORUM["DATA"]["TITLE"]);
     $feed_description = !empty($PHORUM["description"]) ? $PHORUM["description"] : "";
 }
Exemple #8
0
// ----------------------------------------------------------------------
// Handle a posted form
// ----------------------------------------------------------------------
$messages = null;
// selected messages (based on a filter)
$filters = array();
// active filters
$filtermode = "and";
// active filter mode (and / or)
$read_url_template = phorum_get_url(PHORUM_FOREIGN_READ_URL, '%forum_id%', '%thread_id%', '%message_id%');
// If there are messages to delete in the post data, then delete them
// from the database.
$delete_count = 0;
if (isset($_POST["deletemessage"]) && is_array($_POST["deletemessage"])) {
    $msgids = array_keys($_POST["deletemessage"]);
    $msgs = phorum_db_get_message($msgids, "message_id", true);
    $deleted_messages = array();
    foreach ($msgs as $msg) {
        // if the message was already deleted, skip it
        if (isset($delete_messages[$msg["message_id"]])) {
            continue;
        }
        $PHORUM["forum_id"] = $msg["forum_id"];
        $delmode = $msg["parent_id"] == 0 ? PHORUM_DELETE_TREE : PHORUM_DELETE_MESSAGE;
        // A hook to allow modules to implement extra or different
        // delete functionality.
        list($handled, $delids, $msgid, $msg, $delmode) = phorum_hook("before_delete", array(false, 0, $msg["message_id"], $msg, $delmode));
        // If the "before_delete" hook did not handle the delete action,
        // then we have to handle it here ourselves.
        if (!$handled) {
            // Delete the message or thread.
Exemple #9
0
/**
 * Check if the active user has permission to delete a file.
 *
 * @example file_delete.php Delete a file.
 *
 * @param integer $file_id
 *     The file_id of the file for which to check the delete access.
 *
 * @return boolean
 *     TRUE if the user has rights to delete the file, FALSE otherwise.
 */
function phorum_api_file_check_delete_access($file_id)
{
    global $PHORUM;
    settype($file_id, "int");
    // Administrator users always have rights to delete files.
    if ($PHORUM["user"]["admin"]) {
        return TRUE;
    }
    // Anonymous users never have rights to delete files.
    if (empty($PHORUM["user"]["user_id"])) {
        return FALSE;
    }
    // For other users, the file information has to be retrieved
    // to be able to check the delete access.
    $file = phorum_api_file_check_read_access($file_id, PHORUM_FLAG_IGNORE_PERMS);
    // To prevent permission errors after deleting the same file twice,
    // we'll return TRUE if we did not find a file (if the file is not found,
    // then there's no harm in deleting it; the file storage API will
    // silently ignore deleting non-existent files). If some other error
    // occurred, then we return FALSE (most likely, the user does not
    // even have read permission for the file, so delete access would
    // be out of the question too).
    if ($file === FALSE) {
        if (phorum_api_errno() == PHORUM_ERRNO_NOTFOUND) {
            return TRUE;
        } else {
            return FALSE;
        }
    }
    // We don't care about deleting temporary files and files that
    // are linked to the posting editor (during writing a post).
    // Those are both intermediate states for files, without them
    // being available on the forum. So for those, we always grant
    // delete access.
    if ($file["link"] == PHORUM_LINK_TEMPFILE || $file["link"] == PHORUM_LINK_EDITOR) {
        return TRUE;
    }
    // If the file is owned by the user, then the user has rights
    // to delete the file (this would be a personal user file).
    if (!empty($file["user_id"]) && $file["user_id"] == $PHORUM["user"]["user_id"]) {
        return TRUE;
    }
    // The file is not owned by the user. In that case, the user only has
    // rights to delete it if it is a file that is linked to a message which
    // the user posted himself of which was posted in a forum for which
    // the user is a moderator.
    if ($file["link"] == PHORUM_LINK_MESSAGE) {
        // Retrieve the message to which the file is linked.
        $message = phorum_db_get_message($file["message_id"]);
        // If the message cannot be found, we do not care if the linked
        // file is deleted. It's clearly an orphin file.
        if (!$message) {
            return TRUE;
        }
        // Check if the user posted the message himself.
        if (!empty($message["user_id"]) && $message["user_id"] == $PHORUM["user"]["user_id"]) {
            return TRUE;
        }
        // Check if the user is moderator for the forum_id of the message.
        if (phorum_api_user_check_access(PHORUM_USER_ALLOW_MODERATE_MESSAGES, $message["forum_id"])) {
            return TRUE;
        }
    }
    // The default policy for any unhandled case is to deny access.
    return FALSE;
}
Exemple #10
0
          *
          */
         phorum_hook('after_merge', $msgid_translation);
     } else {
         // Cancel Thread Merge
         $PHORUM['DATA']['OKMSG'] = $PHORUM["DATA"]['LANG']['MsgMergeCancel'];
         $PHORUM['DATA']["URL"]["REDIRECT"] = $PHORUM["DATA"]["URL"]["LIST"];
     }
     // unset temporary moderator_data
     phorum_moderator_data_remove('merge_t1');
     break;
 case PHORUM_SPLIT_THREAD:
     // this is the first step of a thread split
     $PHORUM['DATA']['URL']["ACTION"] = phorum_get_url(PHORUM_MODERATION_ACTION_URL);
     $PHORUM['DATA']["FORM"]["forum_id"] = $PHORUM["forum_id"];
     $message = phorum_db_get_message($msgthd_id);
     $PHORUM['DATA']["FORM"]["thread_id"] = $message["thread"];
     $PHORUM['DATA']["FORM"]["message_id"] = $msgthd_id;
     $PHORUM['DATA']["FORM"]["message_subject"] = htmlspecialchars($message["subject"], ENT_COMPAT, $PHORUM["DATA"]["HCHARSET"]);
     $PHORUM['DATA']["FORM"]["mod_step"] = PHORUM_DO_THREAD_SPLIT;
     $template = "split_form";
     break;
 case PHORUM_DO_THREAD_SPLIT:
     // this is the last step of a thread split
     $PHORUM['DATA']['OKMSG'] = $PHORUM["DATA"]['LANG']['MsgSplitOk'];
     $PHORUM['DATA']["URL"]["REDIRECT"] = $PHORUM["DATA"]["URL"]["LIST"];
     settype($_POST['forum_id'], "int");
     settype($_POST['message'], "int");
     settype($_POST['thread'], "int");
     phorum_db_split_thread($_POST['message'], $_POST['forum_id']);
     // update message count / stats
Exemple #11
0
/**
 * Mark forums, threads or messages as read for the active Phorum user.
 *
 * @param mixed $markread_ids
 *     This parameter provides the ids of the items that have to be marked
 *     read. It can be either a single item id (depending on the $mode
 *     parameter either message_id, thread_id or forum_id) or an array
 *     of item ids.
 *
 * @param integer $mode
 *     This determines whether messages, threads or forums are marked
 *     read. Possible values for this parameter are:
 *     {@link PHORUM_MARKREAD_MESSAGES},
 *     {@link PHORUM_MARKREAD_THREADS},
 *     {@link PHORUM_MARKREAD_FORUMS}
 */
function phorum_api_newflags_markread($markread_ids, $mode = PHORUM_MARKREAD_MESSAGES)
{
    global $PHORUM;
    // No newflags for anonymous users.
    if (!$PHORUM['user']['user_id']) {
        return $messages;
    }
    // Make sure that the $markread_ids parameter is an array of integers.
    if (!is_array($markread_ids)) {
        $markread_ids = array((int) $markread_ids);
    } else {
        foreach ($markread_ids as $key => $val) {
            $markread_ids[$key] = (int) $val;
        }
    }
    // An array to keep track of the forums for which we need to invalidate
    // the cache later on.
    $processed_forum_ids = array();
    // Handle marking forums read.
    if ($mode == PHORUM_MARKREAD_FORUMS) {
        foreach ($markread_ids as $forum_id) {
            phorum_db_newflag_allread($forum_id);
            $processed_forum_ids[$forum_id] = $forum_id;
        }
    } elseif ($mode == PHORUM_MARKREAD_THREADS) {
        // Retrieve the data for the threads to mark read.
        $threads = phorum_db_get_message($markread_ids, 'message_id', TRUE);
        // Process the threads.
        $markread = array();
        foreach ($threads as $thread) {
            // In case this was no thread or broken thread data.
            if ($thread['parent_id'] != 0 || empty($thread['meta']['message_ids'])) {
                continue;
            }
            // Fetch the user's newflags for the thread's forum, so we
            // can limit the messages to mark read to the actual unread
            // messages in the thread.
            $forum_id = $thread['forum_id'];
            if (!isset($PHORUM['user']['newflags'][$forum_id])) {
                $newflags = phorum_api_newflags_by_forum($forum_id);
            } else {
                $newflags = $PHORUM['user']['newflags'][$forum_id];
            }
            // Find out what message_ids are unread in the thread.
            // If we have no newflags for the forum (yet), then consider
            // all the messages in the thread as new.
            $markread = array();
            foreach ($thread['meta']['message_ids'] as $mid) {
                if (empty($newflags) || !isset($newflags[$mid]) && $mid > $newflags['min_id']) {
                    $markread[] = array('id' => $mid, 'forum' => $forum_id);
                }
            }
            $processed_forum_ids[$forum_id] = $forum_id;
        }
        // Mark the messages in the thread(s) as read.
        phorum_db_newflag_add_read($markread);
    } elseif ($mode == PHORUM_MARKREAD_MESSAGES) {
        // Retrieve the data for the messages to mark read.
        $messages = phorum_db_get_message($markread_ids);
        // Process the messages.
        $markread = array();
        foreach ($messages as $message) {
            $markread[] = array('id' => $message['message_id'], 'forum' => $message['forum_id']);
            $processed_forum_ids[$message['forum_id']] = $message['forum_id'];
        }
        // Mark the messages read in the database.
        phorum_db_newflag_add_read($markread);
    }
    // Invalidate cached forum newflags data.
    foreach ($processed_forum_ids as $forum_id) {
        unset($PHORUM['user']['newflags'][$forum_id]);
        if ($PHORUM['cache_newflags']) {
            $cachekey = $forum_id . '-' . $PHORUM['user']['user_id'];
            phorum_cache_remove('newflags', $cachekey);
            phorum_cache_remove('newflags_index', $cachekey);
        }
    }
}
	/**
	 * Create a message.
	 *
	 * @param int $p_forumId
	 * 		The forum ID that this message belongs to.
	 *
	 * @param string $p_subject
	 * 		The subject of the message.
	 *
	 * @param string $p_body
	 * 		The body of the message
	 *
	 * @param int $p_threadId
	 * 		Set this to zero if it is the first message in the thread
	 *
	 * @param int $p_parentId
	 * 		The message you are replying to.
	 *
	 * @param string $p_author
	 * 		Human readable string for the name of the author.
	 *
	 * @param string $p_email
	 * 		Author's email.
	 *
	 * @param int $p_userId
	 * 		User ID that is stored in the phorum_users table.
	 *
	 * @return boolean
	 */
	public function create($p_forumId, $p_subject ='', $p_body = '',
					$p_threadId = 0, $p_parentId = 0,
				    $p_author = '', $p_email = '', $p_userId = 0)
	{
		global $PHORUM;
		global $g_ado_db;

		if (!is_numeric($p_forumId)) {
			return null;
		}

		// Fetch the settings and pretend they were returned to
		// us instead of setting a global variable.
		phorum_db_load_settings();
		$settings = $PHORUM['SETTINGS'];

		// Required Input
		$message['forum_id'] = $p_forumId;

		// Optional input
		$message['body'] = $p_body;
		$message['subject'] = $p_subject;
		$message['thread'] = $p_threadId;
		$message['parent_id'] = $p_parentId;
		$message['author'] = $p_author;
		$message['email'] = $p_email;
		$message['user_id'] = $p_userId;

		// Defaults
		$message['sort'] = PHORUM_SORT_DEFAULT;
		$message['closed'] = 0;

		// ??? Whats that suffix for?
//		$suffix = preg_replace("/[^a-z0-9]/i", "", $PHORUM["name"]);
//		$message['msgid'] = md5(uniqid(rand())) . ".$suffix";
		$message['msgid'] = md5(uniqid(rand()));
		$message['moderator_post'] = '0';
		$message['datestamp'] = time();

		// Fetch the forum object -
		// we need it for the config values.
		$forumObj = new Phorum_forum($p_forumId);
		if (!$forumObj->exists()) {
			return false;
		}

		// Set message workflow based on forum config.
		if ($forumObj->isModerated()) {
		    $message['status'] = PHORUM_STATUS_HOLD;
		} else {
		    $message['status'] = PHORUM_STATUS_APPROVED;
		}

		// Set user IP.
		$user_ip = $_SERVER["REMOTE_ADDR"];
		if ($settings["dns_lookup"]) {
		    $resolved = @gethostbyaddr($_SERVER["REMOTE_ADDR"]);
		    if (!empty($resolved)) {
		        $user_ip = $resolved;
		    }
		}
		$message["ip"] = $user_ip;

        $lockTables = array($PHORUM['message_table'],
                            $PHORUM['search_table'],
                            $PHORUM['subscribers_table']);
        $this->lockTables($lockTables);

		phorum_db_post_message($message);

		$this->mod_emailcomments($message);

		// Update the thread count.
		$sql = "SELECT COUNT(*) as thread_count FROM ".$PHORUM['message_table']
			   ." WHERE forum_id=".$p_forumId
			   ." AND thread=".$message['thread']
			   ." AND status > 0";
		$threadCount = $g_ado_db->GetOne($sql);

		$sql = "UPDATE ".$PHORUM['message_table']
				." SET thread_count=".$threadCount;
		$g_ado_db->Execute($sql);

	    // Retrieve the message again because the database sets
	    // some values.
	    $message = phorum_db_get_message($message["message_id"], "message_id", true);
		$this->m_data = $message;

		// Set the thread depth
		$this->__initThreadDepth();

		// Set the thread order.
		$this->__initThreadOrder();

		$this->__updateThreadInfo();

        if (isset($PHORUM['user']['user_id'])) {
		    // Mark own message read.
	        phorum_db_newflag_add_read(array(0=>array(
	            "id"    => $message["message_id"],
	            "forum" => $message["forum_id"],
	        )));

	        // Update the number of messages the user has posted.
        	phorum_db_user_addpost();
        }

        // Actions for messages which are approved.
	    if ($message["status"] > 0) {
	        // Update forum statistics,
	        // ??? Note: phorum_db_update_forum_stats requires global parameter-passing.
	        $PHORUM['forum_id'] = $p_forumId;
	        phorum_db_update_forum_stats(false, 1, $message["datestamp"]);

	        // Mail subscribed users.
	        //phorum_email_notice($message);
	    }

	    // Mail moderators.
	    if ($forumObj->emailModeratorsEnabled()) {
	        //phorum_email_moderators($message);
	    }
	    
	    $this->unlockTables();

	    return true;
	} // fn create
    }
}
// We never store the email address in the message in case it
// was posted by a registered user.
if ($message["user_id"]) {
    $message["email"] = "";
}
// Find the startmessage for the thread.
if ($mode == "reply" || $mode == "edit") {
    $top_parent = phorum_db_get_message($message["thread"]);
}
// Do permission checks for replying to messages.
if ($mode == "reply") {
    // Find the direct parent for this message.
    if ($message["thread"] != $message["parent_id"]) {
        $parent = phorum_db_get_message($message["parent_id"]);
    } else {
        $parent = $top_parent;
    }
    // If this thread is unapproved, then get out.
    $unapproved = empty($top_parent) || empty($parent) || $top_parent["status"] != PHORUM_STATUS_APPROVED || $parent["status"] != PHORUM_STATUS_APPROVED;
    if ($unapproved) {
        // In case we run the editor included in the read page,
        // we should not redirect to the listpage for moderators.
        // Else a moderator can never read an unapproved message.
        if (isset($PHORUM["postingargs"]["as_include"])) {
            if ($PHORUM["DATA"]["MODERATOR"]) {
                $PHORUM["DATA"]["OKMSG"] = $PHORUM["DATA"]["LANG"]["UnapprovedMessage"];
                return;
            }
        }
function sphinx_search_action($arrSearch)
{
    global $PHORUM;
    // No pecl class, try php version
    if (!class_exists('SphinxClient')) {
        // loads from php include_path
        require_once 'sphinxapi.php';
    }
    // these are the index-names set in sphinx.conf - one for searching messages, the other for searching by authors only
    // both contain an additional index for the deltas - changes done after the last full reindex
    $index_name_msg = 'phorum5_msg_d phorum5_msg';
    $index_name_author = 'phorum5_author phorum5_author_d';
    // excerpts_index is just one index as that function only accepts one, it used for determining charsets / mapping tables, nothing more
    $excerpts_index = 'phorum5_msg';
    $index = $index_name_msg;
    if ($arrSearch['match_type'] == 'ALL') {
        $match_mode = SPH_MATCH_ALL;
    } elseif ($arrSearch['match_type'] == 'ANY') {
        $match_mode = SPH_MATCH_ANY;
    } elseif ($arrSearch['match_type'] == 'PHRASE') {
        $match_mode = SPH_MATCH_PHRASE;
    } elseif ($arrSearch['match_type'] == 'AUTHOR') {
        $match_mode = SPH_MATCH_PHRASE;
        $index = $index_name_author;
    } else {
        // Return search control to Phorum in case the search type isn't handled by the module.
        return $arrSearch;
    }
    if (empty($arrSearch['search']) && !empty($arrSearch['author'])) {
        $arrSearch['search'] = $arrSearch['author'];
        $index = $index_name_author;
    }
    $sphinx = new SphinxClient();
    $sphinx->SetServer($PHORUM['mod_sphinx_search']['hostname'], $PHORUM['mod_sphinx_search']['port']);
    $sphinx->SetMatchMode($match_mode);
    // set the limits for paging
    $sphinx->SetLimits($arrSearch['offset'], $arrSearch['length']);
    // set the timeframe to search
    if ($arrSearch['match_dates'] > 0) {
        $min_ts = time() - 86400 * $arrSearch['match_dates'];
        $max_ts = time();
        $sphinx->SetFilterRange('datestamp', $min_ts, $max_ts);
    }
    // Check what forums the active Phorum user can read.
    $allowed_forums = phorum_api_user_check_access(PHORUM_USER_ALLOW_READ, PHORUM_ACCESS_LIST);
    // If the user is not allowed to search any forum or the current
    // active forum, then return the emtpy search results array.
    if (empty($allowed_forums) || $PHORUM['forum_id'] > 0 && !in_array($PHORUM['forum_id'], $allowed_forums)) {
        $arrSearch['results'] = array();
        $arrSearch['totals'] = 0;
        $arrSearch['continue'] = 0;
        $arrSearch['raw_body'] = 1;
        return $arrSearch;
    }
    // Prepare forum_id restriction.
    $search_forums = array();
    foreach (explode(',', $arrSearch['match_forum']) as $forum_id) {
        if ($forum_id == 'ALL') {
            $search_forums = $allowed_forums;
            break;
        }
        if (isset($allowed_forums[$forum_id])) {
            $search_forums[] = $forum_id;
        }
    }
    $sphinx->SetFilter('forum_id', $search_forums);
    // set the sort-mode
    $sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'datestamp');
    // do the actual query
    $results = $sphinx->Query($arrSearch['search'], $index);
    $res = $sphinx->GetLastWarning();
    if ($res) {
        error_log("sphinx_search.php: WARNING: {$res}");
    }
    $res = $sphinx->GetLastError();
    if ($res) {
        error_log("sphinx_search.php: ERROR: {$res}");
    }
    // if no messages were found, then return empty handed.
    if (!isset($results['matches'])) {
        $arrSearch['results'] = array();
        $arrSearch['totals'] = 0;
        $arrSearch['continue'] = 0;
        $arrSearch['raw_body'] = 1;
        return $arrSearch;
    }
    $search_msg_ids = $results['matches'];
    // get the messages we found
    $found_messages = phorum_db_get_message(array_keys($search_msg_ids), 'message_id', true);
    // sort them in reverse order of the message_id to automagically sort them by date desc this way
    krsort($found_messages);
    reset($found_messages);
    // prepare the array for building highlighted excerpts
    $docs = array();
    foreach ($found_messages as $id => $data) {
        // remove hidden text in the output - only added by the hidden_msg module
        $data['body'] = preg_replace("/(\\[hide=([\\#a-z0-9]+?)\\](.+?)\\[\\/hide\\])/is", '', $data['body']);
        $docs[] = htmlspecialchars(phorum_strip_body($data['body']));
    }
    $words = '';
    if (!empty($results['words'])) {
        $words = implode(' ', array_keys($results['words']));
    }
    $opts = array('chunk_separator' => ' [...] ');
    // build highlighted excerpts
    $highlighted = $sphinx->BuildExcerpts($docs, $excerpts_index, $words, $opts);
    $res = $sphinx->GetLastWarning();
    if ($res) {
        error_log("sphinx_search.php: WARNING: {$res}");
    }
    $res = $sphinx->GetLastError();
    if ($res) {
        error_log("sphinx_search.php: ERROR: {$res}");
    }
    $cnt = 0;
    foreach ($found_messages as $id => $content) {
        $found_messages[$id]['short_body'] = $highlighted[$cnt];
        $cnt++;
    }
    $arrSearch['results'] = $found_messages;
    // we need the total results
    $arrSearch['totals'] = $results['total_found'];
    if ($arrSearch['totals'] > 1000) {
        $arrSearch['totals'] = 1000;
    }
    // don't run the default search
    $arrSearch['continue'] = 0;
    // tell it to leave the body alone
    $arrSearch['raw_body'] = 1;
    return $arrSearch;
}
Exemple #15
0
$PHORUM['DATA']['SELECTED'] = $moddays;
$PHORUM['DATA']['SELECTED_2'] = $showwaiting ? true : false;
// Store current selection for the user.
phorum_api_user_save_settings(array("cc_messages_moddays" => $moddays, "cc_messages_onlyunapproved" => $showwaiting));
// some needed vars
$numunapproved = 0;
$oldforum = $PHORUM['forum_id'];
$mod_forums = phorum_api_user_check_access(PHORUM_USER_ALLOW_MODERATE_MESSAGES, PHORUM_ACCESS_LIST);
$gotforums = count($mod_forums) > 0;
if ($gotforums && isset($_POST['deleteids']) && count($_POST['deleteids'])) {
    //print_var($_POST['deleteids']);
    $deleteids = $_POST['deleteids'];
    foreach ($deleteids as $did => $did_var) {
        $deleteids[$did] = (int) $did_var;
    }
    $delete_messages = phorum_db_get_message(array_keys($deleteids), 'message_id', true);
    //print_var($delete_messages);
    foreach ($deleteids as $msgthd_id => $doit) {
        // A hook to allow modules to implement extra or different
        // delete functionality.
        if ($doit && isset($mod_forums[$delete_messages[$msgthd_id]['forum_id']])) {
            $delete_handled = 0;
            if (isset($PHORUM["hooks"]["before_delete"])) {
                list($delete_handled, $msg_ids, $msgthd_id, $delete_messages[$msgthd_id], $delete_mode) = phorum_hook("before_delete", array(0, 0, $msgthd_id, $delete_messages[$msgthd_id], PHORUM_DELETE_MESSAGE));
            }
            // Handle the delete action, unless a module already handled it.
            if (!$delete_handled) {
                // Delete the message from the database.
                phorum_db_delete_message($msgthd_id, PHORUM_DELETE_MESSAGE);
                // Delete the message attachments from the database.
                $files = phorum_db_get_message_file_list($msgthd_id);
Exemple #16
0
         $msg["recipients"][$message["user_id"]] = array("display_name" => $message["author"], "user_id" => $message["user_id"]);
         $msg = phorum_pm_quoteformat($message["author"], $message["user_id"], $msg);
         // Include the other recipient, excecpt the active
         // user himself, when replying to all.
         if (isset($_POST["reply_to_all"])) {
             foreach ($message["recipients"] as $rcpt) {
                 if ($user_id == $rcpt["user_id"]) {
                     continue;
                 }
                 $msg["recipients"][$rcpt["user_id"]] = array("display_name" => $rcpt["display_name"], "user_id" => $rcpt["user_id"]);
             }
         }
         $hide_userselect = 1;
         // Setup data for replying privately to a forum post.
     } elseif (isset($PHORUM["args"]["message_id"])) {
         $message = phorum_db_get_message($PHORUM["args"]["message_id"], "message_id", true);
         if (phorum_api_user_check_access(PHORUM_USER_ALLOW_READ) && ($PHORUM["forum_id"] == $message["forum_id"] || $message["forum_id"] == 0)) {
             // get url to the message board thread
             $origurl = phorum_get_url(PHORUM_READ_URL, $message["thread"], $message["message_id"]);
             // Get the data for the user that we reply to.
             $user = phorum_api_user_get($message["user_id"]);
             $msg["subject"] = $message["subject"];
             $msg["message"] = $message["body"];
             $msg["recipients"][$message["user_id"]] = array('display_name' => $user["display_name"], 'user_id' => $user["user_id"]);
             $msg = phorum_pm_quoteformat($user["display_name"], $user["user_id"], $msg, $origurl);
         }
         $hide_userselect = 1;
     }
 }
 /**
  * [hook]
Exemple #17
0
function phorum_check_moved_message($thread)
{
    $forum_id = $GLOBALS['PHORUM']['forum_id'];
    $message = phorum_db_get_message($thread, 'message_id', true);
    if (!empty($message) && $message['forum_id'] != $forum_id) {
        $ret = $message['forum_id'];
    } else {
        $ret = false;
    }
    return $ret;
}
Exemple #18
0
        if ($info["keep"]) {
            phorum_db_file_link(
                $info["file_id"],
                $message["message_id"],
                PHORUM_LINK_MESSAGE
            );
        } else {
            phorum_db_file_delete($info["file_id"]);
        }
    }

    // Retrieve the message again to have it in the correct
    // format (otherwise it's a bit messed up in the
    // post-function). Do merge back data which is not
    // stored in the database, but which we might need later on.
    $message = phorum_db_get_message($message["message_id"]);
    foreach ($message_copy as $key => $val) {
        if (! isset($message[$key])) {
            $message[$key] = $val;
        }
    }

    phorum_update_thread_info($message["thread"]);

    // Subscribe user to the thread if requested.
    if ($message["email_notify"] && $message["user_id"]) {
        phorum_user_subscribe(
            $message["user_id"], $PHORUM["forum_id"],
            $message["thread"], PHORUM_SUBSCRIPTION_MESSAGE
        );
    }