Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 62
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
topic_form
0.00% covered (danger)
0.00%
0 / 62
0.00% covered (danger)
0.00%
0 / 6
240
0.00% covered (danger)
0.00%
0 / 1
 get_topic_row
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 check_allow
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
56
 bind
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 submit
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
20
 get_return_message
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 render
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
2
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\message;
15
16/**
17* Class topic_form
18* Form used to send topics as notification emails
19*/
20class topic_form extends form
21{
22    /** @var int */
23    protected $topic_id;
24    /** @var array */
25    protected $topic_row;
26    /** @var string */
27    protected $recipient_address;
28    /** @var string */
29    protected $recipient_name;
30    /** @var string */
31    protected $recipient_lang;
32
33    /**
34    * Get the data of the topic
35    *
36    * @param int $topic_id
37    * @return    false|array        false if the topic does not exist, array otherwise
38    */
39    protected function get_topic_row($topic_id)
40    {
41        $sql = 'SELECT forum_id, topic_title
42            FROM ' . TOPICS_TABLE . '
43            WHERE topic_id = ' . (int) $topic_id;
44        $result = $this->db->sql_query($sql);
45        $row = $this->db->sql_fetchrow($result);
46        $this->db->sql_freeresult($result);
47
48        return $row;
49    }
50
51    /**
52    * {inheritDoc}
53    */
54    public function check_allow()
55    {
56        $error = parent::check_allow();
57        if ($error)
58        {
59            return $error;
60        }
61
62        if (!$this->auth->acl_get('u_sendemail'))
63        {
64            return 'NO_EMAIL';
65        }
66
67        if (!$this->topic_row)
68        {
69            return 'NO_TOPIC';
70        }
71
72        if (!$this->auth->acl_get('f_read', $this->topic_row['forum_id']))
73        {
74            if ($this->user->data['user_id'] != ANONYMOUS)
75            {
76                send_status_line(403, 'Forbidden');
77            }
78            else
79            {
80                send_status_line(401, 'Unauthorized');
81            }
82            return 'SORRY_AUTH_READ';
83        }
84
85        if (!$this->auth->acl_get('f_email', $this->topic_row['forum_id']))
86        {
87            return 'NO_EMAIL';
88        }
89
90        return false;
91    }
92
93    /**
94    * {inheritDoc}
95    */
96    public function bind(\phpbb\request\request_interface $request)
97    {
98        parent::bind($request);
99
100        $this->topic_id = $request->variable('t', 0);
101        $this->recipient_address = $request->variable('email', '');
102        $this->recipient_name = $request->variable('name', '', true);
103        $this->recipient_lang = $request->variable('lang', $this->config['default_lang']);
104
105        $this->topic_row = $this->get_topic_row($this->topic_id);
106    }
107
108    /**
109    * {inheritDoc}
110    */
111    public function submit(\messenger $messenger)
112    {
113        if (!$this->recipient_address || !preg_match('/^' . get_preg_expression('email') . '$/i', $this->recipient_address))
114        {
115            $this->errors[] = $this->user->lang['EMPTY_ADDRESS_EMAIL'];
116        }
117
118        if (!$this->recipient_name)
119        {
120            $this->errors[] = $this->user->lang['EMPTY_NAME_EMAIL'];
121        }
122
123        $this->message->set_template('email_notify');
124        $this->message->set_template_vars(array(
125            'TOPIC_NAME'    => html_entity_decode($this->topic_row['topic_title'], ENT_COMPAT),
126            'U_TOPIC'        => generate_board_url() . '/viewtopic.' . $this->phpEx . '?t=' . $this->topic_id,
127        ));
128        $this->message->set_body($this->body);
129        $this->message->add_recipient(
130            $this->recipient_name,
131            $this->recipient_address,
132            $this->recipient_lang,
133            NOTIFY_EMAIL
134        );
135        $this->message->set_sender_notify_type(NOTIFY_EMAIL);
136
137        parent::submit($messenger);
138    }
139
140    /**
141    * {inheritDoc}
142    */
143    public function get_return_message()
144    {
145        return sprintf($this->user->lang['RETURN_TOPIC'],  '<a href="' . append_sid($this->phpbb_root_path . 'viewtopic.' . $this->phpEx, 't=' . $this->topic_id) . '">', '</a>');
146    }
147
148    /**
149    * {inheritDoc}
150    */
151    public function render(\phpbb\template\template $template)
152    {
153        parent::render($template);
154
155        $this->user->add_lang('viewtopic');
156
157        $lang_options = phpbb_language_select($this->db, $this->recipient_lang);
158
159        $template->assign_vars(array(
160            'EMAIL'                => $this->recipient_address,
161            'NAME'                => $this->recipient_name,
162            'LANG_OPTIONS'        => [
163                'id'        => 'lang',
164                'name'        => 'lang',
165                'options'    => $lang_options,
166            ],
167            'MESSAGE'            => $this->body,
168
169            'L_EMAIL_BODY_EXPLAIN'    => $this->user->lang['EMAIL_TOPIC_EXPLAIN'],
170            'S_POST_ACTION'            => append_sid($this->phpbb_root_path . 'memberlist.' . $this->phpEx, 'mode=email&amp;t=' . $this->topic_id))
171        );
172    }
173}