diff options
author | Nils Adermann <naderman@naderman.de> | 2011-06-05 09:40:43 +0200 |
---|---|---|
committer | Joas Schilling <nickvergessen@gmx.de> | 2014-05-29 02:14:27 +0200 |
commit | d52f34f5ec5d006ec7e610e1c72266df21e70ac7 (patch) | |
tree | 31a105436f12a23a13e4af995a19ff43e8d02191 | |
parent | 624c0e4ef6b638adb325e72158ac3a7e5f66b0bf (diff) | |
download | forums-d52f34f5ec5d006ec7e610e1c72266df21e70ac7.tar forums-d52f34f5ec5d006ec7e610e1c72266df21e70ac7.tar.gz forums-d52f34f5ec5d006ec7e610e1c72266df21e70ac7.tar.bz2 forums-d52f34f5ec5d006ec7e610e1c72266df21e70ac7.tar.xz forums-d52f34f5ec5d006ec7e610e1c72266df21e70ac7.zip |
[ticket/10073] Add a contact administrators page and refactor email forms.
The message to be displayed on top of the email form cannot be configured yet.
PHPBB3-10073
-rw-r--r-- | phpBB/includes/functions.php | 1 | ||||
-rw-r--r-- | phpBB/includes/message/admin_form.php | 118 | ||||
-rw-r--r-- | phpBB/includes/message/form.php | 119 | ||||
-rw-r--r-- | phpBB/includes/message/message.php | 188 | ||||
-rw-r--r-- | phpBB/includes/message/topic_form.php | 150 | ||||
-rw-r--r-- | phpBB/includes/message/user_form.php | 111 | ||||
-rw-r--r-- | phpBB/install/schemas/schema_data.sql | 1 | ||||
-rw-r--r-- | phpBB/language/en/common.php | 3 | ||||
-rw-r--r-- | phpBB/language/en/memberlist.php | 9 | ||||
-rw-r--r-- | phpBB/memberlist.php | 269 | ||||
-rw-r--r-- | phpBB/phpbb/session.php | 2 | ||||
-rw-r--r-- | phpBB/styles/prosilver/template/memberlist_email.html | 28 | ||||
-rw-r--r-- | phpBB/styles/prosilver/template/navbar_footer.html | 1 | ||||
-rw-r--r-- | phpBB/styles/subsilver2/template/index_body.html | 5 | ||||
-rw-r--r-- | phpBB/styles/subsilver2/template/memberlist_email.html | 24 |
15 files changed, 787 insertions, 242 deletions
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index c423e29d9d..8ca966eb52 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4922,6 +4922,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id = 'U_SEARCH_UNREAD' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=unreadposts'), 'U_SEARCH_ACTIVE_TOPICS'=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=active_topics'), 'U_DELETE_COOKIES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=delete_cookies'), + 'U_CONTACT_US' => (!$config['contact_admin_form_enable']) /** TODO: && !$config['contact_admin_info']) */ ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contactadmin'), 'U_TEAM' => ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile')) ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=team'), 'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'), 'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'), diff --git a/phpBB/includes/message/admin_form.php b/phpBB/includes/message/admin_form.php new file mode 100644 index 0000000000..a27b281535 --- /dev/null +++ b/phpBB/includes/message/admin_form.php @@ -0,0 +1,118 @@ +<?php +/** +* +* @package email +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +class phpbb_message_admin_form extends phpbb_message_form +{ + protected $subject; + protected $sender_name; + protected $sender_address; + + public function check_allow() + { + $error = parent::check_allow(); + if ($error) + { + return $error; + } + + if (!$this->config['contact_admin_form_enable']) /** TODO: && !$this->config['contact_admin_info']) */ + { + return 'NO_CONTACT_PAGE'; + } + + return false; + } + + public function bind($request) + { + parent::bind($request); + + $this->subject = $request->variable('subject', '', true); + $this->sender_address = $request->variable('email', ''); + $this->sender_name = $request->variable('name', '', true); + } + + public function submit(messenger $messenger) + { + if (!$this->subject) + { + $this->errors[] = $this->user->lang['EMPTY_SUBJECT_EMAIL']; + } + if (!$this->body) + { + $this->errors[] = $this->user->lang['EMPTY_MESSAGE_EMAIL']; + } + + if ($this->user->data['is_registered']) + { + $this->message->set_sender_from_user($this->user); + $this->sender_name = $this->user->data['username']; + $this->sender_address = $this->user->data['user_email']; + } + else + { + if (!$this->sender_name) + { + $this->errors[] = $this->user->lang['EMPTY_SENDER_NAME']; + } + if (!$this->sender_address || !preg_match('/^' . get_preg_expression('email') . '$/i', $this->sender_address)) + { + $this->errors[] = $this->user->lang['EMPTY_SENDER_EMAIL']; + } + + $this->message->set_sender($this->user->ip, $this->sender_name, $this->sender_address, $this->user->lang_name); + $this->message->set_sender_notify_type(NOTIFY_EMAIL); + } + + $this->message->set_template('contact_admin'); + $this->message->set_subject($this->subject); + $this->message->set_body($this->body); + $this->message->add_recipient( + $this->user->lang['ADMINISTRATOR'], + $this->config['board_contact'], + $this->config['default_lang'], + NOTIFY_EMAIL + ); + + $this->message->set_template_vars(array( + 'FROM_EMAIL_ADDRESS' => $this->sender_address, + 'FROM_IP_ADDRESS' => $this->user->ip, + 'S_IS_REGISTERED' => $this->user->data['is_registered'], + + 'U_FROM_PROFILE' => generate_board_url() . '/memberlist.' . $this->phpEx . '?mode=viewprofile&u=' . $this->user->data['user_id'], + )); + + parent::submit($messenger); + } + + public function render($template) + { + $template->assign_vars(array( + 'S_CONTACT_ADMIN' => true, + 'S_CONTACT_FORM' => $this->config['contact_admin_form_enable'], + 'S_IS_REGISTERED' => $this->user->data['is_registered'], + + 'CONTACT_INFO' => '', /** TODO: $this->config['contact_admin_info'] */ + 'MESSAGE' => $this->body, + 'SUBJECT' => $this->subject, + 'NAME' => $this->sender_name, + 'EMAIL' => $this->sender_address, + )); + + parent::render($template); + } +} diff --git a/phpBB/includes/message/form.php b/phpBB/includes/message/form.php new file mode 100644 index 0000000000..2da5406a63 --- /dev/null +++ b/phpBB/includes/message/form.php @@ -0,0 +1,119 @@ +<?php +/** +* +* @package message +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +abstract class phpbb_message_form +{ + protected $phpbb_root_path; + protected $phpEx; + protected $user; + protected $auth; + protected $config; + protected $db; + protected $errors; + protected $message; + protected $cc_sender; + protected $body; + + public function __construct($phpbb_root_path, $phpEx, $user, $auth, $config, $db) + { + $this->phpbb_root_path = $phpbb_root_path; + $this->phpEx = $phpEx; + $this->user = $user; + $this->auth = $auth; + $this->config = $config; + $this->db = $db; + + $this->errors = array(); + + $this->message = new phpbb_message($config['board_contact'], $config['server_name']); + $this->message->set_sender_from_user($this->user); + } + + /** + * Returns the title for the email form page + */ + public function get_page_title() + { + $this->user->lang['SEND_EMAIL']; + } + + public function get_template_file() + { + return 'memberlist_email.html'; + } + + public function check_allow() + { + if (!$this->config['email_enable']) + { + return 'EMAIL_DISABLED'; + } + + if (time() - $this->user->data['user_emailtime'] < $this->config['flood_interval']) + { + return 'FLOOD_EMAIL_LIMIT'; + } + + return false; + } + + public function get_return_message() + { + return sprintf($this->user->lang['RETURN_INDEX'], '<a href="' . append_sid($this->phpbb_root_path . 'index.' . $this->phpEx) . '">', '</a>'); + } + + public function bind(phpbb_request_interface $request) + { + $this->cc_sender = $request->is_set_post('cc_sender'); + $this->body = $request->variable('message', '', true); + } + + public function submit(messenger $messenger) + { + if (!check_form_key('memberlist_email')) + { + $this->errors[] = 'FORM_INVALID'; + } + + if (!sizeof($this->errors)) + { + $sql = 'UPDATE ' . USERS_TABLE . ' + SET user_emailtime = ' . time() . ' + WHERE user_id = ' . $this->user->data['user_id']; + $result = $this->db->sql_query($sql); + + if ($this->cc_sender) + { + $this->message->cc_sender(); + } + + $this->message->send($messenger); + + meta_refresh(3, append_sid($this->phpbb_root_path . 'index.' . $this->phpEx)); + trigger_error($this->user->lang['EMAIL_SENT'] . '<br /><br />' . $this->get_return_message()); + } + } + + public function render($template) + { + add_form_key('memberlist_email'); + + $template->assign_vars(array( + 'ERROR_MESSAGE' => (sizeof($this->errors)) ? implode('<br />', $this->errors) : '', + )); + } +} diff --git a/phpBB/includes/message/message.php b/phpBB/includes/message/message.php new file mode 100644 index 0000000000..b0948f940a --- /dev/null +++ b/phpBB/includes/message/message.php @@ -0,0 +1,188 @@ +<?php +/** +* +* @package message +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +class phpbb_message +{ + protected $board_contact; + protected $server_name; + + protected $subject = ''; + protected $body = ''; + protected $template = ''; + protected $template_vars = array(); + + protected $sender_ip = ''; + protected $sender_name = ''; + protected $sender_address = ''; + protected $sender_lang = ''; + protected $sender_id = ''; + protected $sender_username = ''; + protected $sender_jabber = ''; + protected $sender_notify_type = NOTIFY_EMAIL; + + protected $recipients; + + public function __construct($board_contact, $server_name) + { + $this->board_contact = $board_contact; + $this->server_name = $server_name; + } + + public function set_subject($subject) + { + $this->subject = $subject; + } + + public function set_body($body) + { + $this->body = $body; + } + + public function set_template($template) + { + $this->template = $template; + } + + public function set_template_vars($template_vars) + { + $this->template_vars = $template_vars; + } + + public function add_recipient_from_user_row(array $user) + { + $this->add_recipient( + $user['username'], + $user['user_email'], + $user['user_lang'], + $user['username'], + $user['user_jabber'], + $user['user_notify_type'] + ); + } + + public function add_recipient($recipient_name, $recipient_address, $recipient_lang, $recipient_notify_type = NOTIFY_EMAIL, $recipient_username = '', $recipient_jabber = '') + { + $this->recipients[] = array( + 'name' => $recipient_name, + 'address' => $recipient_address, + 'lang' => $recipient_lang, + 'username' => $recipient_username, + 'jabber' => $recipient_jabber, + 'notify_type' => $recipient_notify_type, + 'to_name' => $recipient_name, + ); + } + + public function set_sender_from_user($user) + { + $this->set_sender( + $user->ip, + $user->data['username'], + $user->data['user_email'], + $user->lang_name, + $user->data['user_id'], + $user->data['username'], + $user->data['user_jabber'] + ); + + $this->set_sender_notify_type($user->data['user_notify_type']); + } + + public function set_sender($sender_ip, $sender_name, $sender_address, $sender_lang = '', $sender_id = 0, $sender_username = '', $sender_jabber = '') + { + $this->sender_ip = $sender_ip; + $this->sender_name = $sender_name; + $this->sender_address = $sender_address; + $this->sender_lang = $sender_lang; + $this->sender_id = $sender_id; + $this->sender_username = $sender_username; + $this->sender_jabber = $sender_jabber; + } + + public function set_sender_notify_type($sender_notify_type) + { + $this->sender_notify_type = $sender_notify_type; + } + + +// Ok, now the same email if CC specified, but without exposing the users email address + public function cc_sender() + { + if (!sizeof($this->recipients)) + { + trigger_error('No email recipients specified'); + } + if (!$this->sender_address) + { + trigger_error('No email sender specified'); + } + + $this->recipients[] = array( + 'lang' => $this->sender_lang, + 'address' => $this->sender_address, + 'name' => $this->sender_name, + 'username' => $this->sender_username, + 'jabber' => $this->sender_jabber, + 'notify_type' => $this->sender_notify_type, + 'to_name' => $this->recipients[0]['to_name'], + ); + } + + public function send(messenger $messenger) + { + if (!sizeof($this->recipients)) + { + return; + } + + foreach ($this->recipients as $recipient) + { + $messenger->template($this->template, $recipient['lang']); + $messenger->replyto($this->sender_address); + $messenger->to($recipient['address'], $recipient['name']); + $messenger->im($recipient['jabber'], $recipient['username']); + + $messenger->headers('X-AntiAbuse: Board servername - ' . $this->server_name); + $messenger->headers('X-AntiAbuse: User IP - ' . $this->sender_ip); + + if ($this->sender_id) + { + $messenger->headers('X-AntiAbuse: User_id - ' . $this->sender_id); + } + if ($this->sender_username) + { + $messenger->headers('X-AntiAbuse: Username - ' . $this->sender_username); + } + + $messenger->subject(htmlspecialchars_decode($this->subject)); + + $messenger->assign_vars(array( + 'BOARD_CONTACT' => $this->board_contact, + 'TO_USERNAME' => htmlspecialchars_decode($recipient['to_name']), + 'FROM_USERNAME' => htmlspecialchars_decode($this->sender_name), + 'MESSAGE' => htmlspecialchars_decode($this->body)) + ); + + if (sizeof($this->template_vars)) + { + $messenger->assign_vars($this->template_vars); + } + + $messenger->send($recipient['notify_type']); + } + } +} diff --git a/phpBB/includes/message/topic_form.php b/phpBB/includes/message/topic_form.php new file mode 100644 index 0000000000..0dbfdb0ca2 --- /dev/null +++ b/phpBB/includes/message/topic_form.php @@ -0,0 +1,150 @@ +<?php +/** +* +* @package message +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +class phpbb_message_topic_form extends phpbb_message_form +{ + protected $topic_id; + + protected $topic_row; + protected $recipient_address; + protected $recipient_name; + protected $recipient_lang; + + protected function get_topic_row($topic_id) + { + $sql = 'SELECT forum_id, topic_title + FROM ' . TOPICS_TABLE . ' + WHERE topic_id = ' . (int) $topic_id; + $result = $this->db->sql_query($sql); + $row = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + return $row; + } + + public function check_allow() + { + $error = parent::check_allow(); + if ($error) + { + return $error; + } + + if (!$this->auth->acl_get('u_sendemail')) + { + return 'NO_EMAIL'; + } + + if (!$this->topic_row) + { + return 'NO_TOPIC'; + } + + /** + * @todo remove else case when global topics have forum id + */ + if ($this->topic_row['forum_id']) + { + if (!$this->auth->acl_get('f_read', $this->topic_row['forum_id'])) + { + return 'SORRY_AUTH_READ'; + } + + if (!$this->auth->acl_get('f_email', $this->topic_row['forum_id'])) + { + return 'NO_EMAIL'; + } + } + else + { + // If global announcement, we need to check if the user is able to at least read and email in one forum... + if (!$this->auth->acl_getf_global('f_read')) + { + return 'SORRY_AUTH_READ'; + } + + if (!$this->auth->acl_getf_global('f_email')) + { + return 'NO_EMAIL'; + } + } + + return false; + } + + public function bind($request) + { + parent::bind($request); + + $this->topic_id = $request->variable('t', 0); + $this->recipient_address = $request->variable('email', ''); + $this->recipient_name = $request->variable('name', '', true); + $this->recipient_lang = $request->variable('lang', $this->config['default_lang']); + + $this->topic_row = $this->get_topic_row($this->topic_id); + } + + public function submit(messenger $messenger) + { + if (!$this->recipient_address || !preg_match('/^' . get_preg_expression('email') . '$/i', $this->recipient_address)) + { + $this->errors[] = $this->user->lang['EMPTY_ADDRESS_EMAIL']; + } + + if (!$this->recipient_name) + { + $this->errors[] = $this->user->lang['EMPTY_NAME_EMAIL']; + } + + + $this->message->set_template('email_notify'); + $this->message->set_template_vars(array( + 'TOPIC_NAME' => htmlspecialchars_decode($this->topic_row['topic_title']), + 'U_TOPIC' => generate_board_url() . '/viewtopic.' . $this->phpEx . '?f=' . $this->topic_row['forum_id'] . '&t=' . $this->topic_id, + )); + + $this->message->add_recipient( + $this->recipient_name, + $this->recipient_address, + $this->recipient_lang, + NOTIFY_EMAIL + ); + $this->message->set_sender_notify_type(NOTIFY_EMAIL); + + parent::submit($messenger); + } + + protected function get_return_message() + { + return sprintf($this->user->lang['RETURN_TOPIC'], '<a href="' . append_sid($this->phpbb_root_path . 'viewtopic.' . $this->phpEx, 'f=' . $this->topic_row['forum_id'] . '&t=' . $this->topic_id) . '">', '</a>'); + } + + public function render($template) + { + parent::render($template); + + $template->assign_vars(array( + 'EMAIL' => $this->recipient_address, + 'NAME' => $this->recipient_name, + 'S_LANG_OPTIONS' => language_select($this->recipient_lang), + 'MESSAGE' => $this->body, + + 'L_EMAIL_BODY_EXPLAIN' => $this->user->lang['EMAIL_TOPIC_EXPLAIN'], + 'S_POST_ACTION' => append_sid($this->phpbb_root_path . 'memberlist.' . $this->phpEx, 'mode=email&t=' . $this->topic_id)) + ); + } +} diff --git a/phpBB/includes/message/user_form.php b/phpBB/includes/message/user_form.php new file mode 100644 index 0000000000..3898975a3f --- /dev/null +++ b/phpBB/includes/message/user_form.php @@ -0,0 +1,111 @@ +<?php +/** +* +* @package message +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +class phpbb_message_user_form extends phpbb_message_form +{ + protected $recipient_id; + protected $subject; + + public function check_allow() + { + $error = parent::check_allow(); + if ($error) + { + return $error; + } + + if (!$this->auth->acl_get('u_sendemail')) + { + return 'NO_EMAIL'; + } + + if ($this->recipient_id == ANONYMOUS || !$this->config['board_email_form']) + { + return 'NO_EMAIL'; + } + + if (!$this->recipient_row) + { + return 'NO_USER'; + } + + // Can we send email to this user? + if (!$this->recipient_row['user_allow_viewemail'] && !$this->auth->acl_get('a_user')) + { + return 'NO_EMAIL'; + } + + return false; + } + + protected function get_user_row($user_id) + { + $sql = 'SELECT username, user_email, user_allow_viewemail, user_lang, user_jabber, user_notify_type + FROM ' . USERS_TABLE . ' + WHERE user_id = ' . ((int) $user_id) . ' + AND user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')'; + $result = $this->db->sql_query($sql); + $row = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + return $row; + } + + public function bind($request) + { + parent::bind($request); + + $this->recipient_id = $request->variable('u', 0); + $this->subject = $request->variable('subject', '', true); + + $this->recipient_row = $this->get_user_row($this->recipient_id); + } + + public function submit(messenger $messenger) + { + if (!$this->subject) + { + $this->errors[] = $this->user->lang['EMPTY_SUBJECT_EMAIL']; + } + + if (!$this->body) + { + $this->errors[] = $this->user->lang['EMPTY_MESSAGE_EMAIL']; + } + + $this->message->set_template('profile_send_email'); + $this->message->set_subject($this->subject); + $this->message->set_body($this->body); + $this->message->add_recipient_from_user_row($this->recipient_row); + + parent::submit($messenger); + } + + public function render($template) + { + parent::render($template); + + $template->assign_vars(array( + 'S_SEND_USER' => true, + 'S_POST_ACTION' => append_sid($this->phpbb_root_path . 'memberlist.' . $this->phpEx, 'mode=email&u=' . $this->recipient_id), + + 'USERNAME' => $this->recipient_row['username'], + 'SUBJECT' => $this->subject, + 'MESSAGE' => $this->body, + )); + } +} diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index 7afed448ad..53d1b13e9d 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -82,6 +82,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('confirm_refresh', INSERT INTO phpbb_config (config_name, config_value) VALUES ('check_attachment_content', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('check_dnsbl', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('chg_passforce', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('contact_admin_form_enable', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_domain', ''); INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_name', 'phpbb3'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_path', '/'); diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 5e524a6164..f451ac5f25 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -171,6 +171,7 @@ $lang = array_merge($lang, array( 'CONNECTION_SUCCESS' => 'Connection was successful!', 'CONTACT' => 'Contact', 'CONTACT_USER' => 'Contact %s', + 'CONTACT_US' => 'Contact us', 'COOKIES_DELETED' => 'All board cookies successfully deleted.', 'CURRENT_TIME' => 'It is currently %s', @@ -730,7 +731,7 @@ $lang = array_merge($lang, array( 'TOO_SHORT_USER_PASSWORD' => 'The password you entered is too short.', 'TOO_SHORT_USERNAME' => 'The username you entered is too short.', 'TOO_SHORT_EMAIL' => 'The email address you entered is too short.', - + 'TOO_SHORT_EMAIL_CONFIRM' => 'The email address confirmation you entered is too short.', 'TOO_SMALL' => 'The value you entered is too small.', 'TOO_SMALL_MAX_RECIPIENTS' => 'The value of <strong>Maximum number of allowed recipients per private message</strong> setting you entered is too small.', diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php index 7b6838e6d9..b8f2adf42b 100644 --- a/phpBB/language/en/memberlist.php +++ b/phpBB/language/en/memberlist.php @@ -49,6 +49,8 @@ $lang = array_merge($lang, array( 'BEFORE' => 'Before', 'CC_EMAIL' => 'Send a copy of this email to yourself.', + 'CONTACT_USER' => 'Contact', + 'CONTACT_ADMIN' => 'Contact a Board Administrator', 'DEST_LANG' => 'Language', 'DEST_LANG_EXPLAIN' => 'Select an appropriate language (if available) for the recipient of this message.', @@ -61,6 +63,8 @@ $lang = array_merge($lang, array( 'EMPTY_MESSAGE_EMAIL' => 'You must enter a message to be emailed.', 'EMPTY_MESSAGE_IM' => 'You must enter a message to be send.', 'EMPTY_NAME_EMAIL' => 'You must enter the real name of the recipient.', + 'EMPTY_SENDER_EMAIL' => 'You must provide a valid email address.', + 'EMPTY_SENDER_NAME' => 'You must provide a name.', 'EMPTY_SUBJECT_EMAIL' => 'You must specify a subject for the email.', 'EQUAL_TO' => 'Equal to', @@ -98,6 +102,8 @@ $lang = array_merge($lang, array( 'MORE_THAN' => 'More than', + 'NO_CONTACT_FORM' => 'The board administrator contact form has been disabled.', + 'NO_CONTACT_PAGE' => 'The board administrator contact page has been disabled.', 'NO_EMAIL' => 'You are not permitted to send email to this user.', 'NO_VIEW_USERS' => 'You are not authorised to view the member list or profiles.', @@ -113,6 +119,9 @@ $lang = array_merge($lang, array( 'SELECT_MARKED' => 'Select marked', 'SELECT_SORT_METHOD' => 'Select sort method', + 'SENDER_EMAIL_ADDRESS' => 'Your email address', + 'SENDER_NAME' => 'Your name', + 'SEND_AIM_MESSAGE' => 'Send AIM message', 'SEND_ICQ_MESSAGE' => 'Send ICQ message', 'SEND_IM' => 'Instant messaging', 'SEND_JABBER_MESSAGE' => 'Send Jabber message', diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php index 187b4b1cd9..c81ee97cd7 100644 --- a/phpBB/memberlist.php +++ b/phpBB/memberlist.php @@ -20,6 +20,13 @@ $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); include($phpbb_root_path . 'includes/functions_display.' . $phpEx); +$mode = request_var('mode', ''); + +if ($mode === 'contactadmin') +{ + define('SKIP_CHECK_BAN', true); +} + // Start session management $user->session_begin(); $auth->acl($user->data); @@ -29,7 +36,6 @@ $user->setup(array('memberlist', 'groups')); $template->assign_var('S_IN_MEMBERLIST', true); // Grab data -$mode = request_var('mode', ''); $action = request_var('action', ''); $user_id = request_var('u', ANONYMOUS); $username = request_var('un', '', true); @@ -44,7 +50,7 @@ if ($mode == 'leaders') } // Check our mode... -if (!in_array($mode, array('', 'group', 'viewprofile', 'email', 'contact', 'searchuser', 'team', 'livesearch'))) +if (!in_array($mode, array('', 'group', 'viewprofile', 'email', 'contact', 'contactadmin', 'searchuser', 'team', 'livesearch'))) { trigger_error('NO_MODE'); } @@ -52,6 +58,7 @@ if (!in_array($mode, array('', 'group', 'viewprofile', 'email', 'contact', 'sear switch ($mode) { case 'email': + case 'contactadmin': break; case 'livesearch': @@ -736,265 +743,49 @@ switch ($mode) break; + case 'contactadmin': case 'email': - - // Send an email - $page_title = $user->lang['SEND_EMAIL']; - $template_html = 'memberlist_email.html'; - - add_form_key('memberlist_email'); - - if (!$config['email_enable']) - { - trigger_error('EMAIL_DISABLED'); - } - - if (!$auth->acl_get('u_sendemail')) - { - trigger_error('NO_EMAIL'); - } - - // Are we trying to abuse the facility? - if (time() - $user->data['user_emailtime'] < $config['flood_interval']) + if (!class_exists('messenger')) { - trigger_error('FLOOD_EMAIL_LIMIT'); + include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); } - // Determine action... - $user_id = request_var('u', 0); - $topic_id = request_var('t', 0); + $user_id = request_var('u', 0); + $topic_id = request_var('t', 0); - // Send email to user... if ($user_id) { - if ($user_id == ANONYMOUS || !$config['board_email_form']) - { - trigger_error('NO_EMAIL'); - } - - // Get the appropriate username, etc. - $sql = 'SELECT username, user_email, user_allow_viewemail, user_lang, user_jabber, user_notify_type - FROM ' . USERS_TABLE . " - WHERE user_id = $user_id - AND user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')'; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - if (!$row) - { - trigger_error('NO_USER'); - } - - // Can we send email to this user? - if (!$row['user_allow_viewemail'] && !$auth->acl_get('a_user')) - { - trigger_error('NO_EMAIL'); - } + $form = new phpbb_message_user_form($phpbb_root_path, $phpEx, $user, $auth, $config, $db); } else if ($topic_id) { - // Send topic heads-up to email address - $sql = 'SELECT forum_id, topic_title - FROM ' . TOPICS_TABLE . " - WHERE topic_id = $topic_id"; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - if (!$row) - { - trigger_error('NO_TOPIC'); - } - - if ($row['forum_id']) - { - if (!$auth->acl_get('f_read', $row['forum_id'])) - { - trigger_error('SORRY_AUTH_READ'); - } - - if (!$auth->acl_get('f_email', $row['forum_id'])) - { - trigger_error('NO_EMAIL'); - } - } - else - { - // If global announcement, we need to check if the user is able to at least read and email in one forum... - if (!$auth->acl_getf_global('f_read')) - { - trigger_error('SORRY_AUTH_READ'); - } - - if (!$auth->acl_getf_global('f_email')) - { - trigger_error('NO_EMAIL'); - } - } + $form = new phpbb_message_topic_form($phpbb_root_path, $phpEx, $user, $auth, $config, $db); + } + else if ($mode === 'contactadmin') + { + $form = new phpbb_message_admin_form($phpbb_root_path, $phpEx, $user, $auth, $config, $db); } else { trigger_error('NO_EMAIL'); } - $error = array(); - - $name = utf8_normalize_nfc(request_var('name', '', true)); - $email = request_var('email', ''); - $email_lang = request_var('lang', $config['default_lang']); - $subject = utf8_normalize_nfc(request_var('subject', '', true)); - $message = utf8_normalize_nfc(request_var('message', '', true)); - $cc = (isset($_POST['cc_email'])) ? true : false; - $submit = (isset($_POST['submit'])) ? true : false; - - if ($submit) + $form->bind($request); + $error = $form->check_allow(); + if ($error) { - if (!check_form_key('memberlist_email')) - { - $error[] = 'FORM_INVALID'; - } - if ($user_id) - { - if (!$subject) - { - $error[] = $user->lang['EMPTY_SUBJECT_EMAIL']; - } - - if (!$message) - { - $error[] = $user->lang['EMPTY_MESSAGE_EMAIL']; - } - - $name = $row['username']; - $email_lang = $row['user_lang']; - $email = $row['user_email']; - } - else - { - if (!$email || !preg_match('/^' . get_preg_expression('email') . '$/i', $email)) - { - $error[] = $user->lang['EMPTY_ADDRESS_EMAIL']; - } - - if (!$name) - { - $error[] = $user->lang['EMPTY_NAME_EMAIL']; - } - } - - if (!sizeof($error)) - { - $sql = 'UPDATE ' . USERS_TABLE . ' - SET user_emailtime = ' . time() . ' - WHERE user_id = ' . $user->data['user_id']; - $result = $db->sql_query($sql); - - include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); - $messenger = new messenger(false); - $email_tpl = ($user_id) ? 'profile_send_email' : 'email_notify'; - - $mail_to_users = array(); - - $mail_to_users[] = array( - 'email_lang' => $email_lang, - 'email' => $email, - 'name' => $name, - 'username' => ($user_id) ? $row['username'] : '', - 'to_name' => $name, - 'user_jabber' => ($user_id) ? $row['user_jabber'] : '', - 'user_notify_type' => ($user_id) ? $row['user_notify_type'] : NOTIFY_EMAIL, - 'topic_title' => (!$user_id) ? $row['topic_title'] : '', - 'forum_id' => (!$user_id) ? $row['forum_id'] : 0, - ); - - // Ok, now the same email if CC specified, but without exposing the users email address - if ($cc) - { - $mail_to_users[] = array( - 'email_lang' => $user->data['user_lang'], - 'email' => $user->data['user_email'], - 'name' => $user->data['username'], - 'username' => $user->data['username'], - 'to_name' => $name, - 'user_jabber' => $user->data['user_jabber'], - 'user_notify_type' => ($user_id) ? $user->data['user_notify_type'] : NOTIFY_EMAIL, - 'topic_title' => (!$user_id) ? $row['topic_title'] : '', - 'forum_id' => (!$user_id) ? $row['forum_id'] : 0, - ); - } - - foreach ($mail_to_users as $row) - { - $messenger->template($email_tpl, $row['email_lang']); - $messenger->replyto($user->data['user_email']); - $messenger->to($row['email'], $row['name']); - - if ($user_id) - { - $messenger->subject(htmlspecialchars_decode($subject)); - $messenger->im($row['user_jabber'], $row['username']); - $notify_type = $row['user_notify_type']; - } - else - { - $notify_type = NOTIFY_EMAIL; - } - - $messenger->anti_abuse_headers($config, $user); - - $messenger->assign_vars(array( - 'BOARD_CONTACT' => $config['board_contact'], - 'TO_USERNAME' => htmlspecialchars_decode($row['to_name']), - 'FROM_USERNAME' => htmlspecialchars_decode($user->data['username']), - 'MESSAGE' => htmlspecialchars_decode($message)) - ); - - if ($topic_id) - { - $messenger->assign_vars(array( - 'TOPIC_NAME' => htmlspecialchars_decode($row['topic_title']), - 'U_TOPIC' => generate_board_url() . "/viewtopic.$phpEx?f=" . $row['forum_id'] . "&t=$topic_id") - ); - } - - $messenger->send($notify_type); - } - - meta_refresh(3, append_sid("{$phpbb_root_path}index.$phpEx")); - $message = ($user_id) ? sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>') : sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$row['forum_id']}&t=$topic_id") . '">', '</a>'); - trigger_error($user->lang['EMAIL_SENT'] . '<br /><br />' . $message); - } + trigger_error($error); } - if ($user_id) + if (isset($_POST['submit'])) { - $template->assign_vars(array( - 'S_SEND_USER' => true, - 'L_SEND_EMAIL_USER' => $user->lang('SEND_EMAIL_USER', $row['username']), - - 'L_EMAIL_BODY_EXPLAIN' => $user->lang['EMAIL_BODY_EXPLAIN'], - 'S_POST_ACTION' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=email&u=' . $user_id)) - ); - } - else - { - $template->assign_vars(array( - 'EMAIL' => $email, - 'NAME' => $name, - 'S_LANG_OPTIONS' => language_select($email_lang), - - 'L_EMAIL_BODY_EXPLAIN' => $user->lang['EMAIL_TOPIC_EXPLAIN'], - 'S_POST_ACTION' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=email&t=' . $topic_id)) - ); + $messenger = new messenger(false); + $form->submit($messenger); } - $template->assign_vars(array( - 'ERROR_MESSAGE' => (sizeof($error)) ? implode('<br />', $error) : '', - 'SUBJECT' => $subject, - 'MESSAGE' => $message, - ) - ); + $page_title = $form->get_page_title(); + $template_html = $form->get_template_file(); + $form->render($template); break; diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php index d286dc9cfc..cfcb8e10a2 100644 --- a/phpBB/phpbb/session.php +++ b/phpBB/phpbb/session.php @@ -1075,7 +1075,7 @@ class session { global $config, $db; - if (defined('IN_CHECK_BAN')) + if (defined('IN_CHECK_BAN') || defined('SKIP_CHECK_BAN')) { return; } diff --git a/phpBB/styles/prosilver/template/memberlist_email.html b/phpBB/styles/prosilver/template/memberlist_email.html index 78d0eba5a8..d66022887c 100644 --- a/phpBB/styles/prosilver/template/memberlist_email.html +++ b/phpBB/styles/prosilver/template/memberlist_email.html @@ -1,13 +1,22 @@ <!-- INCLUDE overall_header.html --> +<!-- IF S_CONTACT_ADMIN--> +<h2 class="titlespace">{L_CONTACT_ADMIN}</h2> +<!-- ELSE --> <h2 class="titlespace">{L_SEND_EMAIL_USER}</h2> +<!-- ENDIF --> <form method="post" action="{S_POST_ACTION}" id="post"> <div class="panel"> <div class="inner"> + <!-- IF CONTACT_INFO --> + <div class="postbody"><div class="content">{CONTACT_INFO}</div></div> + <br class="clear" /> + <!-- ENDIF --> <div class="content"> + <!-- IF ERROR_MESSAGE --><p class="error">{ERROR_MESSAGE}</p><!-- ENDIF --> <fieldset class="fields2"> <!-- IF S_SEND_USER --> @@ -19,6 +28,25 @@ <dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt> <dd><input class="inputbox autowidth" type="text" name="subject" id="subject" size="50" tabindex="1" value="{SUBJECT}" /></dd> </dl> + <!-- ELSEIF S_CONTACT_ADMIN--> + <dl> + <dt><label>{L_RECIPIENT}:</label></dt> + <dd><strong>{L_ADMINISTRATOR}</strong></dd> + </dl> + <!-- IF not S_IS_REGISTERED --> + <dl> + <dt><label for="email">{L_SENDER_EMAIL_ADDRESS}:</label></dt> + <dd><input class="inputbox autowidth" type="text" name="email" id="email" size="50" maxlength="100" tabindex="1" value="{EMAIL}" /></dd> + </dl> + <dl> + <dt><label for="name">{L_SENDER_NAME}:</label></dt> + <dd><input class="inputbox autowidth" type="text" name="name" id="name" size="50" tabindex="2" value="{NAME}" /></dd> + </dl> + <!-- ENDIF --> + <dl> + <dt><label for="subject">{L_SUBJECT}:</label></dt> + <dd><input class="inputbox autowidth" type="text" name="subject" id="subject" size="50" tabindex="3" value="{SUBJECT}" /></dd> + </dl> <!-- ELSE --> <dl> <dt><label for="email">{L_EMAIL_ADDRESS}{L_COLON}</label></dt> diff --git a/phpBB/styles/prosilver/template/navbar_footer.html b/phpBB/styles/prosilver/template/navbar_footer.html index 13e50dae19..6912ee242e 100644 --- a/phpBB/styles/prosilver/template/navbar_footer.html +++ b/phpBB/styles/prosilver/template/navbar_footer.html @@ -16,6 +16,7 @@ <!-- IF not S_IS_BOT --><li class="rightside"><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a></li><!-- ENDIF --> <!-- EVENT overall_footer_teamlink_before --> <!-- IF U_TEAM --><li class="rightside"><a href="{U_TEAM}">{L_THE_TEAM}</a></li><!-- ENDIF --> + <!-- IF U_CONTACT_US --><li class="rightside"><a href="{U_CONTACT_US}">{L_CONTACT_US}</a></li><!-- ENDIF --> <!-- EVENT overall_footer_teamlink_after --> </ul> diff --git a/phpBB/styles/subsilver2/template/index_body.html b/phpBB/styles/subsilver2/template/index_body.html index cb67768b15..52f04af35f 100644 --- a/phpBB/styles/subsilver2/template/index_body.html +++ b/phpBB/styles/subsilver2/template/index_body.html @@ -20,10 +20,13 @@ <!-- IF not S_IS_BOT and U_TEAM --> | <!-- ENDIF --> <!-- EVENT overall_footer_teamlink_before --> <!-- IF U_TEAM --><a href="{U_TEAM}">{L_THE_TEAM}</a><!-- ENDIF --> + <!-- IF U_CONTACT_US --> + <!-- IF U_TEAM --> | <!-- ENDIF --> + <a href="{U_CONTACT_US}">{L_CONTACT_US}</a> + <!-- ENDIF --> <!-- EVENT overall_footer_teamlink_after --> </span> <br /> -<!-- ENDIF --> <br clear="all" /> diff --git a/phpBB/styles/subsilver2/template/memberlist_email.html b/phpBB/styles/subsilver2/template/memberlist_email.html index 7693a4167f..3b76525af9 100644 --- a/phpBB/styles/subsilver2/template/memberlist_email.html +++ b/phpBB/styles/subsilver2/template/memberlist_email.html @@ -6,13 +6,22 @@ <table class="tablebg" width="100%" cellspacing="1"> <tr> + <!-- IF S_CONTACT_ADMIN--> + <th colspan="2">{L_CONTACT_ADMIN}</th> + <!-- ELSE --> <th colspan="2">{L_SEND_EMAIL_USER}</th> + <!-- ENDIF --> </tr> <!-- IF ERROR_MESSAGE --> <tr> <td class="row3" colspan="2" align="center"><span class="error">{ERROR_MESSAGE}</span></td> </tr> <!-- ENDIF --> + <!-- IF CONTACT_INFO --> + <tr> + <td class="row1" colspan="2">{CONTACT_INFO}</td> + </tr> + <!-- ENDIF --> <!-- IF S_SEND_USER --> <tr> <td class="row1" width="35%"><b class="genmed">{L_RECIPIENT}</b></td> @@ -22,6 +31,21 @@ <td class="row1" width="35%"><b class="genmed">{L_SUBJECT}</b></td> <td class="row2"><input class="post" type="text" name="subject" size="50" tabindex="2" value="{SUBJECT}" /></td> </tr> + <!-- ELSEIF S_CONTACT_ADMIN--> + <tr> + <td class="row1" width="35%"><b class="genmed">{L_RECIPIENT}</b></td> + <td class="row2" width="65%"><b class="genmed">{L_ADMINISTRATOR}</b></td> + </tr> + <!-- IF not S_IS_REGISTERED --> + <tr> + <td class="row1" width="35%"><b class="genmed">{L_SENDER_EMAIL_ADDRESS}</b></td> + <td class="row2"><input class="post" type="text" name="email" size="50" maxlength="100" value="{EMAIL}" /></td> + </tr> + <tr> + <td class="row1" width="35%"><b class="genmed">{L_SENDER_NAME}</b></td> + <td class="row2"><input class="post" type="text" name="name" size="50" value="{NAME}" /></td> + </tr> + <!-- ENDIF --> <!-- ELSE --> <tr> <td class="row1" width="35%"><b class="genmed">{L_EMAIL_ADDRESS}</b></td> |