Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 101
report_handler_post
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
156
0.00% covered (danger)
0.00%
0 / 101
 add_report
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 46
 validate_report_request
0.00% covered (danger)
0.00%
0 / 1
56
0.00% covered (danger)
0.00%
0 / 55
<?php
/**
 *
 * This file is part of the phpBB Forum Software package.
 *
 * @copyright (c) phpBB Limited <https://www.phpbb.com>
 * @license GNU General Public License, version 2 (GPL-2.0)
 *
 * For full copyright and license information, please see
 * the docs/CREDITS.txt file.
 *
 */
namespace phpbb\report;
use phpbb\report\exception\invalid_report_exception;
use phpbb\report\exception\empty_report_exception;
use phpbb\report\exception\already_reported_exception;
use phpbb\report\exception\entity_not_found_exception;
use phpbb\report\exception\report_permission_denied_exception;
class report_handler_post extends report_handler
{
    /**
     * @var array
     */
    protected $forum_data;
    /**
     * {@inheritdoc}
     * @throws \phpbb\report\exception\report_permission_denied_exception when the user does not have permission to report the post
     */
    public function add_report($id, $reason_id, $report_text, $user_notify)
    {
        // Cast the input variables
        $id                = (int) $id;
        $reason_id        = (int) $reason_id;
        $report_text    = (string) $report_text;
        $user_notify    = (int) $user_notify;
        $this->validate_report_request($id);
        $sql = 'SELECT *
            FROM ' . REPORTS_REASONS_TABLE . "
            WHERE reason_id = $reason_id";
        $result = $this->db->sql_query($sql);
        $row = $this->db->sql_fetchrow($result);
        $this->db->sql_freeresult($result);
        if (!$row || (empty($report_text) && strtolower($row['reason_title']) === 'other'))
        {
            throw new empty_report_exception();
        }
        $report_data = array(
            'reason_id'                            => $reason_id,
            'post_id'                            => $id,
            'pm_id'                                => 0,
            'user_notify'                        => $user_notify,
            'report_text'                        => $report_text,
            'reported_post_text'                => $this->report_data['post_text'],
            'reported_post_uid'                    => $this->report_data['bbcode_uid'],
            'reported_post_bitfield'            => $this->report_data['bbcode_bitfield'],
            'reported_post_enable_bbcode'        => $this->report_data['enable_bbcode'],
            'reported_post_enable_smilies'        => $this->report_data['enable_smilies'],
            'reported_post_enable_magic_url'    => $this->report_data['enable_magic_url'],
        );
        $this->create_report($report_data);
        $sql = 'UPDATE ' . POSTS_TABLE . '
            SET post_reported = 1
            WHERE post_id = ' . $id;
        $this->db->sql_query($sql);
        if (!$this->report_data['topic_reported'])
        {
            $sql = 'UPDATE ' . TOPICS_TABLE . '
                SET topic_reported = 1
                WHERE topic_id = ' . $this->report_data['topic_id'] . '
                    OR topic_moved_id = ' . $this->report_data['topic_id'];
            $this->db->sql_query($sql);
        }
        $this->notifications->add_notifications('notification.type.report_post', array_merge($this->report_data, $row, $this->forum_data, array(
            'report_text'    => $report_text,
        )));
    }
    /**
     * {@inheritdoc}
     * @throws \phpbb\report\exception\report_permission_denied_exception when the user does not have permission to report the post
     */
    public function validate_report_request($id)
    {
        $id = (int) $id;
        // Check if id is valid
        if ($id <= 0)
        {
            throw new entity_not_found_exception('NO_POST_SELECTED');
        }
        // Grab all relevant data
        $sql = 'SELECT t.*, p.*
            FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
            WHERE p.post_id = $id
                AND p.topic_id = t.topic_id";
        $result = $this->db->sql_query($sql);
        $report_data = $this->db->sql_fetchrow($result);
        $this->db->sql_freeresult($result);
        if (!$report_data)
        {
            throw new entity_not_found_exception('POST_NOT_EXIST');
        }
        $forum_id = (int) $report_data['forum_id'];
        $sql = 'SELECT *
            FROM ' . FORUMS_TABLE . '
            WHERE forum_id = ' . $forum_id;
        $result = $this->db->sql_query($sql);
        $forum_data = $this->db->sql_fetchrow($result);
        $this->db->sql_freeresult($result);
        if (!$forum_data)
        {
            throw new invalid_report_exception('FORUM_NOT_EXIST');
        }
        $acl_check_ary = array(
            'f_list' => 'POST_NOT_EXIST',
            'f_read' => 'USER_CANNOT_READ',
            'f_report' => 'USER_CANNOT_REPORT'
        );
        /**
         * This event allows you to do extra auth checks and verify if the user
         * has the required permissions
         *
         * @event core.report_post_auth
         * @var    array    forum_data        All data available from the forums table on this post's forum
         * @var    array    report_data        All data available from the topics and the posts tables on this post (and its topic)
         * @var    array    acl_check_ary    An array with the ACL to be tested. The evaluation is made in the same order as the array is sorted
         *                                The key is the ACL name and the value is the language key for the error message.
         * @since 3.1.3-RC1
         */
        $vars = array(
            'forum_data',
            'report_data',
            'acl_check_ary',
        );
        extract($this->dispatcher->trigger_event('core.report_post_auth', compact($vars)));
        $this->auth->acl($this->user->data);
        foreach ($acl_check_ary as $acl => $error)
        {
            if (!$this->auth->acl_get($acl, $forum_id))
            {
                throw new report_permission_denied_exception($error);
            }
        }
        unset($acl_check_ary);
        if ($report_data['post_reported'])
        {
            throw new already_reported_exception();
        }
        $this->report_data    = $report_data;
        $this->forum_data    = $forum_data;
    }
}