From 406c062a3c126e23f55a49413135a73ab2822bc1 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 30 Jan 2019 13:29:46 +0100 Subject: [PATCH] WIP messages, usable Former-commit-id: 79e0b38fe7499642480505aac088ef8b45b04714 --- .../include/functions_messages.php | 229 ++++----- .../include/functions_notifications.php | 57 ++- .../operation/messages/message_edit.php | 458 ++++++++++++------ .../operation/messages/message_list.php | 11 +- 4 files changed, 463 insertions(+), 292 deletions(-) diff --git a/pandora_console/include/functions_messages.php b/pandora_console/include/functions_messages.php index 675b9c2a38..3d163825c3 100644 --- a/pandora_console/include/functions_messages.php +++ b/pandora_console/include/functions_messages.php @@ -33,33 +33,88 @@ require_once $config['homedir'].'/include/functions_groups.php'; require_once $config['homedir'].'/include/functions_notifications.php'; +/** + * Set targets for given messaje + * + * @param integer $message_id Message id. + * @param array $users An array with all target users. + * @param array $groups An array with all target groups. + * + * @return boolean Task status. + */ +function message_set_targets( + int $message_id, + array $users=null, + array $groups=null +) { + if (empty($message_id)) { + return false; + } + + if (is_array($users)) { + $values = []; + foreach ($users as $user) { + if (empty($user)) { + continue; + } + + $values['id_mensaje'] = $message_id; + $values['id_user'] = $user; + } + + if (!empty($values)) { + $ret = db_process_sql_insert('tnotification_user', $values); + if ($ret === false) { + return false; + } + } + } + + if (is_array($groups)) { + $values = []; + foreach ($groups as $group) { + if (empty($group)) { + continue; + } + + $values['id_mensaje'] = $message_id; + $values['id_group'] = $group; + } + + if (!empty($values)) { + $ret = db_process_sql_insert('tnotification_group', $values); + if ($ret === false) { + return false; + } + } + } + + return true; +} + + /** * Creates a private message to be forwarded to other people * - * @param string $usuario_origen The sender of the message. - * @param string $usuario_destino The receiver of the message. - * @param string $subject Subject of the message (much like E-Mail). - * @param string $mensaje The actual message. This message will be - * cleaned by io_safe_input (html is allowed but - * loose html chars will be translated). + * @param string $usuario_origen The sender of the message. + * @param array $target_users The receiver of the message. + * @param array $target_groups Target groups to be delivered. + * @param string $subject Subject of the message (much like E-Mail). + * @param string $mensaje The actual message. This message will be + * cleaned by io_safe_input (html is allowed but + * loose html chars will be translated). * * @return boolean true when delivered, false in case of error */ function messages_create_message( string $usuario_origen, - string $usuario_destino, + array $target_users, + array $target_groups, string $subject, string $mensaje ) { $users = users_get_info(); - if (!array_key_exists($usuario_origen, $users) - || !array_key_exists($usuario_destino, $users) - ) { - return false; - // Users don't exist so don't send to them. - } - // Create message. $message_id = db_process_sql_insert( 'tmensajes', @@ -75,13 +130,19 @@ function messages_create_message( // Update URL // Update targets. if ($message_id !== false) { - $return = db_process_sql_insert( - 'tnotification_user', - [ - 'id_mensaje' => $message_id, - 'id_user' => $usuario_destino, - ] + $ret = message_set_targets( + $message_id, + $target_users, + $target_groups ); + if ($ret === false) { + // Failed to deliver messages. Erase message and show error. + db_process_sql_delete( + 'tmensajes', + ['id_mensaje' => $message_id] + ); + return false; + } } if ($return === false) { @@ -92,65 +153,6 @@ function messages_create_message( } -/** - * Creates private messages to be forwarded to groups - * - * @param string $usuario_origen The sender of the message. - * @param string $dest_group The receivers (group) of the message. - * @param string $subject Subject of the message (much like E-Mail). - * @param string $mensaje The actual message. This message will be - * cleaned by io_safe_input (html is allowed but - * loose html chars will be translated). - * - * @return boolean true when delivered, false in case of error - */ -function messages_create_group( - string $usuario_origen, - string $dest_group, - string $subject, - string $mensaje -) { - $users = users_get_info(); - $group_users = groups_get_users($dest_group); - - if (! array_key_exists($usuario_origen, $users)) { - // Users don't exist in the system. - return false; - } else if (empty($group_users)) { - /* - There are no users in the group, so it hasn't failed - although it hasn't done anything. - */ - - return true; - } - - // Array unique. - foreach ($group_users as $user) { - foreach ($user as $key => $us) { - if ($key == 'id_user') { - $group_user[$us] = $us; - } - } - } - - foreach ($group_user as $user) { - $return = messages_create_message( - $usuario_origen, - get_user_id($user), - $subject, - $mensaje - ); - if ($return === false) { - // Error sending message. - return false; - } - } - - return true; -} - - /** * Deletes a private message * @@ -160,8 +162,6 @@ function messages_create_group( */ function messages_delete_message(int $id_message) { - global $config; - // 'id_usuario_destino' => $config["id_user"], $where = ['id_mensaje' => $id_message]; return (bool) db_process_sql_delete('tmensajes', $where); } @@ -208,10 +208,9 @@ function messages_get_message(int $message_id) global $config; $sql = sprintf( - "SELECT id_usuario_origen, id_usuario_destino, subject, mensaje, timestamp + 'SELECT * FROM tmensajes - WHERE id_usuario_destino='%s' AND id_mensaje=%d", - $config['id_user'], + WHERE id_mensaje=%d', $message_id ); $row = db_get_row_sql($sql); @@ -239,7 +238,7 @@ function messages_get_message_sent(int $message_id) global $config; $sql = sprintf( - "SELECT id_usuario_origen, id_usuario_destino, subject, mensaje, timestamp + "SELECT id_usuario_origen, subject, mensaje, timestamp FROM tmensajes WHERE id_usuario_origen='%s' AND id_mensaje=%d", $config['id_user'], @@ -251,6 +250,16 @@ function messages_get_message_sent(int $message_id) return false; } + $targets = get_notification_targets($message_id); + + $row['id_usuario_destino'] = implode( + ',', + $targets['users'] + ).implode( + ',', + $targets['groups'] + ); + return $row; } @@ -281,15 +290,15 @@ function messages_get_count( } $sql = sprintf( - "SELECT count(*) FROM tmensajes tm + "SELECT count(tm.id_mensaje) FROM tmensajes tm left join tnotification_user nu ON tm.id_mensaje=nu.id_mensaje + AND nu.id_user='%s' left join tnotification_group ng ON tm.id_mensaje=ng.id_mensaje left join tusuario_perfil up - ON tm.id_mensaje=ng.id_mensaje - AND ng.id_group=up.id_grupo - WHERE (nu.id_user='%s' OR ng.id_group=0 OR up.id_grupo=ng.id_group) + ON ng.id_group=up.id_grupo + AND (ng.id_group=0 OR up.id_grupo=ng.id_group) %s", $config['id_user'], $filter @@ -359,36 +368,21 @@ function messages_get_overview( } $sql = sprintf( - "SELECT * FROM tmensajes tm + "SELECT tm.* FROM tmensajes tm left join tnotification_user nu ON tm.id_mensaje=nu.id_mensaje + AND nu.id_user='%s' left join tnotification_group ng ON tm.id_mensaje=ng.id_mensaje left join tusuario_perfil up - ON tm.id_mensaje=ng.id_mensaje - AND ng.id_group=up.id_grupo - WHERE (nu.id_user='%s' OR ng.id_group=0 OR up.id_grupo=ng.id_group) + ON ng.id_group=up.id_grupo + AND (ng.id_group=0 OR up.id_grupo=ng.id_group) ORDER BY %s", $config['id_user'], $order ); - $result = []; - $return = db_get_all_rows_sql($sql); - - if ($return === false) { - return $result; - } - - foreach ($return as $message) { - $id_message = $message['id_mensaje']; - $result[$id_message]['sender'] = $message['id_usuario_origen']; - $result[$id_message]['subject'] = $message['subject']; - $result[$id_message]['timestamp'] = $message['timestamp']; - $result[$id_message]['status'] = $message['estado']; - } - - return $result; + return db_get_all_rows_sql($sql); } @@ -427,25 +421,10 @@ function messages_get_overview_sent( $order .= ' DESC'; } - $result = []; - $return = db_get_all_rows_field_filter( + return db_get_all_rows_field_filter( 'tmensajes', 'id_usuario_origen', $config['id_user'], $order ); - - if ($return === false) { - return $result; - } - - foreach ($return as $message) { - $id_message = $message['id_mensaje']; - $result[$id_message]['dest'] = $message['id_usuario_destino']; - $result[$id_message]['subject'] = $message['subject']; - $result[$id_message]['timestamp'] = $message['timestamp']; - $result[$id_message]['status'] = $message['estado']; - } - - return $result; } diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 8372f54bf0..03f0b07963 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -1,10 +1,9 @@ [], + 'groups' => [], + ]; + + if (empty($id_message)) { + return $targets; + } + + $ret = db_get_all_rows_sql( + sprintf( + 'SELECT id_user + FROM tnotification_user nu + WHERE nu.id_mensaje = %d', + $id_message + ) + ); + + if (is_array($ret)) { + foreach ($ret as $row) { + array_push($targets['users'], $row['id_user']); + } + } + + $ret = $targets['groups'] = db_get_all_rows_sql( + sprintf( + 'SELECT id_group + FROM tnotification_group ng + WHERE ng.id_mensaje = %d', + $id_message + ) + ); + + if (is_array($ret)) { + foreach ($ret as $row) { + array_push($targets['groups'], $row['id_group']); + } + } + + return $targets; +} diff --git a/pandora_console/operation/messages/message_edit.php b/pandora_console/operation/messages/message_edit.php index 5df20ce9fe..a92abc19e8 100644 --- a/pandora_console/operation/messages/message_edit.php +++ b/pandora_console/operation/messages/message_edit.php @@ -1,26 +1,39 @@ false, - 'text' => '' . - html_print_image("images/email_inbox.png", true, array ("title" => __('Received messages'))) .''); +$buttons['message_list'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/email_inbox.png', + true, + ['title' => __('Received messages')] + ).'', +]; -$buttons['sent_messages'] = array('active' => false, - 'text' => '' . - html_print_image("images/email_outbox.png", true, array ("title" => __('Sent messages'))) .''); +$buttons['sent_messages'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/email_outbox.png', + true, + ['title' => __('Sent messages')] + ).'', +]; -$buttons['create_message'] = array('active' => true, - 'text' => '' . - html_print_image("images/new_message.png", true, array ("title" => __('Create message'))) .''); +$buttons['create_message'] = [ + 'active' => true, + 'text' => ''.html_print_image( + 'images/new_message.png', + true, + ['title' => __('Create message')] + ).'', +]; -// Header -ui_print_page_header (__('Messages'), "images/email_mc.png", false, "", false, $buttons); +// Header. +ui_print_page_header( + __('Messages'), + 'images/email_mc.png', + false, + '', + false, + $buttons +); -//read a message +// Read a message. if ($read_message) { - $message_id = (int) get_parameter ("id_message"); - if ($show_sent) { - $message = messages_get_message_sent ($message_id); - } - else { - $message = messages_get_message ($message_id); - messages_process_read ($message_id); - } - - if ($message == false) { - echo '
'.__('This message does not exist in the system').'
'; - return; //Move out of this page and go processing other pages - } - - $user_name = get_user_fullname ($message["id_usuario_origen"]); - if (!$user_name) { - $user_name = $message["id_usuario_origen"]; - } - - $dst_name = get_user_fullname ($message["id_usuario_destino"]); - if (!$dst_name) { - $dst_name = $message["id_usuario_destino"]; - } - - $table = new stdClass(); - $table->width = '100%'; - $table->class = 'databox filters'; - $table->data = array(); - - $table->data[0][0] = __('Sender'); - $table->data[0][1] = $user_name.' '.__('at').' ' . ui_print_timestamp ($message["timestamp"], true, array ("prominent" => "timestamp")); - - $table->data[1][0] = __('Destination'); - $table->data[1][1] = $dst_name; - - $table->data[2][0] = __('Subject'); - $table->data[2][1] = html_print_input_text_extended ("subject", $message["subject"], 'text-subject', '', 50, 70, true, false, '', 'readonly'); - - $order = array("\r\n", "\n", "\r"); - $replace = '
'; - $parsed_message = str_replace($order, $replace, $message["mensaje"]); - - $table->data[3][0] = __('Message'); - $table->data[3][1] = html_print_textarea ("message", 15, 255, $message["mensaje"], 'readonly', true); - - //Prevent RE: RE: RE: - if (strstr ($message["subject"], "RE:")) { - $new_subj = $message["subject"]; - } - else { - $new_subj = "RE: ".$message["subject"]; - } - - //Start the message much like an e-mail reply - $new_msg = "\n\n\nOn ".date ($config["date_format"], $message["timestamp"]).' '.$user_name.' '.__('wrote').":\n\n".$message["mensaje"]; - - echo '
'; - html_print_table($table); - echo "
"; - - echo '
'; - html_print_input_hidden ("dst_user", $message["id_usuario_origen"]); - html_print_input_hidden ("subject", $new_subj); - html_print_input_hidden ("message", $new_msg); - html_print_input_hidden ("orig_user", $message["id_usuario_destino"]); - echo '
'; + $message_id = (int) get_parameter('id_message'); + if ($show_sent) { + $message = messages_get_message_sent($message_id); + } else { + $message = messages_get_message($message_id); + messages_process_read($message_id); + } - echo "
"; - html_print_submit_button(__('Delete'), 'delete_btn', false, 'form="delete_message" class="sub delete"'); - echo " "; - html_print_submit_button (__('Reply'), 'reply', false, 'form="reply_message" class="sub next"'); - echo "
"; - - return; + if ($message == false) { + echo '
'.__('This message does not exist in the system').'
'; + return; + // Move out of this page and go processing other pages. + } + + $user_name = get_user_fullname($message['id_usuario_origen']); + if (!$user_name) { + $user_name = $message['id_usuario_origen']; + } + + $dst_name = get_user_fullname($message['id_usuario_destino']); + if (!$dst_name) { + $dst_name = $message['id_usuario_destino']; + } + + $table = new stdClass(); + $table->width = '100%'; + $table->class = 'databox filters'; + $table->data = []; + + $table->data[0][0] = __('Sender'); + $table->data[0][1] = $user_name.' '.__('at').' '.ui_print_timestamp( + $message['timestamp'], + true, + ['prominent' => 'timestamp'] + ); + + $table->data[1][0] = __('Destination'); + $table->data[1][1] = $dst_name; + + $table->data[2][0] = __('Subject'); + $table->data[2][1] = html_print_input_text_extended( + 'subject', + $message['subject'], + 'text-subject', + '', + 50, + 70, + true, + false, + '', + 'readonly' + ); + + $order = [ + "\r\n", + "\n", + "\r", + ]; + $replace = '
'; + $parsed_message = str_replace($order, $replace, $message['mensaje']); + + $table->data[3][0] = __('Message'); + $table->data[3][1] = html_print_textarea( + 'message', + 15, + 255, + $message['mensaje'], + 'readonly', + true + ); + + // Prevent RE: RE: RE:. + if (strstr($message['subject'], 'RE:')) { + $new_subj = $message['subject']; + } else { + $new_subj = 'RE: '.$message['subject']; + } + + // Start the message much like an e-mail reply. + $new_msg = "\n\n\nOn ".date( + $config['date_format'], + $message['timestamp'] + ).' '.$user_name.' '.__('wrote').":\n\n".$message['mensaje']; + + echo '
'; + html_print_table($table); + echo '
'; + + echo '
'; + html_print_input_hidden('dst_user', $message['id_usuario_origen']); + html_print_input_hidden('subject', $new_subj); + html_print_input_hidden('message', $new_msg); + html_print_input_hidden('orig_user', $message['id_usuario_destino']); + echo '
'; + + echo "
"; + html_print_submit_button( + __('Delete'), + 'delete_btn', + false, + 'form="delete_message" class="sub delete"' + ); + echo ' '; + html_print_submit_button( + __('Reply'), + 'reply', + false, + 'form="reply_message" class="sub next"' + ); + echo '
'; + + return; } -// Create message (destination user) -if (($new_msg) && (!empty ($dst_user)) && (!$reply)) { - $return = messages_create_message ($config["id_user"], $dst_user, $subject, $message); - - $user_name = get_user_fullname ($dst_user); - if (!$user_name) { - $user_name = $dst_user; - } - - ui_print_result_message ($return, - __('Message successfully sent to user %s', $user_name), - __('Error sending message to user %s', $user_name)); +// Create message (destination user). +if (($new_msg) && (!empty($dst_user)) && (!$reply)) { + $return = messages_create_message( + $config['id_user'], + [$dst_user], + [], + $subject, + $message + ); + + $user_name = get_user_fullname($dst_user); + if (!$user_name) { + $user_name = $dst_user; + } + + ui_print_result_message( + $return, + __('Message successfully sent to user %s', $user_name), + __('Error sending message to user %s', $user_name) + ); } -// Create message (destination group) -if (($new_msg) && ($dst_group!='') && (!$reply)) { - $return = messages_create_group ($config["id_user"], $dst_group, $subject, $message); - - ui_print_result_message ($return, - __('Message successfully sent'), - __('Error sending message to group %s', groups_get_name ($dst_group))); +// Create message (destination group). +if (($new_msg) && ($dst_group != '') && (!$reply)) { + $return = messages_create_message( + $config['id_user'], + [], + [$dst_group], + $subject, + $message + ); + + ui_print_result_message( + $return, + __('Message successfully sent'), + __('Error sending message to group %s', groups_get_name($dst_group)) + ); } -//message creation form - -//user info -$own_info = get_user_info ($config['id_user']); +// Message creation form. +// User info. +$own_info = get_user_info($config['id_user']); $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; -$table->data = array(); +$table->data = []; $table->data[0][0] = __('Sender'); if (!empty($own_info['fullname'])) { - $table->data[0][1] = $own_info['fullname']; -} -else { - $table->data[0][1] = $config['id_user']; + $table->data[0][1] = $own_info['fullname']; +} else { + $table->data[0][1] = $config['id_user']; } $table->data[1][0] = __('Destination'); -$is_admin = (bool)db_get_value('is_admin', 'tusuario', 'id_user', $config['id_user']); +$is_admin = (bool) db_get_value( + 'is_admin', + 'tusuario', + 'id_user', + $config['id_user'] +); if ($is_admin) { - $users_full = db_get_all_rows_filter('tusuario', array(), array('id_user', 'fullname')); -} -else { - $users_full = groups_get_users (array_keys(users_get_groups()), false, false); + $users_full = db_get_all_rows_filter( + 'tusuario', + [], + [ + 'id_user', + 'fullname', + ] + ); +} else { + $users_full = groups_get_users( + array_keys(users_get_groups()), + false, + false + ); } -$users = array(); +$users = []; foreach ($users_full as $user_id => $user_info) { - $users[$user_info['id_user']] = $user_info['fullname']; + $users[$user_info['id_user']] = $user_info['fullname']; } -//Check if the user to reply is in the list, if not add reply user +// Check if the user to reply is in the list, if not add reply user. if ($reply) { - if (!array_key_exists($dst_user, $users)) { - //Add the user to reply - $user_reply = db_get_row('tusuario', 'id_user', $dst_user); - $users[$user_reply['id_user']] = $user_reply['fullname']; - } + if (!array_key_exists($dst_user, $users)) { + // Add the user to reply. + $user_reply = db_get_row('tusuario', 'id_user', $dst_user); + $users[$user_reply['id_user']] = $user_reply['fullname']; + } } -if ($own_info['is_admin'] || check_acl ($config['id_user'], 0, "PM")) - $return_all_groups = true; -else - $return_all_groups = false; +if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) { + $return_all_groups = true; +} else { + $return_all_groups = false; +} -$groups = users_get_groups ($config["id_user"], "AR"); //Get a list of all groups - -$table->data[1][1] = html_print_select ($users, "dst_user", $dst_user, '', __('Select user'), false, true, false, '', false); +$groups = users_get_groups($config['id_user'], 'AR'); +// Get a list of all groups. +$table->data[1][1] = html_print_select( + $users, + 'dst_user', + $dst_user, + '', + __('Select user'), + false, + true, + false, + '', + false +); $table->data[1][1] .= '  '.__('OR').'  '; -$table->data[1][1] .= html_print_select_groups($config['id_user'], "AR", $return_all_groups, 'dst_group', $dst_group, '', __('Select group'), '', true); +$table->data[1][1] .= html_print_select_groups( + $config['id_user'], + 'AR', + $return_all_groups, + 'dst_group', + $dst_group, + '', + __('Select group'), + '', + true +); $table->data[2][0] = __('Subject'); -$table->data[2][1] = html_print_input_text ("subject", $subject, '', 50, 70, true); +$table->data[2][1] = html_print_input_text( + 'subject', + $subject, + '', + 50, + 70, + true +); $table->data[3][0] = __('Message'); -$table->data[3][1] = html_print_textarea ("message", 15, 255, $message, '', true); +$table->data[3][1] = html_print_textarea( + 'message', + 15, + 255, + $message, + '', + true +); echo '
'; html_print_table($table); echo '
'; - html_print_submit_button (__('Send message'), 'send_mes', false, 'class="sub wand"'); -echo ''; -echo '
'; -?> + html_print_submit_button( + __('Send message'), + 'send_mes', + false, + 'class="sub wand"' + ); + echo ''; + echo ''; diff --git a/pandora_console/operation/messages/message_list.php b/pandora_console/operation/messages/message_list.php index d0ebb09cb3..49ecfe14dd 100644 --- a/pandora_console/operation/messages/message_list.php +++ b/pandora_console/operation/messages/message_list.php @@ -88,13 +88,10 @@ if ($delete_msg) { } if ($multiple_delete) { - $ids = (array) get_parameter('delete_multiple', []); + $ids = (array) get_parameter('delete_multiple_messages', []); foreach ($ids as $id) { - $result = db_process_sql_delete( - 'tmensajes', - ['id_mensaje' => $id] - ); + $result = messages_delete_message($id); if ($result === false) { break; @@ -166,7 +163,9 @@ if (empty($messages)) { $table->head[3] = __('Timestamp'); $table->head[4] = __('Delete').html_print_checkbox('all_delete_messages', 0, false, true, false); - foreach ($messages as $message_id => $message) { + + foreach ($messages as $message) { + $message_id = $message['id_mensaje']; $data = []; $data[0] = ''; if ($message['status'] == 1) {