Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 68
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
report_handler_pm
0.00% covered (danger)
0.00%
0 / 68
0.00% covered (danger)
0.00%
0 / 2
90
0.00% covered (danger)
0.00%
0 / 1
 add_report
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 1
20
 validate_report_request
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2/**
3 *
4 * This file is part of the phpBB Forum Software package.
5 *
6 * @copyright (c) phpBB Limited <https://www.phpbb.com>
7 * @license GNU General Public License, version 2 (GPL-2.0)
8 *
9 * For full copyright and license information, please see
10 * the docs/CREDITS.txt file.
11 *
12 */
13
14namespace phpbb\report;
15
16use phpbb\report\exception\empty_report_exception;
17use phpbb\report\exception\already_reported_exception;
18use phpbb\report\exception\pm_reporting_disabled_exception;
19use phpbb\report\exception\entity_not_found_exception;
20
21class report_handler_pm extends report_handler
22{
23    /**
24     * {@inheritdoc}
25     * @throws pm_reporting_disabled_exception when PM reporting is disabled on the board
26     */
27    public function add_report($id, $reason_id, $report_text, $user_notify)
28    {
29        // Cast the input variables
30        $id                = (int) $id;
31        $reason_id        = (int) $reason_id;
32        $report_text    = (string) $report_text;
33        $user_notify    = (int) $user_notify;
34
35        $this->validate_report_request($id);
36
37        $sql = 'SELECT *
38            FROM ' . REPORTS_REASONS_TABLE . "
39            WHERE reason_id = $reason_id";
40        $result = $this->db->sql_query($sql);
41        $row = $this->db->sql_fetchrow($result);
42        $this->db->sql_freeresult($result);
43
44        if (!$row || (empty($report_text) && strtolower($row['reason_title']) === 'other'))
45        {
46            throw new empty_report_exception();
47        }
48
49        $report_data = array(
50            'reason_id'                            => $reason_id,
51            'post_id'                            => 0,
52            'pm_id'                                => $id,
53            'user_notify'                        => $user_notify,
54            'report_text'                        => $report_text,
55            'reported_post_text'                => $this->report_data['message_text'],
56            'reported_post_uid'                    => $this->report_data['bbcode_uid'],
57            'reported_post_bitfield'            => $this->report_data['bbcode_bitfield'],
58            'reported_post_enable_bbcode'        => $this->report_data['enable_bbcode'],
59            'reported_post_enable_smilies'        => $this->report_data['enable_smilies'],
60            'reported_post_enable_magic_url'    => $this->report_data['enable_magic_url'],
61        );
62
63        $report_id = $this->create_report($report_data);
64
65        $sql = 'UPDATE ' . PRIVMSGS_TABLE . '
66            SET message_reported = 1
67            WHERE msg_id = ' . $id;
68        $this->db->sql_query($sql);
69
70        $sql_ary = array(
71            'msg_id'        => $id,
72            'user_id'        => ANONYMOUS,
73            'author_id'        => (int) $this->report_data['author_id'],
74            'pm_deleted'    => 0,
75            'pm_new'        => 0,
76            'pm_unread'        => 0,
77            'pm_replied'    => 0,
78            'pm_marked'        => 0,
79            'pm_forwarded'    => 0,
80            'folder_id'        => PRIVMSGS_INBOX,
81        );
82
83        $sql = 'INSERT INTO ' . PRIVMSGS_TO_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
84        $this->db->sql_query($sql);
85
86        $this->notifications->add_notifications('notification.type.report_pm', array_merge($this->report_data, $row, array(
87            'report_text'    => $report_text,
88            'from_user_id'    => $this->report_data['author_id'],
89            'report_id'        => $report_id,
90        )));
91    }
92
93    /**
94     * {@inheritdoc}
95     * @throws pm_reporting_disabled_exception when PM reporting is disabled on the board
96     */
97    public function validate_report_request($id)
98    {
99        $id = (int) $id;
100
101        // Check if reporting PMs is enabled
102        if (!$this->config['allow_pm_report'])
103        {
104            throw new pm_reporting_disabled_exception();
105        }
106        else if ($id <= 0)
107        {
108            throw new entity_not_found_exception('NO_POST_SELECTED');
109        }
110
111        // Grab all relevant data
112        $sql = 'SELECT p.*, pt.*
113            FROM ' . PRIVMSGS_TABLE . ' p, ' . PRIVMSGS_TO_TABLE . " pt
114            WHERE p.msg_id = $id
115                AND p.msg_id = pt.msg_id
116                AND (p.author_id = " . $this->user->data['user_id'] . "
117                    OR pt.user_id = " . $this->user->data['user_id'] . ")";
118        $result = $this->db->sql_query($sql);
119        $report_data = $this->db->sql_fetchrow($result);
120        $this->db->sql_freeresult($result);
121
122        // Check if message exists
123        if (!$report_data)
124        {
125            $this->user->add_lang('ucp');
126            throw new entity_not_found_exception('NO_MESSAGE');
127        }
128
129        // Check if message is already reported
130        if ($report_data['message_reported'])
131        {
132            throw new already_reported_exception();
133        }
134
135        $this->report_data = $report_data;
136    }
137}