/** * Notify using phpBB messenger * * @param int $notify_method Notify method for messenger (e.g. NOTIFY_IM) * @param string $template_dir_prefix Base directory to prepend to the email template name * * @return null */ protected function notify_using_messenger($notify_method, $template_dir_prefix = '') { if (empty($this->queue)) { return; } // Load all users we want to notify (we need their email address) $user_ids = $users = array(); foreach ($this->queue as $notification) { $user_ids[] = $notification->user_id; } // We do not send emails to banned users if (!function_exists('phpbb_get_banned_user_ids')) { include $this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext; } $banned_users = phpbb_get_banned_user_ids($user_ids); // Load all the users we need $this->user_loader->load_users($user_ids); // Load the messenger if (!class_exists('messenger')) { include $this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext; } $messenger = new \messenger(); // Time to go through the queue and send emails /** @var \phpbb\notification\type\type_interface $notification */ foreach ($this->queue as $notification) { if ($notification->get_email_template() === false) { continue; } $user = $this->user_loader->get_user($notification->user_id); if ($user['user_type'] == USER_IGNORE || $user['user_type'] == USER_INACTIVE && $user['user_inactive_reason'] == INACTIVE_MANUAL || in_array($notification->user_id, $banned_users)) { continue; } $messenger->template($notification->get_email_template(), $user['user_lang'], '', $template_dir_prefix); $messenger->set_addresses($user); $messenger->assign_vars(array_merge(array('USERNAME' => $user['username'], 'U_NOTIFICATION_SETTINGS' => generate_board_url() . '/ucp.' . $this->php_ext . '?i=ucp_notifications&mode=notification_options'), $notification->get_email_template_variables())); $messenger->send($notify_method); } // Save the queue in the messenger class (has to be called or these emails could be lost?) $messenger->save_queue(); // We're done, empty the queue $this->empty_queue(); }
public function notify() { $template_dir_prefix = ''; if (!$this->global_available()) { return; } if (empty($this->queue)) { return; } // Load all users we want to notify (we need their email address) $user_ids = $users = array(); foreach ($this->queue as $notification) { $user_ids[] = $notification->user_id; } // We do not send whatsapp to banned users if (!function_exists('phpbb_get_banned_user_ids')) { include $this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext; } $banned_users = phpbb_get_banned_user_ids($user_ids); // Load all the users we need $this->user_loader->load_users($user_ids); global $config, $phpbb_container; $wa = $phpbb_container->get('tas2580.mobilenotifier.src.helper'); // Time to go through the queue and send emails foreach ($this->queue as $notification) { if ($notification->get_email_template() === false) { continue; } $user = $this->user_loader->get_user($notification->user_id); if ($user['user_type'] == USER_IGNORE || in_array($notification->user_id, $banned_users)) { continue; } $this->template($template_dir_prefix . $notification->get_email_template(), $user['user_lang']); $this->assign_vars(array_merge(array('USERNAME' => $user['username'], 'SITENAME' => htmlspecialchars_decode($config['sitename']), 'U_NOTIFICATION_SETTINGS' => generate_board_url() . '/ucp.' . $this->php_ext . '?i=ucp_notifications'), $notification->get_email_template_variables())); $this->msg = trim($this->template->assign_display('body')); // Lets send the Whatsapp $wa->send($user['user_whatsapp'], $this->msg); } $this->empty_queue(); }
} else { if ($has_unapproved_attachments && !$topic_data['topic_attachment']) { // Topic has only unapproved attachments but we have the right to see and download them $topic_data['topic_attachment'] = 1; } } } } else { $display_notice = true; } } // Get the list of users who can receive private messages $can_receive_pm_list = $auth->acl_get_list(array_keys($user_cache), 'u_readpm'); $can_receive_pm_list = empty($can_receive_pm_list) || !isset($can_receive_pm_list[0]['u_readpm']) ? array() : $can_receive_pm_list[0]['u_readpm']; // Get the list of permanently banned users $permanently_banned_users = phpbb_get_banned_user_ids(array_keys($user_cache), false); $i_total = sizeof($rowset) - 1; $prev_post_id = ''; $template->assign_vars(array('S_HAS_ATTACHMENTS' => $topic_data['topic_attachment'], 'S_NUM_POSTS' => sizeof($post_list))); /** * Event to modify the post, poster and attachment data before assigning the posts * * @event core.viewtopic_modify_post_data * @var int forum_id Forum ID * @var int topic_id Topic ID * @var array topic_data Array with topic data * @var array post_list Array with post_ids we are going to display * @var array rowset Array with post_id => post data * @var array user_cache Array with prepared user data * @var int start Pagination information * @var int sort_days Display posts of previous x days
/** * For composing messages, handle list actions */ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove_g, $add_to, $add_bcc) { global $auth, $db, $user; global $request; // Delete User [TO/BCC] if ($remove_u && $request->variable('remove_u', array(0 => ''))) { $remove_user_id = array_keys($request->variable('remove_u', array(0 => ''))); if (isset($remove_user_id[0])) { unset($address_list['u'][(int) $remove_user_id[0]]); } } // Delete Group [TO/BCC] if ($remove_g && $request->variable('remove_g', array(0 => ''))) { $remove_group_id = array_keys($request->variable('remove_g', array(0 => ''))); if (isset($remove_group_id[0])) { unset($address_list['g'][(int) $remove_group_id[0]]); } } // Add Selected Groups $group_list = request_var('group_list', array(0)); // Build usernames to add $usernames = request_var('username', '', true); $usernames = empty($usernames) ? array() : array($usernames); $username_list = request_var('username_list', '', true); if ($username_list) { $usernames = array_merge($usernames, explode("\n", $username_list)); } // If add to or add bcc not pressed, users could still have usernames listed they want to add... if (!$add_to && !$add_bcc && (sizeof($group_list) || sizeof($usernames))) { $add_to = true; global $refresh, $submit, $preview; $refresh = true; $submit = false; // Preview is only true if there was also a message entered if (request_var('message', '')) { $preview = true; } } // Add User/Group [TO] if ($add_to || $add_bcc) { $type = $add_to ? 'to' : 'bcc'; if (sizeof($group_list)) { foreach ($group_list as $group_id) { $address_list['g'][$group_id] = $type; } } // User ID's to add... $user_id_ary = array(); // Reveal the correct user_ids if (sizeof($usernames)) { $user_id_ary = array(); user_get_id_name($user_id_ary, $usernames, array(USER_NORMAL, USER_FOUNDER, USER_INACTIVE)); // If there are users not existing, we will at least print a notice... if (!sizeof($user_id_ary)) { $error[] = $user->lang['PM_NO_USERS']; } } // Add Friends if specified $friend_list = array_keys($request->variable('add_' . $type, array(0))); $user_id_ary = array_merge($user_id_ary, $friend_list); foreach ($user_id_ary as $user_id) { if ($user_id == ANONYMOUS) { continue; } $address_list['u'][$user_id] = $type; } } // Check for disallowed recipients if (!empty($address_list['u'])) { $can_ignore_allow_pm = $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'); // Administrator deactivated users check and we need to check their // PM status (do they want to receive PM's?) // Only check PM status if not a moderator or admin, since they // are allowed to override this user setting $sql = 'SELECT user_id, user_allow_pm FROM ' . USERS_TABLE . ' WHERE ' . $db->sql_in_set('user_id', array_keys($address_list['u'])) . ' AND ( (user_type = ' . USER_INACTIVE . ' AND user_inactive_reason = ' . INACTIVE_MANUAL . ') ' . ($can_ignore_allow_pm ? '' : ' OR user_allow_pm = 0') . ' )'; $result = $db->sql_query($sql); $removed_no_pm = $removed_no_permission = false; while ($row = $db->sql_fetchrow($result)) { if (!$can_ignore_allow_pm && !$row['user_allow_pm']) { $removed_no_pm = true; } else { $removed_no_permission = true; } unset($address_list['u'][$row['user_id']]); } $db->sql_freeresult($result); // print a notice about users not being added who do not want to receive pms if ($removed_no_pm) { $error[] = $user->lang['PM_USERS_REMOVED_NO_PM']; } // print a notice about users not being added who do not have permission to receive PMs if ($removed_no_permission) { $error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION']; } if (!sizeof(array_keys($address_list['u']))) { return; } // Check if users have permission to read PMs $can_read = $auth->acl_get_list(array_keys($address_list['u']), 'u_readpm'); $can_read = empty($can_read) || !isset($can_read[0]['u_readpm']) ? array() : $can_read[0]['u_readpm']; $cannot_read_list = array_diff(array_keys($address_list['u']), $can_read); if (!empty($cannot_read_list)) { foreach ($cannot_read_list as $cannot_read) { unset($address_list['u'][$cannot_read]); } $error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION']; } // Check if users are banned $banned_user_list = phpbb_get_banned_user_ids(array_keys($address_list['u']), false); if (!empty($banned_user_list)) { foreach ($banned_user_list as $banned_user) { unset($address_list['u'][$banned_user]); } $error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION']; } } }
/** * PM Notification */ function pm_notification($mode, $author, $recipients, $subject, $message, $msg_id) { global $db, $user, $config, $phpbb_root_path, $phpEx, $auth; $subject = censor_text($subject); // Exclude guests, current user and banned users from notifications unset($recipients[ANONYMOUS], $recipients[$user->data['user_id']]); if (!sizeof($recipients)) { return; } if (!function_exists('phpbb_get_banned_user_ids')) { include $phpbb_root_path . 'includes/functions_user.' . $phpEx; } $banned_users = phpbb_get_banned_user_ids(array_keys($recipients)); $recipients = array_diff(array_keys($recipients), $banned_users); if (!sizeof($recipients)) { return; } $sql = 'SELECT user_id, username, user_email, user_lang, user_notify_pm, user_notify_type, user_jabber FROM ' . USERS_TABLE . ' WHERE ' . $db->sql_in_set('user_id', $recipients); $result = $db->sql_query($sql); $msg_list_ary = array(); while ($row = $db->sql_fetchrow($result)) { if ($row['user_notify_pm'] == 1 && trim($row['user_email'])) { $msg_list_ary[] = array('method' => $row['user_notify_type'], 'email' => $row['user_email'], 'jabber' => $row['user_jabber'], 'name' => $row['username'], 'lang' => $row['user_lang']); } } $db->sql_freeresult($result); if (!sizeof($msg_list_ary)) { return; } include_once $phpbb_root_path . 'includes/functions_messenger.' . $phpEx; $messenger = new messenger(); foreach ($msg_list_ary as $pos => $addr) { $messenger->template('privmsg_notify', $addr['lang']); $messenger->to($addr['email'], $addr['name']); $messenger->im($addr['jabber'], $addr['name']); $messenger->assign_vars(array('SUBJECT' => htmlspecialchars_decode($subject), 'AUTHOR_NAME' => htmlspecialchars_decode($author), 'USERNAME' => htmlspecialchars_decode($addr['name']), 'U_INBOX' => generate_board_url() . "/ucp.{$phpEx}?i=pm&folder=inbox", 'U_VIEW_MESSAGE' => generate_board_url() . "/ucp.{$phpEx}?i=pm&mode=view&p={$msg_id}")); $messenger->send($addr['method']); } unset($msg_list_ary); $messenger->save_queue(); unset($messenger); }
/** * User Notification */ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id, $topic_id, $post_id, $author_name = '') { global $db, $user, $config, $phpbb_root_path, $phpEx, $auth; $topic_notification = $mode == 'reply' || $mode == 'quote' ? true : false; $forum_notification = $mode == 'post' ? true : false; if (!$topic_notification && !$forum_notification) { trigger_error('NO_MODE'); } if ($topic_notification && !$config['allow_topic_notify'] || $forum_notification && !$config['allow_forum_notify']) { return; } $topic_title = $topic_notification ? $topic_title : $subject; $topic_title = censor_text($topic_title); // Exclude guests, current user and banned users from notifications if (!function_exists('phpbb_get_banned_user_ids')) { include $phpbb_root_path . 'includes/functions_user.' . $phpEx; } $sql_ignore_users = phpbb_get_banned_user_ids(); $sql_ignore_users[ANONYMOUS] = ANONYMOUS; $sql_ignore_users[$user->data['user_id']] = $user->data['user_id']; $notify_rows = array(); // -- get forum_userids || topic_userids $sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber FROM ' . ($topic_notification ? TOPICS_WATCH_TABLE : FORUMS_WATCH_TABLE) . ' w, ' . USERS_TABLE . ' u WHERE w.' . ($topic_notification ? 'topic_id' : 'forum_id') . ' = ' . ($topic_notification ? $topic_id : $forum_id) . ' AND ' . $db->sql_in_set('w.user_id', $sql_ignore_users, true) . ' AND w.notify_status = ' . NOTIFY_YES . ' AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ') AND u.user_id = w.user_id'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $notify_user_id = (int) $row['user_id']; $notify_rows[$notify_user_id] = array('user_id' => $notify_user_id, 'username' => $row['username'], 'user_email' => $row['user_email'], 'user_jabber' => $row['user_jabber'], 'user_lang' => $row['user_lang'], 'notify_type' => $topic_notification ? 'topic' : 'forum', 'template' => $topic_notification ? 'topic_notify' : 'newtopic_notify', 'method' => $row['user_notify_type'], 'allowed' => false); // Add users who have been already notified to ignore list $sql_ignore_users[$notify_user_id] = $notify_user_id; } $db->sql_freeresult($result); // forum notification is sent to those not already receiving topic notifications if ($topic_notification) { $sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber FROM ' . FORUMS_WATCH_TABLE . ' fw, ' . USERS_TABLE . " u\n\t\t\tWHERE fw.forum_id = {$forum_id}\n\t\t\t\tAND " . $db->sql_in_set('fw.user_id', $sql_ignore_users, true) . ' AND fw.notify_status = ' . NOTIFY_YES . ' AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ') AND u.user_id = fw.user_id'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $notify_user_id = (int) $row['user_id']; $notify_rows[$notify_user_id] = array('user_id' => $notify_user_id, 'username' => $row['username'], 'user_email' => $row['user_email'], 'user_jabber' => $row['user_jabber'], 'user_lang' => $row['user_lang'], 'notify_type' => 'forum', 'template' => 'forum_notify', 'method' => $row['user_notify_type'], 'allowed' => false); } $db->sql_freeresult($result); } if (!sizeof($notify_rows)) { return; } // Make sure users are allowed to read the forum foreach ($auth->acl_get_list(array_keys($notify_rows), 'f_read', $forum_id) as $forum_id => $forum_ary) { foreach ($forum_ary as $auth_option => $user_ary) { foreach ($user_ary as $user_id) { $notify_rows[$user_id]['allowed'] = true; } } } // Now, we have to do a little step before really sending, we need to distinguish our users a little bit. ;) $msg_users = $delete_ids = $update_notification = array(); foreach ($notify_rows as $user_id => $row) { if (!$row['allowed'] || !trim($row['user_email'])) { $delete_ids[$row['notify_type']][] = $row['user_id']; } else { $msg_users[] = $row; $update_notification[$row['notify_type']][] = $row['user_id']; /* * We also update the forums watch table for this user when we are * sending out a topic notification to prevent sending out another * notification in case this user is also subscribed to the forum * this topic was posted in. * Since an UPDATE query is used, this has no effect on users only * subscribed to the topic (i.e. no row is created) and should not * be a performance issue. */ if ($row['notify_type'] === 'topic') { $update_notification['forum'][] = $row['user_id']; } } } unset($notify_rows); // Now, we are able to really send out notifications if (sizeof($msg_users)) { include_once $phpbb_root_path . 'includes/functions_messenger.' . $phpEx; $messenger = new messenger(); $msg_list_ary = array(); foreach ($msg_users as $row) { $pos = !isset($msg_list_ary[$row['template']]) ? 0 : sizeof($msg_list_ary[$row['template']]); $msg_list_ary[$row['template']][$pos]['method'] = $row['method']; $msg_list_ary[$row['template']][$pos]['email'] = $row['user_email']; $msg_list_ary[$row['template']][$pos]['jabber'] = $row['user_jabber']; $msg_list_ary[$row['template']][$pos]['name'] = $row['username']; $msg_list_ary[$row['template']][$pos]['lang'] = $row['user_lang']; $msg_list_ary[$row['template']][$pos]['user_id'] = $row['user_id']; } unset($msg_users); foreach ($msg_list_ary as $email_template => $email_list) { foreach ($email_list as $addr) { $messenger->template($email_template, $addr['lang']); $messenger->to($addr['email'], $addr['name']); $messenger->im($addr['jabber'], $addr['name']); $messenger->assign_vars(array('USERNAME' => htmlspecialchars_decode($addr['name']), 'TOPIC_TITLE' => htmlspecialchars_decode($topic_title), 'FORUM_NAME' => htmlspecialchars_decode($forum_name), 'AUTHOR_NAME' => htmlspecialchars_decode($author_name), 'U_FORUM' => generate_board_url() . "/viewforum.{$phpEx}?f={$forum_id}", 'U_TOPIC' => generate_board_url() . "/viewtopic.{$phpEx}?f={$forum_id}&t={$topic_id}", 'U_NEWEST_POST' => generate_board_url() . "/viewtopic.{$phpEx}?f={$forum_id}&t={$topic_id}&p={$post_id}&e={$post_id}", 'U_STOP_WATCHING_TOPIC' => generate_board_url() . "/viewtopic.{$phpEx}?uid={$addr['user_id']}&f={$forum_id}&t={$topic_id}&unwatch=topic", 'U_STOP_WATCHING_FORUM' => generate_board_url() . "/viewforum.{$phpEx}?uid={$addr['user_id']}&f={$forum_id}&unwatch=forum")); $messenger->send($addr['method']); } } unset($msg_list_ary); $messenger->save_queue(); } // Handle the DB updates $db->sql_transaction('begin'); if (!empty($update_notification['topic'])) { $sql = 'UPDATE ' . TOPICS_WATCH_TABLE . ' SET notify_status = ' . NOTIFY_NO . "\n\t\t\tWHERE topic_id = {$topic_id}\n\t\t\t\tAND " . $db->sql_in_set('user_id', $update_notification['topic']); $db->sql_query($sql); } if (!empty($update_notification['forum'])) { $sql = 'UPDATE ' . FORUMS_WATCH_TABLE . ' SET notify_status = ' . NOTIFY_NO . "\n\t\t\tWHERE forum_id = {$forum_id}\n\t\t\t\tAND " . $db->sql_in_set('user_id', $update_notification['forum']); $db->sql_query($sql); } // Now delete the user_ids not authorised to receive notifications on this topic/forum if (!empty($delete_ids['topic'])) { $sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . "\n\t\t\tWHERE topic_id = {$topic_id}\n\t\t\t\tAND " . $db->sql_in_set('user_id', $delete_ids['topic']); $db->sql_query($sql); } if (!empty($delete_ids['forum'])) { $sql = 'DELETE FROM ' . FORUMS_WATCH_TABLE . "\n\t\t\tWHERE forum_id = {$forum_id}\n\t\t\t\tAND " . $db->sql_in_set('user_id', $delete_ids['forum']); $db->sql_query($sql); } $db->sql_transaction('commit'); }
/** * Prepare profile data */ function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabled = false, $check_can_receive_pm = true) { global $config, $auth, $user, $phpEx, $phpbb_root_path, $phpbb_dispatcher; $username = $data['username']; $user_id = $data['user_id']; $user_rank_data = phpbb_get_user_rank($data, $user_id == ANONYMOUS ? false : $data['user_posts']); if (!empty($data['user_allow_viewemail']) && $auth->acl_get('u_sendemail') || $auth->acl_get('a_user')) { $email = $config['board_email_form'] && $config['email_enable'] ? append_sid("{$phpbb_root_path}memberlist.{$phpEx}", 'mode=email&u=' . $user_id) : ($config['board_hide_emails'] && !$auth->acl_get('a_user') ? '' : 'mailto:' . $data['user_email']); } else { $email = ''; } if ($config['load_onlinetrack']) { $update_time = $config['load_online_time'] * 60; $online = time() - $update_time < $data['session_time'] && (isset($data['session_viewonline']) && $data['session_viewonline'] || $auth->acl_get('u_viewonline')) ? true : false; } else { $online = false; } if ($data['user_allow_viewonline'] || $auth->acl_get('u_viewonline')) { $last_active = !empty($data['session_time']) ? $data['session_time'] : $data['user_lastvisit']; } else { $last_active = ''; } $age = ''; if ($config['allow_birthdays'] && $data['user_birthday']) { list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $data['user_birthday'])); if ($bday_year) { $now = $user->create_datetime(); $now = phpbb_gmgetdate($now->getTimestamp() + $now->getOffset()); $diff = $now['mon'] - $bday_month; if ($diff == 0) { $diff = $now['mday'] - $bday_day < 0 ? 1 : 0; } else { $diff = $diff < 0 ? 1 : 0; } $age = max(0, (int) ($now['year'] - $bday_year - $diff)); } } if (!function_exists('phpbb_get_banned_user_ids')) { include $phpbb_root_path . 'includes/functions_user.' . $phpEx; } // Can this user receive a Private Message? $can_receive_pm = $check_can_receive_pm && ($data['user_type'] != USER_IGNORE && ($data['user_type'] != USER_INACTIVE || $data['user_inactive_reason'] != INACTIVE_MANUAL) && sizeof($auth->acl_get_list($user_id, 'u_readpm')) && !sizeof(phpbb_get_banned_user_ids($user_id, false)) && ($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_') || $data['user_allow_pm'])); // Dump it out to the template $template_data = array('AGE' => $age, 'RANK_TITLE' => $user_rank_data['title'], 'JOINED' => $user->format_date($data['user_regdate']), 'LAST_ACTIVE' => empty($last_active) ? ' - ' : $user->format_date($last_active), 'POSTS' => $data['user_posts'] ? $data['user_posts'] : 0, 'WARNINGS' => isset($data['user_warnings']) ? $data['user_warnings'] : 0, 'USERNAME_FULL' => get_username_string('full', $user_id, $username, $data['user_colour']), 'USERNAME' => get_username_string('username', $user_id, $username, $data['user_colour']), 'USER_COLOR' => get_username_string('colour', $user_id, $username, $data['user_colour']), 'U_VIEW_PROFILE' => get_username_string('profile', $user_id, $username, $data['user_colour']), 'A_USERNAME' => addslashes(get_username_string('username', $user_id, $username, $data['user_colour'])), 'AVATAR_IMG' => phpbb_get_user_avatar($data), 'ONLINE_IMG' => !$config['load_onlinetrack'] ? '' : ($online ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')), 'S_ONLINE' => $config['load_onlinetrack'] && $online ? true : false, 'RANK_IMG' => $user_rank_data['img'], 'RANK_IMG_SRC' => $user_rank_data['img_src'], 'S_JABBER_ENABLED' => $config['jab_enable'] ? true : false, 'S_WARNINGS' => $auth->acl_getf_global('m_') || $auth->acl_get('m_warn') ? true : false, 'U_SEARCH_USER' => $auth->acl_get('u_search') ? append_sid("{$phpbb_root_path}search.{$phpEx}", "author_id={$user_id}&sr=posts") : '', 'U_NOTES' => $user_notes_enabled && $auth->acl_getf_global('m_') ? append_sid("{$phpbb_root_path}mcp.{$phpEx}", 'i=notes&mode=user_notes&u=' . $user_id, true, $user->session_id) : '', 'U_WARN' => $warn_user_enabled && $auth->acl_get('m_warn') ? append_sid("{$phpbb_root_path}mcp.{$phpEx}", 'i=warn&mode=warn_user&u=' . $user_id, true, $user->session_id) : '', 'U_PM' => $config['allow_privmsg'] && $auth->acl_get('u_sendpm') && $can_receive_pm ? append_sid("{$phpbb_root_path}ucp.{$phpEx}", 'i=pm&mode=compose&u=' . $user_id) : '', 'U_EMAIL' => $email, 'U_JABBER' => $data['user_jabber'] && $auth->acl_get('u_sendim') ? append_sid("{$phpbb_root_path}memberlist.{$phpEx}", 'mode=contact&action=jabber&u=' . $user_id) : '', 'USER_JABBER' => $config['jab_enable'] ? $data['user_jabber'] : '', 'USER_JABBER_IMG' => $config['jab_enable'] && $data['user_jabber'] ? $user->img('icon_contact_jabber', $data['user_jabber']) : '', 'L_SEND_EMAIL_USER' => $user->lang('SEND_EMAIL_USER', $username), 'L_CONTACT_USER' => $user->lang('CONTACT_USER', $username), 'L_VIEWING_PROFILE' => $user->lang('VIEWING_PROFILE', $username)); /** * Preparing a user's data before displaying it in profile and memberlist * * @event core.memberlist_prepare_profile_data * @var array data Array with user's data * @var array template_data Template array with user's data * @since 3.1.0-a1 */ $vars = array('data', 'template_data'); extract($phpbb_dispatcher->trigger_event('core.memberlist_prepare_profile_data', compact($vars))); return $template_data; }
public function do_ban_hammer_stuff($event) { $this->data = $event['member']; $this->user_id = (int) $this->data['user_id']; $curl_exists = function_exists('curl_init') ? true : false; $admin_mod_array = $this->admin_mod_array(); /** * Split these up and give error messages? Later maybe. */ if (!$this->auth->acl_get('m_ban') || $this->data['user_type'] == USER_FOUNDER && $this->user->data['user_type'] != USER_FOUNDER || $this->user_id == $this->user->data['user_id'] || in_array($this->data['user_id'], $admin_mod_array)) { // Nothing to see here, move on. // Only let founders be banned by other founders. // And don't allow them to ban them selves return; } $this->user->add_lang_ext('phpbbmodders/banhammer', 'banhammer_lang'); // Check if this user already is banned. if (!function_exists('phpbb_get_banned_user_ids')) { include $this->root_path . 'includes/functions_user.' . $this->php_ext; } $banned = phpbb_get_banned_user_ids(array($this->user_id)); if (!empty($banned)) { $bh_result = $this->request->variable('bh_res', ''); if (!empty($bh_result)) { if ($bh_result == 'success') { $bh_message = $this->user->lang['BANNED_SUCCESS']; } else { // One or more actions failed. $message_ary = explode('+', urldecode($bh_result)); $bh_message = $this->user->lang['BANNED_ERROR']; foreach ($message_ary as $error) { $bh_message .= '<br />' . $this->user->lang[$error]; } } $this->template->assign_vars(array('BH_STYLE' => ($bh_result == 'success' ? 'green' : '#a92c2c') . '; color: white;"', 'BH_MESSAGE' => $bh_message)); } else { // It's enough to ban them once. $this->template->assign_var('BH_MESSAGE', $this->user->lang['BH_BANNED']); } return; } // Get Ban Hammer settings $sql = 'SELECT * FROM ' . CONFIG_TEXT_TABLE . "\n\t\t\t\tWHERE config_name = 'banhammer_settings'"; $result = $this->db->sql_query($sql); $settings = $this->db->sql_fetchfield('config_value'); $this->db->sql_freeresult($result); $settings = unserialize($settings); if ($settings['group_id']) { // Get group name for banned users, if any. $sql = 'SELECT group_id, group_name FROM ' . GROUPS_TABLE . ' WHERE group_id = ' . (int) $settings['group_id']; $result = $this->db->sql_query($sql); $group_name = $this->db->sql_fetchfield('group_name'); $this->db->sql_freeresult($result); if (empty($group_name)) { $settings['group_id'] = 0; } } if (!$this->request->is_set('bh') || $this->request->is_set('bh') && $this->request->is_set('confirm_key') && !confirm_box(true)) { $params = array('mode' => 'viewprofile', 'u' => $this->user_id, 'bh' => 1); $this->template->assign_vars(array('BH_BAN_EMAIL' => $settings['ban_email'], 'BH_BAN_IP' => $settings['ban_ip'], 'BH_DEL_AVATAR' => $settings['del_avatar'], 'BH_DEL_PRIVMSGS' => $settings['del_privmsgs'], 'BH_DEL_POSTS' => $settings['del_posts'], 'BH_DEL_PROFILE' => $settings['del_profile'], 'BH_DEL_SIGNATURE' => $settings['del_signature'], 'L_BH_MOVE_GROUP' => !empty($group_name) ? sprintf($this->user->lang['BH_MOVE_GROUP'], $group_name) : '', 'S_BH_SFS' => !empty($settings['sfs_api_key']) && $curl_exists ? true : false, 'S_SHOW_BH' => true, 'U_HAMMERBAN' => append_sid($this->root_path . 'memberlist.' . $this->php_ext, $params))); return; } // Time to ban a user. But are you sure? if (!confirm_box(true)) { $hidden_fields = array('ban_email' => $this->request->variable('ban_email', 0), 'ban_ip' => $this->request->variable('ban_ip', 0), 'bh_reason' => $this->request->variable('bh_reason', '', true), 'bh_reason_user' => $this->request->variable('bh_reason_user', '', true), 'del_avatar' => $this->request->variable('del_avatar', 0), 'del_privmsgs' => $this->request->variable('del_privmsgs', 0), 'del_posts' => $this->request->variable('del_posts', 0), 'del_profile' => $this->request->variable('del_profile', 0), 'del_signature' => $this->request->variable('del_signature', 0), 'mode' => 'viewprofile', 'move_group' => $this->request->variable('move_group', 0), 'sfs_report' => $this->request->variable('sfs_report', 0)); $message = sprintf($this->user->lang['SURE_BAN'], $this->data['username']) . '<br /><br />'; $message .= $this->user->lang['THIS_WILL'] . '' . $this->user->lang['COLON'] . '<br />' . $this->user->lang['BH_BAN_USER'] . '<br />'; $message .= $hidden_fields['ban_email'] ? $this->user->lang['BH_BAN_EMAIL'] . '<br />' : ''; $message .= $hidden_fields['ban_ip'] ? $this->user->lang['BH_BAN_IP'] . '<br />' : ''; $message .= $hidden_fields['bh_reason'] ? sprintf($this->user->lang['BH_REASON'], $hidden_fields['bh_reason']) . '<br />' : ''; $message .= $hidden_fields['bh_reason_user'] ? sprintf($this->user->lang['BH_REASON_USER'], $hidden_fields['bh_reason_user']) . '<br />' : ''; $message .= $hidden_fields['del_avatar'] ? $this->user->lang['BH_DEL_AVATAR'] . '<br />' : ''; $message .= $hidden_fields['del_privmsgs'] ? $this->user->lang['BH_DEL_PRIVMSGS'] . '<br />' : ''; $message .= $hidden_fields['del_posts'] ? $this->user->lang['BH_DEL_POSTS'] . '<br />' : ''; $message .= $hidden_fields['del_profile'] ? $this->user->lang['BH_DEL_PROFILE'] . '<br />' : ''; $message .= $hidden_fields['del_signature'] ? $this->user->lang['BH_DEL_SIGNATURE'] . '<br />' : ''; $message .= !empty($group_name) && $hidden_fields['move_group'] ? sprintf($this->user->lang['BH_MOVE_GROUP'], $group_name) . '<br />' : ''; $message .= $hidden_fields['sfs_report'] && $curl_exists ? $this->user->lang['BH_SUBMIT_SFS'] . '<br />' : ''; confirm_box(false, $message, build_hidden_fields($hidden_fields)); } // We have a user to ban. $error = array(); // Any reason for this ban? $bh_reason = $this->request->variable('bh_reason', '', true); $bh_reason_user = $this->request->variable('bh_reason_user', '', true); // The username is the user so it's always banned. $success = user_ban('user', $this->data['username'], 0, '', false, $bh_reason, $bh_reason_user); if (!$success) { $error[] = 'ERROR_BAN_USER'; } if ($this->request->variable('ban_email', 0)) { $success = user_ban('email', $this->data['user_email'], 0, '', false, $bh_reason, $bh_reason_user); if (!$success) { $error[] = 'ERROR_BAN_EMAIL'; } } if ($this->request->variable('ban_ip', 0) && !empty($this->data['user_ip'])) { $success = user_ban('ip', $this->data['user_ip'], 0, '', false, $bh_reason, $bh_reason_user); if (!$success) { $error[] = 'ERROR_BAN_IP'; } } if ($this->request->variable('del_posts', 0)) { $this->bh_del_posts(); } if ($this->request->variable('del_privmsgs', 0)) { $this->bh_del_privmsgs(); } if ($this->request->variable('del_avatar', 0)) { avatar_delete('user', $this->data, true); } if ($this->request->variable('del_signature', 0)) { $sql = 'UPDATE ' . USERS_TABLE . "\n\t\t\t\t\tSET user_sig = '',\n\t\t\t\t\t\tuser_sig_bbcode_uid = '',\n\t\t\t\t\t\tuser_sig_bbcode_bitfield = ''\n\t\t\t\t\tWHERE user_id = " . $this->user_id; $this->db->sql_query($sql); } if ($this->request->variable('del_profile', 0)) { $sql = 'DELETE FROM ' . PROFILE_FIELDS_DATA_TABLE . ' WHERE user_id = ' . $this->user_id; $this->db->sql_query($sql); } if ($this->request->variable('move_group', 0) && !empty($group_name)) { $return = group_user_add($settings['group_id'], array($this->user_id), array($this->data['username']), $group_name, true); if ($return != false) { $error[] = $this->user->lang['ERROR_MOVE_GROUP']; } } if ($this->request->variable('sfs_report', 0) && !empty($settings['sfs_api_key']) && $curl_exists) { // add the spammer to the SFS database $http_request = 'http://www.stopforumspam.com/add.php'; $http_request .= '?username='******'username']; $http_request .= '&ip_addr=' . $this->data['user_ip']; $http_request .= '&email=' . $this->data['user_email']; $http_request .= '&api_key=' . $settings['sfs_api_key']; $response = $this->get_file($http_request); if (!$response) { $error[] = $this->user->lang['ERROR_SFS']; } } // Need to purge the cache. $this->cache->purge(); // The page needs to be reloaded to show the new banned status. $args = array('mode' => 'viewprofile', 'u' => $this->user_id, 'bh_res' => empty($error) ? 'success' : urlencode(implode('+', $error))); $url = generate_board_url(); $url .= (substr($url, -1) == '/' ? '' : '/') . 'memberlist.' . $this->php_ext; $url = append_sid($url, $args); redirect($url); }
private function add_sender($action) { include_once $this->phpbb_root_path . 'includes/ucp/ucp_pm_compose.' . $this->php_ext; include_once $this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext; $this->user->add_lang(array('viewtopic')); $this->user->add_lang(array('ucp')); if (!$this->auth->acl_get('u_sendpm')) { $this->error[] = array('error' => $this->user->lang['NO_AUTH_SEND_MESSAGE']); return; } add_form_key('ucp_pm_compose'); // Grab only parameters needed here $this->address_list = $this->request->variable('address_list', array('' => array(0 => ''))); //already exist recipients don't need to check permission $this->user_list = array(); $usernames = array(); $username_list = $this->request->variable('username_list', '', true); $message = ''; #region AddUsers if ($username_list) { $usernames = array_unique(explode("\n", $username_list)); if (sizeof($usernames)) { $user_id_ary = array(); user_get_id_name($user_id_ary, $usernames, array(USER_NORMAL, USER_FOUNDER, USER_INACTIVE)); $this->user_list = $this->get_user_list($usernames); if (sizeof($this->user_list) < sizeof($usernames)) { //find non-existing users foreach ($usernames as $username) { if (!$this->is_user_exists($username, $this->user_list)) { $message .= sprintf($this->user->lang['NO_SUCH_USER'] . '<br />', $username); } } } if (sizeof($this->user_list)) { // Now, make sure that new users not exist in address_list ;) foreach ($this->user_list as $key => $user) { if (isset($this->address_list['u'][$user['user_id']])) { //user already recipient (don't need add and check it) $message .= sprintf($this->user->lang['PMAJAX_USER_ALREADY_RECIPIENT'] . '<br />', $user['username']); $user_id_ary = array_diff($user_id_ary, array($user['user_id'])); //remove ids of duplicate recipients unset($this->user_list[$key]); } } if (sizeof($user_id_ary)) { // Check for disallowed recipients $can_ignore_allow_pm = $this->auth->acl_gets('a_', 'm_') || $this->auth->acl_getf_global('m_'); // Administrator deactivated users check and we need to check their // PM status (do they want to receive PM's?) // Only check PM status if not a moderator or admin, since they // are allowed to override this user setting $sql = 'SELECT user_id, username, user_allow_pm FROM ' . USERS_TABLE . ' WHERE ' . $this->db->sql_in_set('user_id', $user_id_ary) . ' AND ( (user_type = ' . USER_INACTIVE . ' AND user_inactive_reason = ' . INACTIVE_MANUAL . ') ' . ($can_ignore_allow_pm ? '' : ' OR user_allow_pm = 0') . ' )'; $result = $this->db->sql_query($sql); $removed_no_pm = $removed_no_permission = false; while ($row = $this->db->sql_fetchrow($result)) { if (!$can_ignore_allow_pm && !$row['user_allow_pm']) { $username = $this->remove_user_from_user_list($row['user_id']); $message .= sprintf($this->user->lang['PMAJAX_USER_REMOVED_NO_PM'] . '<br />', $username); } else { $username = $this->remove_user_from_user_list($row['user_id']); $message .= sprintf($this->user->lang['PMAJAX_USER_REMOVED_NO_PERMISSION'] . '<br />', $username); } $user_id_ary = array_diff($user_id_ary, array($row['user_id'])); //remove id for this user } $this->db->sql_freeresult($result); } //sizeof($user_id_ary)) if (sizeof($user_id_ary)) { // Check if users have permission to read PMs $can_read = $this->auth->acl_get_list($user_id_ary, 'u_readpm'); $can_read = empty($can_read) || !isset($can_read[0]['u_readpm']) ? array() : $can_read[0]['u_readpm']; $cannot_read_list = array_diff($user_id_ary, $can_read); if (!empty($cannot_read_list)) { foreach ($cannot_read_list as $cannot_read) { $username = $this->remove_user_from_user_list($cannot_read); $user_id_ary = array_diff($user_id_ary, $cannot_read); //remove id for this user $message .= sprintf($this->user->lang['PMAJAX_USER_REMOVED_NO_PERMISSION'] . '<br />', $username); } } } if (sizeof($user_id_ary)) { // Check if users are banned $banned_user_list = phpbb_get_banned_user_ids($user_id_ary, false); if (!empty($banned_user_list)) { foreach ($banned_user_list as $banned_user) { $username = $this->remove_user_from_user_list($banned_user); $user_id_ary = array_diff($user_id_ary, $cannot_read); //remove id for this user $message .= sprintf($this->user->lang['PMAJAX_USER_REMOVED_NO_PERMISSION'] . '<br />', $username); } } } } //sizeof($this->user_list } } #endregion $group_list = $this->request->variable('group_list', array(0)); $this->group_list = array(); #region AddGroups // Check mass pm to group permission if (sizeof($group_list) && (!$this->config['allow_mass_pm'] || !$this->auth->acl_get('u_masspm_group'))) { $message .= $this->user->lang['NO_AUTH_GROUP_MESSAGE'] . '<br />'; $group_list = array(); } if (sizeof($group_list)) { $sql = 'SELECT g.group_id AS id, g.group_name AS name, g.group_colour AS colour, g.group_type FROM ' . GROUPS_TABLE . ' g'; if (!$this->auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) { $sql .= ' LEFT JOIN ' . USER_GROUP_TABLE . ' ug ON ( g.group_id = ug.group_id AND ug.user_id = ' . $user->data['user_id'] . ' AND ug.user_pending = 0 ) WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $this->user->data['user_id'] . ')'; } $sql .= $this->auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel') ? ' WHERE ' : ' AND '; $sql .= 'g.group_receive_pm = 1 AND ' . $this->db->sql_in_set('g.group_id', $group_list) . ' ORDER BY g.group_name ASC'; $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { $row['name'] = $row['group_type'] == GROUP_SPECIAL ? $this->user->lang['G_' . $row['name']] : $row['name']; // Now, make sure that group not exist in address_list if (isset($this->address_list['g'][$row['id']])) { $message .= sprintf($this->user->lang['PMAJAX_GROUP_ALREADY_RECIPIENT'] . '<br />', $row['name']); } else { $this->group_list[] = $row; } } $this->db->sql_freeresult($result); } #endregion #region Handle num recipients $num_recipients = sizeof($this->user_list); $pm_action = $this->request->variable('action', ''); $reply_to_all = $this->request->variable('reply_to_all', 0); if (sizeof($this->user_list) + sizeof($this->group_list)) { // Get maximum number of allowed recipients $sql = 'SELECT MAX(g.group_max_recipients) as max_recipients FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug WHERE ug.user_id = ' . $this->user->data['user_id'] . ' AND ug.user_pending = 0 AND ug.group_id = g.group_id'; $result = $this->db->sql_query($sql); $max_recipients = (int) $this->db->sql_fetchfield('max_recipients'); $this->db->sql_freeresult($result); $max_recipients = !$max_recipients ? $this->config['pm_max_recipients'] : $max_recipients; // If this is a quote/reply "to all"... we may increase the max_recpients to the number of original recipients if (($pm_action == 'reply' || $pm_action == 'quote') && $max_recipients && $reply_to_all) { $max_recipients = $max_recipients < sizeof($this->address_list['u']) ? sizeof($this->address_list['u']) : $max_recipients; } // Check for too many recipients $num_recipients_exist = !empty($this->address_list['u']) ? sizeof($this->address_list['u']) : 0; if ($max_recipients && $num_recipients_exist + $num_recipients > $max_recipients) { $this->error[] = array('error' => $this->user->lang('PMAJAX_TOO_MANY_RECIPIENTS', $max_recipients)); return; } // Check mass pm to users permission if ((!$this->config['allow_mass_pm'] || !$this->auth->acl_get('u_masspm')) && $num_recipients + $num_recipients_exist > 1) { $this->error[] = array('error' => $this->user->lang('PMAJAX_TOO_MANY_RECIPIENTS', $max_recipients)); return; } } #endregion $add_to = $action == "add_to" ? true : false; $add_bcc = $action == "add_bcc" ? true : false; $type = $add_to ? 'to' : 'bcc'; //build output $recipient_u = array(); $recipient_g = array(); foreach ($this->user_list as $user) { $view_path = get_username_string('profile', $user['user_id'], $user['username'], $user['colour']); $view_path = str_replace('../', '', $view_path); $name_full = get_username_string('full', $user['user_id'], $user['username'], $user['colour']); $name_full = str_replace('../', '', $name_full); $row = array('UG_ID' => $user['user_id'], 'NAME' => $user['username'], 'COLOUR' => $user['colour'] ? '#' . $user['colour'] : '', 'NAME_FULL' => $name_full); $recipient_u[] = $row; } $recipient_g = array(); foreach ($this->group_list as $group) { $view_path = append_sid("{$this->phpbb_root_path}memberlist.{$this->php_ext}", 'mode=group&g=' . $group['id']); $view_path = str_replace('../', '', $view_path); $row = array('UG_ID' => $group['id'], 'NAME' => $group['name'], 'COLOUR' => $group['colour'] ? '#' . $group['colour'] : '#0000FF', 'U_VIEW' => $view_path); $recipient_g[] = $row; } $this->return = array('RECIPIENT_U_LIST' => $recipient_u, 'RECIPIENT_G_LIST' => $recipient_g, 'NUM_RECIPIENTS' => sizeof($recipient_u) + sizeof($recipient_g), 'MESSAGE' => $message); }